PHPMailer设置表单邮箱为发件人却显示收件人邮箱问题
问题分析
你遇到的核心问题是主流SMTP服务商(比如Gmail)的发件人强制替换机制:为防范邮件伪造,这类服务会自动将发件人地址替换为你SMTP登录的账号邮箱(即代码里的RECEIVER@gmail.com),忽略你通过setFrom()设置的用户提交邮箱。
解决方案
1. 核心修复:添加回复地址
虽然无法直接显示用户提交的邮箱为发件人,但可以设置Reply-To,让收件人回复邮件时自动指向用户的邮箱,这是最实用的替代方案。
2. 优化发件人显示(可选)
将setFrom()改为使用SMTP登录邮箱,搭配固定的网站名称(比如“网站反馈”),避免显示混乱。
修改后的PHP代码
<?php use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\Exception; require 'phpmailer/src/Exception.php'; require 'phpmailer/src/PHPMailer.php'; require 'phpmailer/src/SMTP.php'; if ($_SERVER["REQUEST_METHOD"] == "POST" && isset($_POST["send"])) { $name = $_POST["name"]; $email = $_POST["email"]; $message = $_POST["message"]; $mail = new PHPMailer(true); try { $mail->isSMTP(); $mail->Host = 'smtp.gmail.com'; $mail->SMTPAuth = true; $mail->Username = 'RECEIVER@gmail.com'; $mail->Password = 'SECRET'; $mail->SMTPSecure = "ssl"; $mail->Port = 465; // 发件人:使用SMTP登录邮箱,搭配网站名称 $mail->setFrom($mail->Username, "网站反馈"); // 收件人 $mail->addAddress("RECEIVER@gmail.com"); // 关键:添加回复地址,指向用户提交的邮箱 $mail->addReplyTo($email, $name); // 内容调整:HTML格式下用<br>替代换行符 $mail->isHTML(true); $mail->Subject = $_POST["subject"]; $mail->Body = "Name: $name<br>Email: $email<br><br>Message:<br>$message"; $mail->send(); echo "发送成功!"; } catch (Exception $e) { echo "邮件发送失败。错误信息: {$mail->ErrorInfo}"; } }
额外注意事项
- Gmail用户需使用App密码(推荐,更安全)或开启“低安全性应用访问”才能正常登录SMTP;
- 不要直接用用户提交的邮箱作为
setFrom地址,除了会被服务商替换,还可能触发垃圾邮件检测(发件人域名与SMTP服务器域名不一致)。
内容的提问来源于stack exchange,提问作者Amit Kumar
相关产品推荐
相关产品推荐

