Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 25 additions & 15 deletions plugins/bc-mail/src/Mailer/MailMessageMailer.php
Original file line number Diff line number Diff line change
Expand Up @@ -49,13 +49,9 @@ public function sendFormToAdmin(
$options = array_merge([
'toAdmin' => [],
], $options);
if (strpos($adminMail, ',') !== false) {
[$fromAdmin] = explode(',', $adminMail);
} else {
$fromAdmin = $adminMail;
}
[$fromAdmin, $toAdmin] = $this->parseAndNormalizeMailAddresses($adminMail);
$data['other']['mode'] = 'admin';
$this->setTo($adminMail)
$this->setTo($toAdmin)
->setFrom($fromAdmin, $this->getFrom($mailContent))
->setSubject($mailContent->subject_admin)
->setAttachments($attachments)
Expand All @@ -66,9 +62,10 @@ public function sendFormToAdmin(
if($mailContent->sender_2) {
$this->setBcc(strpos($mailContent->sender_2, ',') === false? $mailContent->sender_2: explode(',', $mailContent->sender_2));
}
if($userMail) {
// カンマ区切りで複数設定されていた場合先頭のアドレスをreplayToに利用
$this->setReplyTo(strpos($userMail, ',') === false? $userMail : strstr($userMail, ',', true));
[$replyToUser] = $this->parseAndNormalizeMailAddresses($userMail);
if($replyToUser) {
// カンマ区切りで複数設定されていた場合先頭のアドレスをreplyToに利用
$this->setReplyTo($replyToUser);
}
if (empty($options['toAdmin'])) return;
foreach($options['toAdmin'] as $key => $value) {
Expand Down Expand Up @@ -101,13 +98,10 @@ public function sendFormToUser(
$options = array_merge([
'toUser' => [],
], $options);
if (strpos($adminMail, ',') !== false) {
[$fromAdmin] = explode(',', $adminMail);
} else {
$fromAdmin = $adminMail;
}
[$fromAdmin] = $this->parseAndNormalizeMailAddresses($adminMail);
[, $toUser] = $this->parseAndNormalizeMailAddresses($userMail);
$data['other']['mode'] = 'user';
$this->setTo($userMail)
$this->setTo($toUser)
->setFrom($fromAdmin, $this->getFrom($mailContent))
->setReplyTo($fromAdmin)
->setSubject($mailContent->subject_user)
Expand Down Expand Up @@ -139,4 +133,20 @@ public function getFrom(EntityInterface $mailContent) {
return $mailContent->content->site->display_name;
}

/**
* メールアドレス文字列を分割・正規化する
*
* @param string $mailAddresses
* @return array{0: string, 1: array}
*/
private function parseAndNormalizeMailAddresses(string $mailAddresses): array
{
$recipients = array_values(array_filter(
array_map('trim', explode(',', $mailAddresses)),
static fn($mail) => $mail !== ''
));
$primaryAddress = $recipients[0] ?? '';
return [$primaryAddress, $recipients];
}

}
118 changes: 117 additions & 1 deletion plugins/bc-mail/tests/TestCase/Mailer/MailMessageMailerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,85 @@ public function testSendFormToAdmin()
$this->assertEquals('fields test', $vars['mailFields']);
$this->assertEquals('admin', $vars['other']['mode']);
}
/**
* test sendFormToAdmin with comma separated admin mail
*/
public function testSendFormToAdminWithMultipleRecipients()
{
//準備
$data['message'] = 'message test';
$data['mailContent'] = 'content test';
$data['mailFields'] = 'fields test';
$mailContent = MailContentFactory::make([
'description' => 'description test',
'sender_1' => 'sender_1',
'sender_name' => 'name 111',
'subject_user' => 'subject_user 111',
'subject_admin' => 'subject_admin 111',
'form_template' => 'default',
'mail_template' => 'mail_default',
'redirect_url' => '/',
])->getEntity();

//テスト
$this->MailMessageMailer->sendFormToAdmin(
$mailContent,
'abc@example.com,def@example.com',
'abcUser@example.com',
$data,
[],
[]
);
Comment on lines +108 to +115

//戻り値を確認
$this->assertEquals([
'abc@example.com' => 'abc@example.com',
'def@example.com' => 'def@example.com',
], $this->MailMessageMailer->getTo());
$this->assertEquals(['abcUser@example.com' => 'abcUser@example.com'], $this->MailMessageMailer->getReplyTo());

$vars = $this->MailMessageMailer->viewBuilder()->getVars();
$this->assertEquals('admin', $vars['other']['mode']);
}

/**
* test sendFormToAdmin trims and filters empty addresses
*/
public function testSendFormToAdminTrimsAndFiltersRecipients()
{
//準備
$data['message'] = 'message test';
$data['mailContent'] = 'content test';
$data['mailFields'] = 'fields test';
$mailContent = MailContentFactory::make([
'description' => 'description test',
'sender_1' => 'sender_1',
'sender_name' => 'name 111',
'subject_user' => 'subject_user 111',
'subject_admin' => 'subject_admin 111',
'form_template' => 'default',
'mail_template' => 'mail_default',
'redirect_url' => '/',
])->getEntity();

//テスト
$this->MailMessageMailer->sendFormToAdmin(
$mailContent,
'abc@example.com, def@example.com,',
' abcUser@example.com, ',
$data,
[],
[]
);

//戻り値を確認
$this->assertEquals([
'abc@example.com' => 'abc@example.com',
'def@example.com' => 'def@example.com',
], $this->MailMessageMailer->getTo());
$this->assertEquals(['abcUser@example.com' => 'abcUser@example.com'], $this->MailMessageMailer->getReplyTo());
}


/**
* test sendFormToUser
Expand All @@ -106,7 +185,7 @@ public function testSendFormToUser()
])->getEntity();

//テスト
$this->MailMessageMailer->sendFormToUser($mailContent, 'abc@example.com', 'abcUser@example.com', $data, [], []);
$this->MailMessageMailer->sendFormToUser($mailContent, 'abc@example.com', 'abcUser@example.com', $data, []);

//戻り値を確認
$this->assertEquals(['abc@example.com' => 'abc@example.com'], $this->MailMessageMailer->getReplyTo());
Expand All @@ -119,6 +198,43 @@ public function testSendFormToUser()
$this->assertEquals('user', $vars['other']['mode']);
}

/**
* test sendFormToUser trims and filters empty addresses
*/
public function testSendFormToUserTrimsAndFiltersRecipients()
{
//準備
$data['message'] = 'message test';
$data['mailContent'] = 'content test';
$data['mailFields'] = 'fields test';
$mailContent = MailContentFactory::make([
'description' => 'description test',
'sender_1' => 'sender_1',
'sender_name' => 'name 111',
'subject_user' => 'subject_user 111',
'subject_admin' => 'subject_admin 111',
'form_template' => 'default',
'mail_template' => 'mail_default',
'redirect_url' => '/',
])->getEntity();

//テスト
$this->MailMessageMailer->sendFormToUser(
$mailContent,
'abc@example.com, def@example.com,',
'abcUser@example.com, defUser@example.com,',
$data,
[]
);

//戻り値を確認
$this->assertEquals(['abc@example.com' => 'abc@example.com'], $this->MailMessageMailer->getReplyTo());
$this->assertEquals([
'abcUser@example.com' => 'abcUser@example.com',
'defUser@example.com' => 'defUser@example.com',
], $this->MailMessageMailer->getTo());
}

/**
* test getFrom
*/
Expand Down
Loading