Zend \ Mail忽略复制收件人(BCC或CC)

时间:2018-01-18 10:16:34

标签: php zend-framework zend-framework2 zend-framework3 zend-mail

尝试向Zend\MailBCC个收件人发送CC邮件时,只有列表中的第一个收件人才会收到该电子邮件。多个普通收件人都不是问题。

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

使用setBcc对象的addBccMessage并没有什么区别。

1 个答案:

答案 0 :(得分:2)

问题

问题属于Zend\Mail标头生成的错误格式。它在所有line-breaksCC收件人之间使用BCC。正如this post中所述,解决方法是修复折叠。

例如,此代码段:

$mail = new Mail\Message();
$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最好的方法是自己的Header类,因为换行符在Zend \ Mail中是硬编码的。

解决方案

只需将\Zend\Mail\Header\Bcc类复制到您的模块并覆盖其中的getFieldValue函数即可。通过这种方法,您将来可以保持兼容更新。

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

现在,收件人将通过新的标题类传递给Message对象。

$bcc = new \MyModule\Header\Bcc();
$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

有关问题和解决方案的更多详细信息,请take a look to the original post