PHPMailer在GoDaddy上不能发送电子邮件

3

我正在GoDaddy上设置邮件发送器,我的代码如下:

$mail = new PHPMailer(true);
$mail->IsSMTP();
$mail->SMTPDebug = 3;
$mail->SMTPAuth = false;
$mail->Port = 25;
$mail->Host = "localhost";
$mail->Username = 'username';
$mail->Password =  'password';

$mail->isSendmail();

$mail->From = $email;
$mail->FromName = "Website";

$mail->AddAddress("jn@website.com");

$mail->Subject = "Inquiry - " . $name;
$mail->WordWrap = 80;

$mail->MsgHTML($message);
$mail->IsHTML(true);return $mail->send();

我得到的输出如下:

使用sendmail发送:

Sendmail path: /usr/sbin/sendmail -t -i
Sendmail command: /usr/sbin/sendmail -t -i -oi -ft@t.com -t
Envelope sender: t@t.com
Headers: Date: Wed, 21 Apr 2021 22:43:52 +0000To: jn@website.comFrom: Website <t@t.com>Subject: Inquiry - testMessage-ID: <Km4AQw3yoiFLxzzxLhULZdgQjrgPSBSTT66rxurg4@website.com>X-Mailer: PHPMailer 6.3.0 (https://github.com/PHPMailer/PHPMailer)MIME-Version: 1.0Content-Type: multipart/alternative; boundary="b1_Km4AQw3yoiFLxzzxLhULZdgQjrgPSBSTT66rxurg4"Content-Transfer-Encoding: 8bit
Result: true

问题在于我没有收到这些邮件。
提前感谢您的回复。

请先检查您服务器上的邮件日志。 - Raptor
2个回答

1

@zanderwar的回答大部分是正确的,但不幸的是与此并不相关。您可以使用任何语言欺骗电子邮件来源,但这就是为什么我们有SPF和DKIM的原因。

主要问题在于使用GoDaddy。他们阻止出站SMTP,并要求您仅通过其自己的secureserver.net服务器发送,没有加密或身份验证。这足以在几乎所有情况下防止有用的发送,除非来自GoDaddy拥有的域名。您可以通过include机制将它们添加到您的SPF记录中,但这对接收者来说可能没有太大的区别。

您还有一些其他问题。

您正在调用isSMTP(),但然后是isSendmail() - 后者最后被调用,因此实际使用的是后者,并且意味着将忽略所有SMTP设置。选择一个发送机制。

接下来,你很可能实际上不需要使用isSendmail();该函数是为那些拥有自己的邮件服务器软件定制安装、需要特殊处理而不受mail()(例如qmail)或SMTP到本地主机(一种罕见的情况)支持的人准备的。你在GoDaddy上,这意味着你无法这样做。要么使用默认的isMail(),要么更好的是使用SMTP到localhost(最快、最安全的方法,也提供最好的反馈)。
你很难判断发生了什么,因为没有错误处理。你没有检查任何返回值,没有异常处理(在PHPMailer中也需要启用),没有显示错误消息,也没有启用调试输出(虽然这只对SMTP发送真正有用)。我建议你基于 PHPMailer提供的示例编写代码,这些示例展示了如何执行这些操作。
是的,你也应该使用DKIM签名,但同样,GoDaddy在这方面不会提供帮助。

最后,发帖前先搜索一下;这里有很多关于 使用PHPMailer与GoDaddy 的问题和答案,其中大部分都是关于使用GoDaddy时固有的同样问题。如果可能的话,我建议更换一个不会把电子邮件搞得一团糟的主机。


1
太棒了,先生! :) - zanderwar

1

PHP电子邮件很容易伪造发件人头,并且经常被拒绝。在这里,你的接收者邮件服务器可能会将其拒绝,因为它可能不安全。

请注意,仅因为电子邮件离开了你的服务器并不意味着接收者的邮件服务器愿意接收它。通常,邮件服务器会回复“状态:OK”,即使它没有打算将其传递给接收者的邮箱。

