
php通过原始smtp协议发送邮件时,仅在邮件头中添加cc字段无法使抄送人收到邮件,必须在smtp会话中显式调用rcpt to:命令为每个cc地址注册接收者。
在您提供的自定义smtp_mail()函数中,当前逻辑仅对$to列表中的收件人执行了RCPT TO:命令(即SMTP协议中声明“该邮件将送达这些地址”),但完全忽略了$cc地址。SMTP协议本身不区分To/CC/BCC——它只关心“谁是合法的收件人(envelope recipient)”,而To、CC、BCC语义仅由邮件头(Header)控制,用于客户端显示。若未在SMTP会话中为CC邮箱调用RCPT TO:,邮件服务器会直接拒绝投递给这些地址,导致CC收件人收不到任何邮件。
✅ 正确做法:为CC地址也注册RCPT
需在MAIL FROM:之后、DATA之前,为所有CC邮箱逐一发送RCPT TO:指令。修改原函数中相关部分如下:
// 原有:仅处理 To 收件人
foreach ($recipients as $email) {
fwrite($socket, 'RCPT TO: <'.trim($email).'>'."\r\n");
server_parse($socket, '250');
}
// ✅ 新增:同样处理 CC 收件人(注意去空格,避免解析失败)
foreach ($recipientscc as $email) {
$email = trim($email);
if (!empty($email)) {
fwrite($socket, 'RCPT TO: <'.$email.'>'."\r\n");
server_parse($socket, '250');
}
}⚠️ 注意事项:RCPT TO: 是信封级(envelope-level) 命令,必须为每个实际接收邮箱调用一次;To: 和 Cc: 头字段(header-level)仅影响邮件客户端如何显示,不决定投递权限;若CC邮箱格式不规范(如含多余空格、换行或非法字符),RCPT TO: 会失败,建议使用trim()预处理;BCC同理:需调用RCPT TO:,但不在邮件头中出现,实现“隐藏收件人”。
? 补充建议:提升健壮性与可维护性
- 统一收件人处理逻辑:可合并To/CC/BCC为一个收件人数组,避免重复代码;
- 验证邮箱格式:使用filter_var($email, FILTER_VALIDATE_EMAIL)提前过滤无效地址;
- 启用认证(推荐):当前代码注释掉了AUTH LOGIN段落,生产环境务必启用SMTP身份验证(端口建议改用587/TLS或465/SSL);
- 错误处理增强:server_parse()目前仅输出错误,建议抛出异常或返回布尔值便于上层捕获;
- 考虑使用成熟库:如PHPMailer或Symfony Mailer,自动处理RCPT、MIME、编码、重试等细节,大幅降低出错风险。
✅ 验证是否生效
发送后检查SMTP服务器日志(如Postfix、Exim)或使用MailHog、Mailtrap等测试工具捕获原始SMTP会话,确认RCPT TO:命令是否包含所有CC邮箱。若仍失败,请检查:
websenB2B是一套经过完善设计的B2B行业网站程序,是windows nt系列环境下最佳的B2B行业网产站解决方案。精心设计的架构与功能机制,适合从个人到企业各方面应用的要求,为您提供一个安全、稳定、高效、易用而快捷的行业网站商务系统。分普及版和商业版等不同版本。一、网胜B2B电子商务系统SP6.2蓝色风格普及版本升级功能说明:1、邮件群发功能:可以选择某一级别的会员,并放入支持html
- CC邮箱是否被目标服务器拒收(SPF/DKIM/DMARC策略);
- 邮箱是否存在或已满;
- 网络防火墙是否拦截了SMTP连接。
遵循以上修正,您的CC收件人即可正常接收邮件——本质不是“头没写对”,而是“门没敲开”。









