为什么邮件头会导致PHP mail()函数无法发送HTML格式邮件?
核心问题根因
你代码中mail()函数的参数顺序错误,是导致两个环境都出现异常的核心原因:
PHP原生mail()函数的正确语法为:mail(string $to, string $subject, string $message, array|string $additional_headers = [], string $additional_params = ""): bool
你把发件人配置放到了本该放所有邮件头的第四个参数位,把定义了HTML内容类型的头放到了不识别头配置的第五个额外参数位,导致两个环境都没有正确加载到HTML解析规则。
分环境问题说明
- 本地环境纯文本显示问题
因为头配置没有被正确传入,邮件默认按纯文本格式解析,所以直接展示HTML源码。除了SMTP服务器被邮件客户端标记为不安全的可能性外,修正参数顺序后即可解决绝大多数这类问题。如果修正后仍有异常,可以检查本地SMTP服务配置,或更换测试用邮件客户端验证。 - Hostinger服务器发送失败问题
Hostinger对邮件头的校验规则更严格,错误的参数传入导致头配置不符合服务端要求,直接被拦截发送请求,所以只要传入自定义头就会发送失败。
修正后可用代码
<?php $email_template = file_get_contents("path/to/my/template"); // 注意rand参数是最小值在前、最大值在后,原代码参数顺序错误会生成不符合预期的随机数 $lucky_number = rand(111111, 999999); $email_template = str_replace("{{user}}", "User", $email_template); $email_template = str_replace("{{lucky_number}}", $lucky_number, $email_template); $receiver = "username@host.com"; $subject = "Random Subject Name"; // 所有邮件头统一放到$headers变量里,每个头末尾用\r\n分隔 $headers = "MIME-Version: 1.0\r\n" . "Content-Type: text/html; charset=UTF-8\r\n" . "From: iusername@host.com\r\n"; // 发件人配置放到头中,Hostinger要求发件人必须是平台验证过的域名邮箱 if(mail($receiver, $subject, $email_template, $headers)) { echo "Email Sent Successfully"; } else { echo "Email Sending Failed"; }
额外注意事项
- Hostinger环境下请确认发件人邮箱属于你在Hostinger后台绑定的域名,且已经完成SPF、DKIM记录配置,否则邮件会被拦截或进入垃圾箱。
- 如果本地环境修正参数后仍显示纯文本,可以先将相同代码放到Hostinger上验证,排除本地SMTP服务被邮件客户端标记不安全的问题。
- 检查HTML模板内不要有外部脚本、大量外链资源,部分邮件客户端会拦截这类内容,强制显示纯文本。
内容的提问来源于stack exchange,提问作者Joy Dey
相关产品推荐
相关产品推荐

