Zend\Mail 忽略抄送收件人(密件抄送或抄送)
Zend\Mail ignores copy recipients (BCC or CC)
当尝试将带有 Zend\Mail
的邮件发送给多个 BCC
或 CC
收件人时,只有列表中的第一个收件人会收到电子邮件。多个正常收件人不是问题。
$mail = new Mail\Message();
$mail->setBcc([
'bcc_recipient_one@example.com',
'bcc_recipient_two@example.com',
'bcc_recipient_three@example.com',
]);
使用 Message
对象的 setBcc
或 addBcc
没有区别。
问题
问题属于Zend\Mail
header代格式错误。它在所有 CC
或 BCC
收件人之间使用 line-breaks
。如 this post 中所述,解决方法是修复折叠。
例如,这个片段:
$mail = new Mail\Message();
$mail->setFrom('test@whosebug.com', 'Whosebug Tester');
$mail->addTo('email@whosebug.com', 'Whosebug Recipient');
$mail->setSubject('Whosebug Test');
$mail->setBcc(['bcc_one@so.com', 'bcc_two@so.com', 'bcc_three@so.com']);
将创建这样的 header:
Date: Wed, 18 Jan 2018 19:11:36 +0100
From: Whosebug Tester <test@whosebug.com>
To: email@whosebug.com
Subject: Whosebug Test
Bcc: bcc_one@so.com,
bcc_two@so.com,
bcc_three@so.com
至少对于某些服务器(如 Micrsoft Exchange)而言,问题是收件人之后的 line-breaks。要解决此问题,IMO 最好的方法是自己 Header class,因为 line-breaks 是 Zend\Mail.
中的 hard-coded
解决方案
只需将 \Zend\Mail\Header\Bcc
class 复制到您的模块并覆盖其中的 getFieldValue
函数。通过这种方法,您将在未来的更新中保持兼容。
public function getFieldValue($format = HeaderInterface::FORMAT_RAW)
{
$value = parent::getFieldValue($format);
return str_replace(Headers::FOLDING, ' ', $value);
}
收件人现在将由新的 header class 传递给 Message
object。
$bcc = new \MyModule\Header\Bcc();
$bcc->getAddressList()->addMany(['bcc_one@so.com', 'bcc_two@so.com', 'bcc_three@so.com']);
$mail->getHeaders()->addHeader($bcc);
就是这样,新的header会正确生成:
Date: Wed, 18 Jan 2018 19:11:36 +0100
From: Whosebug Tester <test@whosebug.com>
To: email@whosebug.com
Subject: Whosebug Test
Bcc: bcc_one@so.com, bcc_two@so.com, bcc_three@so.com
有关问题和解决方案的更多详细信息,take a look to the original post。
当尝试将带有 Zend\Mail
的邮件发送给多个 BCC
或 CC
收件人时,只有列表中的第一个收件人会收到电子邮件。多个正常收件人不是问题。
$mail = new Mail\Message();
$mail->setBcc([
'bcc_recipient_one@example.com',
'bcc_recipient_two@example.com',
'bcc_recipient_three@example.com',
]);
使用 Message
对象的 setBcc
或 addBcc
没有区别。
问题
问题属于Zend\Mail
header代格式错误。它在所有 CC
或 BCC
收件人之间使用 line-breaks
。如 this post 中所述,解决方法是修复折叠。
例如,这个片段:
$mail = new Mail\Message();
$mail->setFrom('test@whosebug.com', 'Whosebug Tester');
$mail->addTo('email@whosebug.com', 'Whosebug Recipient');
$mail->setSubject('Whosebug Test');
$mail->setBcc(['bcc_one@so.com', 'bcc_two@so.com', 'bcc_three@so.com']);
将创建这样的 header:
Date: Wed, 18 Jan 2018 19:11:36 +0100
From: Whosebug Tester <test@whosebug.com>
To: email@whosebug.com
Subject: Whosebug Test
Bcc: bcc_one@so.com,
bcc_two@so.com,
bcc_three@so.com
至少对于某些服务器(如 Micrsoft Exchange)而言,问题是收件人之后的 line-breaks。要解决此问题,IMO 最好的方法是自己 Header class,因为 line-breaks 是 Zend\Mail.
中的 hard-coded解决方案
只需将 \Zend\Mail\Header\Bcc
class 复制到您的模块并覆盖其中的 getFieldValue
函数。通过这种方法,您将在未来的更新中保持兼容。
public function getFieldValue($format = HeaderInterface::FORMAT_RAW)
{
$value = parent::getFieldValue($format);
return str_replace(Headers::FOLDING, ' ', $value);
}
收件人现在将由新的 header class 传递给 Message
object。
$bcc = new \MyModule\Header\Bcc();
$bcc->getAddressList()->addMany(['bcc_one@so.com', 'bcc_two@so.com', 'bcc_three@so.com']);
$mail->getHeaders()->addHeader($bcc);
就是这样,新的header会正确生成:
Date: Wed, 18 Jan 2018 19:11:36 +0100
From: Whosebug Tester <test@whosebug.com>
To: email@whosebug.com
Subject: Whosebug Test
Bcc: bcc_one@so.com, bcc_two@so.com, bcc_three@so.com
有关问题和解决方案的更多详细信息,take a look to the original post。