【问题标题】:phpMailer not arriving in Hotmail?phpMailer 没有到达 Hotmail?
【发布时间】:2015-05-14 12:39:34
【问题描述】:

设置 SPF 记录后,我仍然在这里验证为什么我无法收到此电子邮件到 hotmail 帐户。我可以毫无问题地将其发送到 gmail。请确认代码是否正确,SPF记录是否正确:

<?php 

require_once 'PHPmailer/class.phpmailer.php';
$mail = new PHPMailer();


$body = "Thankyou for your Purchase. <br/><br/> Here is your Policy! You are now Protected during your Travels.";

$mail->AddAddress('$payer_email');
$mail->From = "noreply@example.com";
$mail->FromName = "Name";
$mail->Subject = "Thankyou for Your Purchase";
$mail->MsgHTML($body);
$mail->AddAttachment("tosend/xxx.pdf");
if(!$mail->Send()) {
echo "There was an error sending the message";
    $sql = "UPDATE purchases SET policy_sent = 'Not Sent' WHERE id = '$lastid' ";
    $stmt = $mysqli->query($sql);
    $mysqli->close();
exit;
}
echo "Message was sent successfully";
$sql = "UPDATE purchases SET policy_sent = 'Sent', email_to = '$payer_email' WHERE id = '$lastid'";
$stmt = $mysqli->query($sql);
$mysqli->close(); 
?>

这是 SPF:

v=spf1 a mx include:secureserver.net ~all

所有这些都正确配置了吗?

【问题讨论】:

  • 我们需要了解更多才能确定。对于初学者来说,immortalinsurance.com 应该有 SPF records 告诉人们您的网络服务器是接收邮件的好地方。
  • 为什么 Gmail 会接收电子邮件? SPF 记录能解决您认为的大部分问题吗?除非自动设置,否则我没有设置。
  • 不同的服务做不同的事情。如果 GMail 允许邮件通过,我会假设您没有有 SPF 记录 - 如果您有 SPF 记录但您的服务器未在其中列出,那么 GMail 将删除邮件。请记住,Hotmail、Google 等基本上会收集一堆垃圾邮件的证据,然后以不同的方式对其进行评分,因此不能保证任何一次更改都会让任何一个提供商的电子邮件通过,并且通常无法弄清楚为什么某些东西对他们来说似乎是“垃圾邮件”。
  • 顺便说一句,你可能会发现this existing ServerFault question很有趣;这是一个很常见的问题,而且似乎在那里得到了很好的解决。
  • 您的代码通过您的本地邮件服务器发送 - 如果您直接使用 SMTP 发送并启用调试输出 ($mail-&gt;SMTPDebug = 2;),它将为您提供更多信息。或者,只需查看您本地邮件服务器的日志文件,它就会告诉您为什么 hotmail 拒绝(或无论它在做什么)您的邮件。

标签: php phpmailer


【解决方案1】:

使用 SMTP Auth,Hotmail 就不会再抱怨了。几乎所有接收服务器都将匿名邮件视为垃圾邮件。

$mail->SMTPAuth   = true;                  // enable SMTP authentication
$mail->Host       = "mail.yourdomain.com"; // sets the SMTP server
$mail->Port       = 26;                    // set the SMTP port
$mail->Username   = "yourname@yourdomain"; // SMTP account username
$mail->Password   = "yourpassword";        // SMTP account password

但是ofc。根据您是否可以控制 SMTP,您应该确保已正确设置诸如 reverse-dns-lookup 之类的基本内容


由于 cmets 中的讨论,我想补充一点关于我的想法关于为什么 SMTP Auth 将解决此问题的信息:

如果您使用 PHPMailer 时没有定义 SMTP-Server,PHPMailer 将在mail 模式下运行,它只会调用 php 的 mail() 函数。

邮件功能本身将使用 PHP-INI 文件中配置的 smtp-settings 或默认值,此处列出:http://php.net/manual/en/mail.configuration.php

默认值:

SMTP = "localhost" 
smtp_port = "25" 

由于 OP 已经配置了本地邮件服务器(或者他为什么要设置 MX 记录?),php 现在将连接到这个 SMTP 服务器而无需身份验证。服务器将接受消息并将其发送到下一个服务器。

(使用 unix 的 sendmail 时同样适用)

chain 中的每个服务器,尤其是接收服务器现在可以看到,private SMTP 已被使用并且 no 身份验证已被使用假如。 这已经是超过 9000 的垃圾邮件分数了,因为有了这样的设置(理论上)每个人 都可以使用该服务器发送邮件! 像 only from localhost 这样的限制是 ofc。其他服务器不知道,因此 SMTP 被认为是 Open Mail Relay http://en.wikipedia.org/wiki/Open_mail_relay

