You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用PHPMailer发送表单邮件时发件人显示异常求助

解决PHPMailer通过Gmail SMTP发送时发件人被替换的问题

问题描述

我搭建了一个包含表单的网站,表单提交后通过PHPMailer发送邮件到groupentservices@gmail.com,期望发件人显示为用户填写的邮箱,但实际邮件显示发件人是groupentservices@gmail.com。我尝试用setFrom($email)设置发件人但未生效,目前只能通过addReplyTo($email, $prenom . ' ' . $nom)设置回复邮箱,希望找到直接让发件人显示为用户邮箱的方案。

原因分析

Gmail的SMTP服务出于反垃圾邮件和身份验证(SPF/DMARC)的强制要求,会自动替换发件人为你登录SMTP的邮箱账号,不允许随意伪造第三方邮箱作为发件人——这是为了避免邮件被标记为垃圾邮件或被收件服务器拒收。

解决方案

虽然无法直接将发件人设置为用户邮箱,但可以通过以下合规方式让收件人清晰识别用户信息并方便回复:

1. 优化发件人显示+绑定回复地址(推荐)

设置发件人为你的Gmail邮箱,同时在发件人名称中标注用户信息,再绑定用户邮箱为回复地址。修改后的PHP代码如下:

<?php

use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;

require_once '../vendor/autoload.php';

$dotenv = Dotenv\Dotenv::createMutable(__DIR__ . '/..');
$dotenv->load();

if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $nom = $_POST['nom'];
    $prenom = $_POST['prenom'];
    $email = $_POST['email'];
    $adresse = $_POST['adresse'];
    $telephone = $_POST['telephone'];
    $codePostal = $_POST['codePostal'];
    $ville = $_POST['ville'];
    $description = $_POST['description'];
    $userFullName = $prenom . ' ' . $nom;

    // PHPMailer配置
    $mail = new PHPMailer(true);
    $mail->isSMTP();
    $mail->Host = 'smtp.gmail.com';
    $mail->SMTPAuth = true;
    $mail->Username = $_ENV['SMTP_USERNAME'];
    $mail->Password = $_ENV['SMTP_PASSWORD'];
    $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
    $mail->Port = 587;

    // 邮件参数设置
    $mail->addAddress('groupentservices@gmail.com', 'GroupNtService');
    // 发件人显示为你的Gmail,但名称标注用户信息
    $mail->setFrom($_ENV['SMTP_USERNAME'], $userFullName . " (via GroupNtService)");
    // 绑定用户邮箱为回复地址
    $mail->addReplyTo($email, $userFullName);
    $mail->isHTML(true);
    $mail->Subject = "Demande de Devis - Installation de $userFullName";
    $mail->Body = "Nom : $nom<br>
                    Prénom : $prenom<br>
                    Adresse E-mail : $email<br>
                    Adresse : $adresse<br>
                    Numéro de téléphone : $telephone<br>
                    Code Postal : $codePostal<br>
                    Ville : $ville<br>
                    Description du problème : $description";

    // 发送邮件
    try {
        $mail->send();
        header("Location: /confirmation.html");
        exit();
    } catch (Exception $e) {
        echo "Une erreur s'est produite : {$mail->ErrorInfo}";
    }
}

2. 完全自定义发件人的替代方案

如果一定要让发件人完全显示为用户邮箱,你需要:

  • 使用自己的独立邮件服务器(而非Gmail SMTP)
  • 确保用户邮箱的域名配置了正确的SPF和DMARC记录,允许你的服务器代发邮件
  • 或使用支持"发件人别名"的企业级邮件服务(如SendGrid、Mailgun等)

内容的提问来源于stack exchange,提问作者Azmat Chowthee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 09:35:59