phpMailer 没有到达 Hotmail?
phpMailer not arriving in Hotmail?
设置 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
这些配置都正确吗?
使用 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
但是当然。根据您是否可以控制您的 SMTP,您应该确保正确设置了诸如反向 dns 查找之类的基本内容
由于评论中的讨论,我想添加更多关于我的想法的信息为什么 SMTP Auth 会解决这个问题:
如果您使用的 PHPMailer 没有定义 SMTP-Server,PHPMailer 将在 mail
模式下运行,这将调用 mail()
php 的函数。
邮件功能本身将使用 PHP-INI 文件中配置的 smtp 设置,或此处列出的默认值:http://php.net/manual/en/mail.configuration.php
默认值:
SMTP = "localhost"
smtp_port = "25"
由于 OP 已经配置了本地邮件服务器(或者他为什么要设置 MX 记录?),php 现在将无需身份验证即可连接到此 SMTP 服务器。服务器将接受消息并将其发送到下一个服务器。
(如果使用 unix 的 sendmail,同样适用)
链中的每个服务器,尤其是接收服务器现在可以看到,私有 SMTP 已被使用并且no 已提供身份验证。
这已经是 Spam-Score 超过 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(或任何其他身份验证方法)也会产生影响。
经过身份验证的邮件并不能保证不被视为垃圾邮件 - 但未经身份验证的邮件在常见系统的垃圾邮件分数中肯定排名较高。
您是否在实时服务器上进行过测试?如果是,您遇到了什么错误?
您是否启用了 phpmailer 的调试以了解它有什么错误?如果您不使用 SMTP,则可以使用此
进行测试
$mail->do_debug = true;
如果您使用的是 SMTP,则使用
$mail->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->Port = 26;
不起作用,您可以尝试 $mail->Port = 25;
。
您的 DNS 当前发布的 SPF 无效,因为您有三个记录!:
# 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 查找。
在您开始使用 mail() 或 SMTP 发送电子邮件之前,请确保您在您的 cpanel 中创建了有效的发件人电子邮件帐户。
From = "noreply@immortalinsurance.com";
如果不是您发送的所有电子邮件都会被标记为垃圾邮件并进入垃圾邮件,这一点非常重要。
完成后,您必须设置域密钥和 SPF 记录。拥有专用 IP 而不是使用主机提供的共享 IP 也将有助于交付。
最后通过 Hotmail、Yahoo 和 Gmail 等三大电子邮件提供商检查您的邮件。
您可能必须逐步分解确切原因。我知道 Hotmail 正在使用基于规则的垃圾邮件过滤器(非常严格),而 Gmail 使用的更像是一个 self-learning 系统,这可以解释为什么 Gmail 接受您的邮件而 Hotmail 不接受。
您可以检查以下内容:
- A spf-record 仅适用于添加 spf 记录的域,并且仅适用于从该 spf 中定义的 ips/domains 发送的邮件。因此,请确保您的代码是从您的 spf 中存在的服务器执行的。
- 按照上面的建议使用 SMTP 可以提高可交付性(但这实际上取决于收件人的垃圾邮件过滤器)。如果您在本地服务器上进行测试,则可以使用 SMTP 通过 spf.conf 文件中定义的邮件服务器发送邮件。否则
- 如果您使用的邮件服务器是开放中继,那么这可能(并且很可能)成为添加额外垃圾邮件点的原因。因此,请确保您使用的是封闭中继(例如,您使用的邮件服务器不允许向未经身份验证的用户发送邮件)
- 检查您发送的邮件服务器是否不在任何黑名单中(http://mxtoolbox.com/blacklists.aspx 提供了一个很好的工具);
- 使用 Gmail 中的邮件 headers 来查明 Gmail 是否认为有任何理由将垃圾邮件点添加到您的邮件中(Howto:https://support.google.com/mail/answer/22454?hl=en)。您可以在那里找到您的 spf 是否有效(通过搜索 'spf=pass')。如果您的邮件将被删除到垃圾邮件文件夹,这也可能适用于 Hotmail。
- spamfilter 应用的众多规则之一是关键字检查(我认为您的邮件包含一些关闭)、文本量等。确保消息的整体质量良好;
- PHPMailer 默认使用 php 的邮件功能。您可以将其更改为 sendmail(
$mail->isSendmail();
,如果 sendmail 设置不正确,可能无法在 Windows 上工作)或者检查您的 php.ini 使用的邮件服务器的设置(使用ini_set('SMTP', 'yourhost.com');
覆盖,但据我所知,这仅适用于 Windows。
有同样的问题。我已经检查了整个脚本 30 次。每个设置每个。并且,检查并重新检查 dns 记录 dkim 和 spf 100 次。
没有任何效果。
我就这个问题通过电子邮件 hotmail/outlook/live 发了邮件。我没想到会得到任何帮助,但在几个小时内问题就解决了。
剧本中没有。 Hotmail 只会阻止通过大多数网页发送的任何电子邮件。即使您的垃圾邮件信誉良好。他们已经把服务器的ip加入了白名单,问题就解决了。
如果他们检测到不良行为,他们可以将其改回。发送电子邮件有限制。如果您的服务器声誉不佳,他们不太可能将该服务器添加到他们的白名单中。这可能是共享托管包的问题。您托管网站的同一台服务器上的其他人可以提高服务器的声誉。
连接数据 $mail->Username
的用户必须与 $ mail->From
相同,否则 hotmail 会拒绝邮件或将其标记为垃圾邮件。
此外,如果邮件中有图片,也可以将其标记为垃圾邮件。
总而言之,为了一切都完美,请发送不带图像的电子邮件,并且 From
与 Username
相同。
设置 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
这些配置都正确吗?
使用 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
但是当然。根据您是否可以控制您的 SMTP,您应该确保正确设置了诸如反向 dns 查找之类的基本内容
由于评论中的讨论,我想添加更多关于我的想法的信息为什么 SMTP Auth 会解决这个问题:
如果您使用的 PHPMailer 没有定义 SMTP-Server,PHPMailer 将在 mail
模式下运行,这将调用 mail()
php 的函数。
邮件功能本身将使用 PHP-INI 文件中配置的 smtp 设置,或此处列出的默认值:http://php.net/manual/en/mail.configuration.php
默认值:
SMTP = "localhost"
smtp_port = "25"
由于 OP 已经配置了本地邮件服务器(或者他为什么要设置 MX 记录?),php 现在将无需身份验证即可连接到此 SMTP 服务器。服务器将接受消息并将其发送到下一个服务器。
(如果使用 unix 的 sendmail,同样适用)
链中的每个服务器,尤其是接收服务器现在可以看到,私有 SMTP 已被使用并且no 已提供身份验证。 这已经是 Spam-Score 超过 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(或任何其他身份验证方法)也会产生影响。
经过身份验证的邮件并不能保证不被视为垃圾邮件 - 但未经身份验证的邮件在常见系统的垃圾邮件分数中肯定排名较高。
您是否在实时服务器上进行过测试?如果是,您遇到了什么错误? 您是否启用了 phpmailer 的调试以了解它有什么错误?如果您不使用 SMTP,则可以使用此
进行测试$mail->do_debug = true;
如果您使用的是 SMTP,则使用
$mail->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->Port = 26;
不起作用,您可以尝试 $mail->Port = 25;
。
您的 DNS 当前发布的 SPF 无效,因为您有三个记录!:
# 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 查找。
在您开始使用 mail() 或 SMTP 发送电子邮件之前,请确保您在您的 cpanel 中创建了有效的发件人电子邮件帐户。
From = "noreply@immortalinsurance.com";
如果不是您发送的所有电子邮件都会被标记为垃圾邮件并进入垃圾邮件,这一点非常重要。
完成后,您必须设置域密钥和 SPF 记录。拥有专用 IP 而不是使用主机提供的共享 IP 也将有助于交付。
最后通过 Hotmail、Yahoo 和 Gmail 等三大电子邮件提供商检查您的邮件。
您可能必须逐步分解确切原因。我知道 Hotmail 正在使用基于规则的垃圾邮件过滤器(非常严格),而 Gmail 使用的更像是一个 self-learning 系统,这可以解释为什么 Gmail 接受您的邮件而 Hotmail 不接受。
您可以检查以下内容:
- A spf-record 仅适用于添加 spf 记录的域,并且仅适用于从该 spf 中定义的 ips/domains 发送的邮件。因此,请确保您的代码是从您的 spf 中存在的服务器执行的。
- 按照上面的建议使用 SMTP 可以提高可交付性(但这实际上取决于收件人的垃圾邮件过滤器)。如果您在本地服务器上进行测试,则可以使用 SMTP 通过 spf.conf 文件中定义的邮件服务器发送邮件。否则
- 如果您使用的邮件服务器是开放中继,那么这可能(并且很可能)成为添加额外垃圾邮件点的原因。因此,请确保您使用的是封闭中继(例如,您使用的邮件服务器不允许向未经身份验证的用户发送邮件)
- 检查您发送的邮件服务器是否不在任何黑名单中(http://mxtoolbox.com/blacklists.aspx 提供了一个很好的工具);
- 使用 Gmail 中的邮件 headers 来查明 Gmail 是否认为有任何理由将垃圾邮件点添加到您的邮件中(Howto:https://support.google.com/mail/answer/22454?hl=en)。您可以在那里找到您的 spf 是否有效(通过搜索 'spf=pass')。如果您的邮件将被删除到垃圾邮件文件夹,这也可能适用于 Hotmail。
- spamfilter 应用的众多规则之一是关键字检查(我认为您的邮件包含一些关闭)、文本量等。确保消息的整体质量良好;
- PHPMailer 默认使用 php 的邮件功能。您可以将其更改为 sendmail(
$mail->isSendmail();
,如果 sendmail 设置不正确,可能无法在 Windows 上工作)或者检查您的 php.ini 使用的邮件服务器的设置(使用ini_set('SMTP', 'yourhost.com');
覆盖,但据我所知,这仅适用于 Windows。
有同样的问题。我已经检查了整个脚本 30 次。每个设置每个。并且,检查并重新检查 dns 记录 dkim 和 spf 100 次。
没有任何效果。
我就这个问题通过电子邮件 hotmail/outlook/live 发了邮件。我没想到会得到任何帮助,但在几个小时内问题就解决了。
剧本中没有。 Hotmail 只会阻止通过大多数网页发送的任何电子邮件。即使您的垃圾邮件信誉良好。他们已经把服务器的ip加入了白名单,问题就解决了。
如果他们检测到不良行为,他们可以将其改回。发送电子邮件有限制。如果您的服务器声誉不佳,他们不太可能将该服务器添加到他们的白名单中。这可能是共享托管包的问题。您托管网站的同一台服务器上的其他人可以提高服务器的声誉。
连接数据 $mail->Username
的用户必须与 $ mail->From
相同,否则 hotmail 会拒绝邮件或将其标记为垃圾邮件。
此外,如果邮件中有图片,也可以将其标记为垃圾邮件。
总而言之,为了一切都完美,请发送不带图像的电子邮件,并且 From
与 Username
相同。