You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP PEAR Mail组件发送带Bcc邮件重复收件问题排查与解决

PHP PEAR Mail组件密送邮件重复发送问题解决

初始实现逻辑

我尝试使用PHP PEAR的Mail组件发送带密送(Bcc)的邮件,常规Bcc发送可正常实现,但无法满足我的需求,可正常运行的代码如下:

$message = new Mail_mime(); 
$message->setTXTBody($_text); 
...
$body = $message->get();
$thisSubject = $subject;
if (isset($_POST['_cc_sender'])) {
    $extraheaders = array("Bcc"=>$from_email,
                          "From"=>$from_email,
                          "Subject"=>$thisSubject);
} else {
    $extraheaders = array("From"=>$from_email, "Subject"=>$thisSubject);
}
$headers  = $message->headers($extraheaders);
$mail_obj = Mail::factory("mail");
$mail_obj->send($to, $headers, $body);

上述代码中,邮件表单可通过设置_cc_sender参数让提交者收到邮件副本,但该实现会暴露$to目标收件人地址。

调整后出现的异常

为隐藏目标地址,我调整逻辑:将提交者设为公开收件人,目标收件人设为Bcc密送,调整后代码如下:

$message = new Mail_mime(); 
$message->setTXTBody($_text); 
...
$body = $message->get();
$thisSubject = $subject;
if (isset($_POST['_cc_sender'])) {
    $extraheaders = array("Bcc"=>$to,
                          "From"=>$from_email,
                          "Subject"=>$thisSubject);
    $send_to = $from_email;
} else {
    $extraheaders = array("From"=>$from_email, "Subject"=>$thisSubject);
    $send_to = $to;
}
$headers  = $message->headers($extraheaders);
$mail_obj = Mail::factory("mail");
$mail_obj->send($send_to, $headers, $body);

但调整后出现异常:$from_email提交者邮箱会收到两封相同邮件,其中一封符合Bcc特征,我的Thunderbird邮件过滤器会将其单独归类到子文件夹。
明确来说,原逻辑下提交者收到Bcc副本、目标收件人收到主邮件;切换Bcc收件人后,两封邮件都被发送到了提交者邮箱。
我将Bcc改为Cc测试,可见头部设置正确(收件人为$from_email,抄送为$to),但提交者依然会收到两封邮件。
我对所有可排查变量做了var_dumps输出,结果均符合预期。据我所知,收件人列表是在$mail_obj->send方法中设置的,该参数不会出现在var_dump输出中,因此一直找不到发信异常的原因。

根因与最终解决方案

后续我测试发现,将Mail::factory的驱动参数从"mail"改为"sendmail"后,重复邮件问题消失,仅会向$send_to地址发送一封邮件,说明问题出在mail驱动对邮件头的处理逻辑异常。
我查阅其他帖子得知,收件人列表和邮件头应当是分离的,该特性仅在"sendmail"驱动下生效:sendmail驱动不会将$mail_obj->send方法的第一个参数(收件人列表)暴露到邮件头中,相当于全部为Bcc密送。我将$from_email加入到$send_to列表中,就实现了预期效果,最终代码如下:

$message = new Mail_mime(); 
$message->setTXTBody($_text); 
...
$body = $message->get();
$thisSubject = $subject;
if (isset($_POST['_cc_sender'])) {
    $send_to = $from_email . "," . $to;
} else {
    $send_to = $to;
}
$extraheaders = array("From"=>$from_email,
                      "Subject"=>$thisSubject);
$headers  = $message->headers($extraheaders);
$mail_obj = Mail::factory("sendmail");
$mail_obj->send($send_to, $headers, $body);

内容的提问来源于stack exchange,提问作者Gary Dale

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.13 14:00:01