应配置SPF、DKIM、DMARC三重验证机制,并禁用mail()函数、强制SMTP认证及严格过滤邮件头。SPF声明授权IP,DKIM签名验证完整性,DMARC定义失败策略并提供报告,结合SMTP身份认证与输入转义,可有效防止发件人地址伪造。

如果您在使用PHP发送邮件时发现发件人地址可被随意篡改,收件方收到的邮件显示为虚假来源,则很可能是由于缺乏有效的发件人身份验证机制。以下是防止邮件伪造发送的具体方法:
一、配置SPF记录
SPF(Sender Policy Framework)通过DNS TXT记录声明哪些IP地址或邮件服务器被授权代表该域名发送邮件,收件方服务器可据此验证发件IP是否合法。
1、登录您的域名DNS管理后台。
2、新增一条TXT类型记录,主机名填写@或留空(视服务商而定)。
立即学习“PHP免费学习笔记(深入)”;
3、记录值设置为:v=spf1 include:smtp.163.com ~all(若使用163邮箱SMTP)或 v=spf1 ip4:203.0.113.42 include:_spf.google.com -all(若使用Google Workspace)。
4、保存后等待DNS全球生效(通常需10分钟至48小时)。
二、部署DKIM签名
DKIM(DomainKeys Identified Mail)利用公钥加密对邮件头和正文生成数字签名,收件方通过查询DNS中的公钥记录验证签名完整性,从而确认邮件未被篡改且确实来自该域名。
1、使用PHPMailer实例化对象后启用DKIM:
2、设置DKIM域名:$mail->DKIM_domain = 'example.com';
3、指定私钥文件路径:$mail->DKIM_private = '/var/www/private/dkim.key';
4、设置选择器(selector):$mail->DKIM_selector = 'phpmailer2026';
5、在DNS中添加对应TXT记录,主机名为phpmailer2026._domainkey.example.com,值为公钥内容(含p=开头的Base64字符串)。
三、启用DMARC策略
DMARC(Domain-based Message Authentication, Reporting & Conformance)建立在SPF和DKIM之上,定义当两者验证失败时的处理动作,并支持接收方定期反馈验证日志,帮助管理员监控伪造行为。
1、在DNS中新增一条TXT记录,主机名填写_dmarc.example.com。
2、记录值设为:v=DMARC1; p=quarantine; rua=mailto:dmarc-reports@example.com; ruf=mailto:forensic@example.com; fo=1;
3、其中p=quarantine表示验证失败邮件应送入隔离区;若需更严格策略,可改为p=reject。
4、确保rua邮箱可正常接收聚合报告,用于持续分析伪造尝试来源。
四、强制使用SMTP认证并禁用mail()函数
原生mail()函数不执行发件人身份校验,且易受Header注入攻击,导致From头被恶意覆盖;强制走SMTP通道并启用身份认证可从协议层杜绝匿名伪造。
1、在PHP代码中禁用系统mail()函数:在php.ini中设置disable_functions = mail并重启Web服务。
2、使用PHPMailer配置SMTP连接:
3、调用$mail->setFrom('noreply@example.com', 'Example Site');显式设定合法发信地址。
4、启用SMTPAuth并提供客户端授权密码:$mail->SMTPAuth = true; $mail->Password = 'your_app_password';
五、实施邮件头严格过滤与转义
用户可控输入(如联系表单中的姓名、邮箱)若未经处理直接拼入邮件头,可能触发Header注入,插入额外的To、Cc或Subject字段,实现伪造转发。
1、对所有用户提交的邮箱地址执行格式校验:filter_var($email, FILTER_VALIDATE_EMAIL)。
2、对From、Reply-To等头字段中的姓名部分使用mb_encode_mimeheader()进行MIME编码。
3、禁止在邮件头中拼接用户输入的原始字符串,所有头字段必须由程序固定构造,用户数据仅允许填入邮件正文或HTML body内。



















