diff --git a/plugins/bc-mail/src/Mailer/MailMessageMailer.php b/plugins/bc-mail/src/Mailer/MailMessageMailer.php index 2b1e3de397..2e3a7c017d 100644 --- a/plugins/bc-mail/src/Mailer/MailMessageMailer.php +++ b/plugins/bc-mail/src/Mailer/MailMessageMailer.php @@ -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) @@ -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) { @@ -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) @@ -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]; + } + } diff --git a/plugins/bc-mail/tests/TestCase/Mailer/MailMessageMailerTest.php b/plugins/bc-mail/tests/TestCase/Mailer/MailMessageMailerTest.php index b10d606ded..ae650383d3 100644 --- a/plugins/bc-mail/tests/TestCase/Mailer/MailMessageMailerTest.php +++ b/plugins/bc-mail/tests/TestCase/Mailer/MailMessageMailerTest.php @@ -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, + [], + [] + ); + + //戻り値を確認 + $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 @@ -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()); @@ -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 */