将 PHPMailer 切换到 SMTP-Auth(即使仍然使用本地 SMTP 服务器)将在转发邮件时将此信息添加到服务器创建的条目中。条目将如下所示:

Received: from SERVER1 ([xxx.xxx.xxx.xx]) by mydomain.de with ESMTPA 

ESMTPA 之后的尾随 A 现在告诉接收服务器,Server1 已在 mydomain.de 上使用了有效的用户帐户来启动发送尝试,这意味着 SMTP 服务器知道 邮件的来源,并可以提供有关发件人的信息。

不过,本地 SMTP 服务器不是已知的,所以在这种情况下,它可能最终会被列入灰名单并在各种 RBL 上进行检查,在这种情况下应该没有任何问题。

如果(本地)SMTP 服务器现在通过了所有检查(反向 DNS 查找、灰名单、RBL 等等) - 即使没有使用远程 smtp,邮件也很有可能成功投递,因为服务器以及使用该服务器的发件人可以成功进行身份验证。 (否则任何公司都无法设置自己的服务器)

因此,即使没有使用远程 SMTP 服务器,使用 SMTP-Auth(或任何其他身份验证方法)也会产生影响。

经过身份验证的邮件不能保证不会被视为垃圾邮件 - 但未经身份验证的邮件在常见系统的垃圾邮件评分中肯定排名较高。

【讨论】:

  • 这是我在想的一个选项,如果我设置了 SMTP,那么我真的需要 SPF 记录吗?
  • 如果您不通过 SMTP 发送,则不会使用这些设置,因为问题中提供的代码不是。 Auth 也与垃圾邮件评分无关 - 上游接收者无法判断您最初是否使用 auth 提交。
  • 即使他是,您也无法通过查看从服务器接收到的消息来判断服务器是否是开放中继,即下游服务器无法知道消息是否最初是否使用身份验证提交。这就是为什么开放式继电器如此糟糕的原因,但它与这个问题完全没有关系。
  • 是什么让你认为他没有使用 SMTP? PHPMailer::Send() 还能如何将消息发送到 Hotmail?
  • 整个答案和这个评论线程只是对 OP 的极大干扰。您发布了许多可能适用于其他情况的内容,但这几乎与这个问题无关。您的回答没有提到他需要做的一件重要的事情,这将告诉他他的邮件到底发生了什么-查看邮件服务器日志。 OP保持沉默无济于事......
【解决方案2】:

有同样的问题。我已经检查了整个脚本 30 次。每个设置每个。并且,检查并重新检查了 dns 记录 dkim 和 spf 100 次。

没有任何效果。

我通过电子邮件向 hotmail/outlook/live 发送了有关该问题的电子邮件。我没想到会有任何帮助,但在几个小时内问题就解决了。

它不在脚本中。 Hotmail 只会阻止通过大多数网页发送的任何电子邮件。即使您的垃圾邮件声誉很好。他们已将服务器的 ip 列入白名单,问题就解决了。

如果他们检测到不良行为,他们可以将其改回。发送电子邮件有限制。如果您的服务器声誉不佳,他们不太可能将服务器添加到他们的白名单中。这可能是共享主机包的问题。您托管网站的同一台服务器上的其他人可以提高服务器的声誉。

【讨论】:

  • 我们如何联系那里的服务?
  • 我对这个联系电子邮件地址也很感兴趣。我也有同样的问题。
【解决方案3】:

您是否在实时服务器上进行过测试?如果是,你得到了什么错误? 您是否启用了 phpmailer 的调试以了解它有哪些错误?如果你不使用 SMTP,你可以用这个测试

$mail-&gt;do_debug = true;

如果您使用的是 SMTP,请使用

$mail-&gt;SMTPDebug = true;

您从调试器中得到了什么输出?您可以从那里获得问题所在的线索。

我还假设@dognose 的回答是要求您更好地使用SMTP。这样您的电子邮件就会通过身份验证,这将有助于表明您的身份已得到确认。

$mail->SMTPAuth   = true;                  // enable SMTP authentication
$mail->Host       = "mail.yourdomain.com"; // sets the SMTP server
$mail->Port       = 26;                    // set the SMTP port
$mail->Username   = "yourname@yourdomain"; // SMTP account username
$mail->Password   = "yourpassword";        // SMTP account password

如果$mail-&gt;Port = 26; 不起作用,您可以尝试$mail-&gt;Port = 25;

