在PHP开发场景中,使用内置的mail()函数向多个收件人发送邮件是常见需求,若配置不当容易出现部分收件人收不到邮件、邮件被判定为垃圾邮件等问题,需要遵循规范的实现方式。

收件人参数的正确设置方式
mail()函数的第一个参数是收件人地址,当需要发送给多个收件人时,不能直接传入数组,而是需要用半角逗号拼接多个邮箱地址作为字符串传入。
<?php // 多个收件人邮箱,用逗号分隔 $to = 'user1@ipipp.com,user2@ipipp.com,user3@ipipp.com'; // 邮件主题 $subject = '测试多收件人邮件'; // 邮件正文 $message = '这是一封发送给多个收件人的测试邮件'; // 发送邮件 mail($to, $subject, $message); ?>
邮件头的必要配置
仅设置收件人参数还不够,还需要正确配置邮件头,尤其是From头是必须的,否则很多邮件服务商都会直接拒收邮件,同时可以添加Cc、Bcc头实现抄送和密送功能。
<?php $to = 'user1@ipipp.com,user2@ipipp.com'; $subject = '带完整头的多收件人邮件'; $message = '这是配置了完整邮件头的测试邮件'; // 配置邮件头 $headers = "From: sender@ipipp.com\r\n"; $headers .= "Cc: cc_user@ipipp.com\r\n"; // 抄送收件人 $headers .= "Bcc: bcc_user@ipipp.com\r\n"; // 密送收件人 $headers .= "MIME-Version: 1.0\r\n"; $headers .= "Content-type: text/html; charset=utf-8\r\n"; // 发送邮件 mail($to, $subject, $message, $headers); ?>
避免被判定为垃圾邮件的技巧
多收件人邮件更容易被邮件服务商判定为垃圾邮件,需要注意以下几点:
- 发件人邮箱最好是同域名下的有效邮箱,且提前做好SPF、DKIM等验证配置
- 不要在邮件主题和正文中堆砌大量广告类词汇
- 收件人数量不宜过多,若需要发送给大量用户,建议分批次发送
- 邮件头中的换行符必须使用
\r\n,不能使用单独的\n或者\r
常见错误与规避方法
| 常见错误 | 后果 | 规避方法 |
|---|---|---|
| 收件人邮箱用空格分隔 | 仅第一个收件人能收到邮件 | 统一使用半角逗号分隔收件人地址 |
| 缺少From头 | 邮件被服务商直接拒收 | 始终配置合法的From邮件头 |
| 邮件头换行符使用错误 | 邮件格式异常,无法正常解析 | 统一使用\r\n作为邮件头换行符 |
完整示例代码
以下是一个可直接运行的完整多收件人邮件发送示例:
<?php
/**
* 发送多收件人邮件的函数
* @param array $toList 收件人数组
* @param string $subject 邮件主题
* @param string $message 邮件正文
* @param string $from 发件人地址
* @return bool 发送结果
*/
function sendMultiMail($toList, $subject, $message, $from) {
if (empty($toList) || !is_array($toList)) {
return false;
}
// 拼接收件人字符串
$to = implode(',', $toList);
// 构建邮件头
$headers = "From: {$from}\r\n";
$headers .= "MIME-Version: 1.0\r\n";
$headers .= "Content-type: text/html; charset=utf-8\r\n";
// 发送邮件
return mail($to, $subject, $message, $headers);
}
// 调用示例
$toList = ['user1@ipipp.com', 'user2@ipipp.com', 'user3@ipipp.com'];
$result = sendMultiMail($toList, '多收件人邮件测试', '这是完整示例的测试邮件内容', 'sender@ipipp.com');
if ($result) {
echo '邮件发送成功';
} else {
echo '邮件发送失败';
}
?>