首页 > 解决方案 > 如何使用 PHPMailer 和 Google Apps 获得正确的“发件人”电子邮件地址?

问题描述

我使用一个简单的 PHPMailer 表单来允许我网站的用户通过联系表单与我联系。我使用我的谷歌应用程序帐户发送邮件。在脚本中,我将用户提供给我的电子邮件帐户设置为“发件人地址”。

直到几周前,这一切进展顺利。在 Google Apps 中,我可以单击回复以向与我联系的用户发送回复。

但是,最近,在我没有更改任何代码的情况下,当我点击回复时,我会向自己发送一封电子邮件。这是谷歌在其政策中改变的东西吗?还是我偶然做错了什么?

这是我得到的输出。我使用 info@kynero.nl 发送并使用 jaapklok@gmail.com 作为客户帐户。但是,当我打开在 info@kynero.nl 中收到的邮件并单击回复时,我会向 info@kynero.nl 而不是 jaapklok@gmail.com 发送电子邮件

2019-02-06 20:34:31 SERVER -> CLIENT: 220 smtp.gmail.com ESMTP x38sm6269222edx.24 - gsmtp
2019-02-06 20:34:31 CLIENT -> SERVER: EHLO www.kynero.nl
2019-02-06 20:34:31 SERVER -> CLIENT: 250-smtp.gmail.com at your service, [2a0b:7280:200:0:4d0:baff:fe00:d8e]250-SIZE 35882577250-8BITMIME250-STARTTLS250-ENHANCEDSTATUSCODES250-PIPELINING250-CHUNKING250 SMTPUTF8
2019-02-06 20:34:31 CLIENT -> SERVER: STARTTLS
2019-02-06 20:34:31 SERVER -> CLIENT: 220 2.0.0 Ready to start TLS
2019-02-06 20:34:31 CLIENT -> SERVER: EHLO www.kynero.nl
2019-02-06 20:34:31 SERVER -> CLIENT: 250-smtp.gmail.com at your service, [2a0b:7280:200:0:4d0:baff:fe00:d8e]250-SIZE 35882577250-8BITMIME250-AUTH LOGIN PLAIN XOAUTH2 PLAIN-CLIENTTOKEN OAUTHBEARER XOAUTH250-ENHANCEDSTATUSCODES250-PIPELINING250-CHUNKING250 SMTPUTF8
2019-02-06 20:34:31 CLIENT -> SERVER: AUTH LOGIN
2019-02-06 20:34:31 SERVER -> CLIENT: 334 VXNlcm5hbWU6
2019-02-06 20:34:31 CLIENT -> SERVER: <credentials hidden>
2019-02-06 20:34:31 SERVER -> CLIENT: 334 UGFzc3dvcmQ6
2019-02-06 20:34:31 CLIENT -> SERVER: <credentials hidden>
2019-02-06 20:34:31 SERVER -> CLIENT: 235 2.7.0 Accepted
2019-02-06 20:34:31 CLIENT -> SERVER: MAIL FROM:<jaapklok@gmail.com>
2019-02-06 20:34:31 SERVER -> CLIENT: 250 2.1.0 OK x38sm6269222edx.24 - gsmtp
2019-02-06 20:34:31 CLIENT -> SERVER: RCPT TO:<info@kynero.nl>
2019-02-06 20:34:31 SERVER -> CLIENT: 250 2.1.5 OK x38sm6269222edx.24 - gsmtp
2019-02-06 20:34:31 CLIENT -> SERVER: DATA
2019-02-06 20:34:31 SERVER -> CLIENT: 354 Go ahead x38sm6269222edx.24 - gsmtp
2019-02-06 20:34:31 CLIENT -> SERVER: Date: Wed, 6 Feb 2019 21:34:31 +0100
2019-02-06 20:34:31 CLIENT -> SERVER: To: info@kynero.nl
2019-02-06 20:34:31 CLIENT -> SERVER: From: Jaap Klok <jaapklok@gmail.com>
2019-02-06 20:34:31 CLIENT -> SERVER: Reply-To: Jaap Klok <jaapklok@gmail.com>
2019-02-06 20:34:31 CLIENT -> SERVER: Subject: Aanvraag via Inschrijfformulier op kynero.nl
2019-02-06 20:34:31 CLIENT -> SERVER: Message-ID: <0bYvsZOe3xY7iWVxMyFA2uxOvWVDPpl5CAX58DcXA@www.kynero.nl>
2019-02-06 20:34:31 CLIENT -> SERVER: X-Mailer: PHPMailer 6.0.5 (https://github.com/PHPMailer/PHPMailer)
2019-02-06 20:34:31 CLIENT -> SERVER: MIME-Version: 1.0
2019-02-06 20:34:31 CLIENT -> SERVER: Content-Type: text/html; charset=iso-8859-1
2019-02-06 20:34:31 CLIENT -> SERVER: 
2019-02-06 20:34:31 CLIENT -> SERVER: Naam: Jaap Klok <br />
2019-02-06 20:34:31 CLIENT -> SERVER: Inschrijving: Detectie vrijdag 10.00 <br />
2019-02-06 20:34:31 CLIENT -> SERVER: Algemene voorwaarden: Akkoord <br />
2019-02-06 20:34:31 CLIENT -> SERVER: Bericht: Test 3 - 21:36
2019-02-06 20:34:31 CLIENT -> SERVER: 
2019-02-06 20:34:31 CLIENT -> SERVER: .
2019-02-06 20:34:32 SERVER -> CLIENT: 250 2.0.0 OK 1549485383 x38sm6269222edx.24 - gsmtp
2019-02-06 20:34:32 CLIENT -> SERVER: QUIT
2019-02-06 20:34:32 SERVER -> CLIENT: 221 2.0.0 closing connection x38sm6269222edx.24 - gsmtp

标签: phpemailgmailphpmailer

解决方案


Google 不允许您从任意地址发送。您只能使用您的帐户地址或 gmail 设置中的预定义别名。如果您尝试这样做,它会简单地将您的帐户地址替换为发件人地址,如您所见。

无论如何,通常尝试这样做是错误的方法 - 它是伪造的,并且会导致您的邮件被垃圾邮件过滤或由于 SPF 失败而被退回。正确的做法是使用您自己的地址作为发件人地址,并使用提交者的地址作为回复地址。PHPMailer 提供的联系表单示例正是这样做的。其中重要的一点:

    //Use a fixed address in your own domain as the from address
    //**DO NOT** use the submitter's address here as it will be forgery
    //and will cause your messages to fail SPF checks
    $mail->setFrom('from@example.com', 'First Last');
    //Send the message to yourself, or whoever should receive contact for submissions
    $mail->addAddress('whoto@example.com', 'John Doe');
    //Put the submitter's address in a reply-to header
    //This will fail if the address provided is invalid,
    //in which case we should ignore the whole request
    if ($mail->addReplyTo($_POST['email'], $_POST['name'])) {
        $mail->Subject = 'PHPMailer contact form';
        //Keep it simple - don't use HTML
        $mail->isHTML(false);
        //Build a simple message body
        $mail->Body = <<<EOT
Email: {$_POST['email']}
Name: {$_POST['name']}
Message: {$_POST['message']}
EOT;

推荐阅读