Zend\Mail 忽略副本收件人(密件抄送或抄送)



尝试向多个BCCCC收件人发送带有ZendMail的邮件时,只有列表中的第一个收件人会收到电子邮件。多个普通收件人不是问题。

$mail = new MailMessage();
$mail->setBcc([
'bcc_recipient_one@example.com',
'bcc_recipient_two@example.com',
'bcc_recipient_three@example.com',
]);

使用Message对象的setBccaddBcc没有区别。

问题

问题属于ZendMail标头生成的错误格式。它使用所有CCBCC收件人之间的line-breaks。如本文所述,解决方法是修复折叠。

例如,以下代码段:

$mail = new MailMessage();
$mail->setFrom('test@stackoverflow.com', 'Stackoverflow Tester');
$mail->addTo('email@stackoverflow.com', 'Stackoverflow  Recipient');
$mail->setSubject('Stackoverflow Test');
$mail->setBcc(['bcc_one@so.com', 'bcc_two@so.com', 'bcc_three@so.com']);

将创建这样的标头:

Date: Wed, 18 Jan 2018 19:11:36 +0100
From: Stackoverflow Tester <test@stackoverflow.com>
To: email@stackoverflow.com
Subject: Stackoverflow Test
Bcc: bcc_one@so.com,
bcc_two@so.com,
bcc_three@so.com

至少对于某些服务器(如Micrsoft Exchange),问题是收件人之后的换行符。要解决此问题,IMO 的最佳方法是使用自己的标头类,因为换行符在 Zend\Mail 中是硬编码的。

解决方案

只需将ZendMailHeaderBcc类复制到模块中并覆盖其中的getFieldValue函数即可。使用此方法,您将来可以保持更新的兼容性。

public function getFieldValue($format = HeaderInterface::FORMAT_RAW)
{
$value = parent::getFieldValue($format);
return str_replace(Headers::FOLDING, ' ', $value);
}

收件人现在将由新的标头类传递到Message对象。

$bcc = new MyModuleHeaderBcc();
$bcc->getAddressList()->addMany(['bcc_one@so.com', 'bcc_two@so.com', 'bcc_three@so.com']);
$mail->getHeaders()->addHeader($bcc);

就是这样,新标头将正确生成:

Date: Wed, 18 Jan 2018 19:11:36 +0100
From: Stackoverflow Tester <test@stackoverflow.com>
To: email@stackoverflow.com
Subject: Stackoverflow Test
Bcc: bcc_one@so.com, bcc_two@so.com, bcc_three@so.com

有关问题和解决方案的更多详细信息,请查看原始帖子。

相关内容

最新更新