有几件事情你可以尝试:

  1. 确保你的From是一个有效的电子邮件地址。
  2. DKIM可以显著帮助验证电子邮件是否来自有效位置。
  3. SPF可以帮助验证电子邮件是否来自所说的位置。
  4. 修改X-Mailer头,一些MX服务器认为PHPMailer不可信。参见此处:https://phpmailer.github.io/PHPMailer/classes/PHPMailer.PHPMailer.PHPMailer.html#property_XMailer

DKIM

DKIM要求你在发送域上拥有一个TXT DNS记录,使用你自己生成的公钥/私钥:

请注意,DNS记录应该使用公钥
v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4lox7LckG2/QtT/IY677O2JTgzh3z/FKKqGSVjAk6Gh+7Tyu8jjFUmPdLj/G5u9cFGkQvqa[..]QJZOGgxBeFv2V/Evk9GZtF+3yiHm5tZvi0Z4xhT17dt8ZxcFZ3QIDAQAB

TXT DNS记录的名称应为:whoeveryouare._domainkey.mydomain.com。然后,您可以使用PHPMailer签署电子邮件,如下所示:
// must match the domain in the "From"
$this->DKIM_domain = "mydomain.com"

// private key path
$this->DKIM_private = "/path/to/dkim/private.key";

// dns selector (this matches with TXT record with hostname: whoeveryouare._domainkey.mydomain.com)
$this->DKIM_selector = 'whoeveryouare';

// private key passphrase (has none)
$this->DKIM_passphrase = '';

//Suppress listing signed header fields in signature, defaults to true for debugging purpose
$this->DKIM_copyHeaderFields = true; // SHOULD BE FALSE IN PRODUCTION

// who is signing this email
$this->DKIM_identity = $this->From;

使用DKIM可以抑制邮件显示“代表发送”并提高收件人邮件服务器接受您的电子邮件的机会。

SPF

SPF代表发件人策略框架。

发件人策略框架(SPF)是一种电子邮件身份验证方法,旨在检测电子邮件传递过程中伪造的发件人地址。

SPF有助于确保发件人(发件人地址)确实来自所说的地方。 SPF记录如下所示:

v=spf1 +ip4:192.168.3.4 -all

其中192.168.3.4是发送电子邮件的服务器的IP地址。


我个人扩展了PHPMailer,并在使用过程中完成所有操作:
/**
 * Class Mailer
 *
 * A wrapper class for the PHPMailer package
 */
class Mailer extends \PHPMailer\PHPMailer\PHPMailer
{
    /**
     * PHPMailer constructor.
     *
     * Automatically configure SMTP credentials and adjust X-Mailer header
     *
     * @param null $exceptions
     */
    public function __construct($exceptions = null)
    {
        parent::__construct($exceptions);

        $this->XMailer = "My Super Cool Platform";
    }

    /**
     * Automatically signs emails with a DKIM signature if enabled
     *
     * @return bool
     * @throws \PHPMailer\PHPMailer\Exception
     */
    public function send()
    {
        // must match the domain in the "From"
        $this->DKIM_domain = "mydomain.com"

        // private key path
        $this->DKIM_private = "/path/to/dkim/private.key";

        // dns selector (this matches with TXT record with hostname: whoeveryouare._domainkey.mydomain.com)
        $this->DKIM_selector = 'whoeveryouare';

        // private key passphrase (has none)
        $this->DKIM_passphrase = '';

        //Suppress listing signed header fields in signature, defaults to true for debugging purpose
        $this->DKIM_copyHeaderFields = true; // SHOULD BE FALSE IN PRODUCTION

        // who is signing this email
        $this->DKIM_identity = $this->From;
        

        return parent::send();
    }
}

电子邮件始终是一个让人头疼的问题,但使用SMTP服务器发送电子邮件并使用DKIM / SPF可以解决很多问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接