【讨论】:

  • 从问题中可以看出,发件人没有使用 SMTP 提交,因此 PHPMailer 的 SMTP 调试选项将不起作用,但本地邮件服务器的日志中将提供相同的信息。在本地进行身份验证对 SPF 完全没有影响。
  • @Synchro 在我的回复中,如果他不打算使用 SMTP,我可以替代他收到 PHPMailer 的错误。这样他就会知道确切的错误。
【解决方案4】:

您的 DNS 当前发布的 SPF 无效,因为您有 3 条记录!:

# dig +short txt immortalinsurance.com
"v=spf1 a mx include:smtp.secureserver.net ~all"
"v=spf1 mx mx:v=spf1 a mx include:secureserver.net ~all include:secureserver.net -all"
"\"v=spf1 a\""

第一个有效;你应该删除后两个。

如果您从 182.50.130.73 发送邮件,则此记录的内容对于您的域是正确的。 'mx' 节不是绝对必要的,因为它无论如何都指向 secureserver.net,但它可以保存接收服务器上的 DNS 查找。

【讨论】:

    【解决方案5】:

    在您开始使用 mail() 或 SMTP 发送电子邮件之前,请确保在您的 cpanel 中创建有效的发件人电子邮件帐户。

    From = "noreply@immortalinsurance.com";
    

    如果不是您发送的所有电子邮件都被标记为垃圾邮件并进入垃圾邮件,这一点非常重要。

    完成后,您必须设置域密钥和 SPF 记录。拥有专用 IP 而不是使用主机提供的共享 IP 也将有助于交付。

    最后通过 Hotmail、Yahoo 和 Gmail 等三大电子邮件提供商检查您的邮件。

    【讨论】:

      【解决方案6】:

      您可能必须逐步分解确切原因。我知道 Hotmail 正在使用基于规则的垃圾邮件过滤器(这非常严格),而 Gmail 使用的更像是一个自学系统,这可以解释为什么 Gmail 接受您的邮件而 Hotmail 不接受。

      您可以检查以下内容:

      1. spf 记录仅适用于添加 spf 记录的域,并且仅适用于从该 spf 中定义的 ips/域发送的邮件。因此,请确保您的代码是从您的 spf 中存在的服务器执行的。
      2. 使用上面建议的 SMTP 可以提高可传递性(但它实际上取决于接收者的垃圾邮件过滤器)。如果您在本地服务器上进行测试,您可以使用 SMTP 通过 spf 中定义的邮件服务器发送邮件。否则
      3. 如果您使用的邮件服务器是开放式中继,那么这可能(并且可能)是添加额外垃圾邮件点的原因。因此,请确保您使用的是封闭中继(例如,您使用的邮件服务器不允许未经身份验证的用户发送邮件)
      4. 检查您发送的邮件服务器是否不在任何黑名单上(http://mxtoolbox.com/blacklists.aspx 提供了一个很棒的工具);
      5. 使用 Gmail 中的邮件标头了解 Gmail 是否发现有任何理由在您的邮件中添加垃圾邮件点(操作方法:https://support.google.com/mail/answer/22454?hl=en)。在那里您可以找到您的 spf 是否有效(通过搜索“spf=pass”)。如果您的邮件被删除到垃圾邮件文件夹,这也可能适用于 Hotmail。
      6. 垃圾邮件过滤器应用的众多规则之一是关键字检查(我认为您的邮件包含一些关闭)、文本数量等。确保信息的整体质量良好;
      7. PHPMailer 默认使用php 的邮件功能。您可以将其更改为 sendmail($mail-&gt;isSendmail();,如果 sendmail 设置不正确,可能无法在 Windows 上运行)或者检查您的 php.ini 设置使用的邮件服务器(使用 ini_set('SMTP', 'yourhost.com'); 覆盖,但这据我所知,仅适用于 Windows)。

      【讨论】:

        【解决方案7】:

        连接数据$mail-&gt;Username的用户必须与$ mail-&gt;From相同,否则hotmail会拒绝该邮件或将其标记为垃圾邮件。

        另外,如果邮件有图片,也可以标记为垃圾邮件。

        总之,为了让一切完美,请发送不带图片的电子邮件,并且FromUsername 相同。

        【讨论】:

          猜你喜欢
          • 2013-03-20
          • 2011-01-08
          • 1970-01-01
          • 1970-01-01
          • 2016-09-23
          • 2014-11-24
          • 1970-01-01
          • 1970-01-01
          • 2014-12-10
          相关资源
          最近更新 更多