PHP发送Gmail邮件异常:内容全显示在主题栏,无邮件正文
解决PHP邮件脚本内容全跑到主题栏、正文为空的问题
嘿,我完全懂你遇到的糟心情况——邮件发出去了,但所有内容都挤在主题里,正文空得离谱!这大概率是邮件头设置不对,或者参数顺序搞混了,咱们一步步来解决:
常见问题原因
- 没有设置正确的
Content-Type头:邮件客户端不知道该怎么解析你的内容,索性把所有信息都当成主题处理; - 参数顺序错误:
mail()函数的参数搞混了,比如把正文内容传到了主题参数的位置; - 邮件头格式不规范:换行用了
\n而不是标准的\r\n,导致服务器解析邮件结构出错。
修正后的代码示例
这里给你一个标准的可运行版本,适配你的需求:
<?php // 检查表单核心字段是否提交 if (isset($_REQUEST['email'], $_REQUEST['name'], $_REQUEST['message'])) { // 基础配置 $recipient = 'me@gmail.com'; // 你的Gmail收件地址 $subject = '新的联系表单消息'; // 清晰的邮件主题,别把正文内容塞这! // 构建邮件正文(用HTML格式,支持<br>换行) $senderName = htmlspecialchars($_REQUEST['name']); $senderEmail = htmlspecialchars($_REQUEST['email']); $senderMessage = htmlspecialchars($_REQUEST['message']); $emailBody = "Name : {$senderName}<br>Email: {$senderEmail}<br>Message: {$senderMessage}"; // 关键:设置正确的邮件头 $headers = "From: {$senderName} <{$senderEmail}>\r\n"; $headers .= "Reply-To: {$senderEmail}\r\n"; // 告诉邮件客户端这是HTML格式邮件,这是解决内容乱跑的核心! $headers .= "Content-Type: text/html; charset=UTF-8\r\n"; // 发送邮件 $sendSuccess = mail($recipient, $subject, $emailBody, $headers); if ($sendSuccess) { echo "邮件已成功发送!"; } else { echo "邮件发送失败,请检查服务器的邮件配置(比如sendmail是否正常运行)。"; } } ?>
核心注意事项
- 严格区分主题和正文:
$subject只放简短的标题,正文内容单独放到$emailBody里,别把两者拼接在一起; - 必须设置
Content-Type:因为你用了<br>换行,所以要声明text/html类型,否则邮件客户端会把<br>当成普通文本,甚至解析错误; - 邮件头用
\r\n换行:这是邮件协议的规范要求,避免部分邮件服务器或客户端解析出错; - 转义用户输入:用
htmlspecialchars()处理用户提交的内容,防止XSS攻击和邮件内容乱码。
如果手动处理邮件头还是容易出错,推荐使用PHPMailer这类成熟的邮件库,它会帮你自动处理所有头信息和格式问题,比原生mail()函数靠谱得多哦!
内容的提问来源于stack exchange,提问作者Solutel WW
相关产品推荐
相关产品推荐

