从共享主机发送的电子邮件被阻止。有没有办法避免这种情况?

时间:2009-08-30 14:59:40

标签: php email shared-hosting spam spam-prevention

在我的网站上,我有一个PHP脚本,可以自动向我的客户发送有关订单的确认信息。 我的网站的域名已注册到托管我网站的公司。 我使用mail()函数向一些电子邮件帐户发送电子邮件有很多问题...我的很多用户都联系我说他们从未收到我的自动电子邮件!所以这是一个非常大的问题!

给我带来更多问题的帐户是comcast.net,uol.com,mchsi.com等等!我已经联系过这些电子邮件服务提供商的支持中心,要求从阻止列表中删除我的IP。

电子邮件的标题如下所示:

$header = "Sender: $from_mail\n";
$header .= "From: Account <$from_mail>\n";
$header .= "Reply-To: Account <$from_mail >\n";
$header .= "Content-Type: multipart/mixed; boundary=$mixed_boundary\n";
$header .= "Mime-Version: 1.0\n";
$header .= "X-Mailer: PHP/".phpversion()."\n";

$body = "\n--$mixed_boundary\n";
.
.
.
.
$body .= "\n\n--$mixed_boundary--";

mail($to, $subject, $body, utf8_encode($header), "-f$from_mail");

我可以尝试避免这个问题吗? 有人知道在哪里可以知道用于传递电子邮件的服务器的IP地址是什么,以及PHP mail()函数?

提前感谢您的回复!!!


您好,

今天仍然有一些电子邮件提供商服务,如Comcast,继续阻止我的IP地址说我的邮件服务器发送垃圾邮件......我请求从阻止列表中删除,但他们的系统继续阻止它们!我不知道我还能做什么...我已经按照你的建议和代码看起来像这样:

$md5 = md5(date('r', time()));
$mixed_boundary = "PHP-Mixed-$md5";
$alt_boundary = "PHP-Alt-$md5";

$header = "Sender: $from_mail\r\n";
$header .= "Errors-To: $from_mail\r\n";
$header .= "From: account <$from_mail>\r\n";
$header .= "Reply-To: $from_mail\r\n";
$header .= "Content-Type: multipart/mixed; boundary=$mixed_boundary\r\n";
$header .= "Mime-Version: 1.0\r\n";
$header .= "X-Mailer: PHP/".phpversion()."\r\n";

$body = "\n--$mixed_boundary\n";
$body .= "Content-Type: multipart/alternative; boundary=$alt_boundary\n";
.
.
.
.
$body .= "--$mixed_boundary\n";
$body .= "Content-Disposition: attachment filename=\"...\"\n";
$body .= "Content-Type: application/octet-stream; x-unix-mode=0644; name=\"...\"\n";
$body .= "Content-Transfer-Encoding: base64\n";
.
.
.
.
$body .= "\n\n--$mixed_boundary--";


mail($to, $subject, $body, utf8_encode($header), "-f$from_mail");

建议?

再次感谢!

6 个答案:

答案 0 :(得分:4)

让我解释一下你所面临的战斗。暂时忘掉技术细节。 那里有数百家电子邮件提供商。最重要的是Yahoo,Gmail,AOL,Hotmail等。如果您被这些服务中的任何一项阻止,您的业务可能会受到严重影响。

这些电子邮件提供商非常关注垃圾邮件,并且为了打击垃圾邮件,最终阻止了任何可能是垃圾邮件的邮件。您可能永远不会收到垃圾邮件投诉,但如果您的共享主机方案中的其他商家收到垃圾邮件投诉,您将受到影响。如果您使用可疑的垃圾邮件IP地址将邮件发送到垃圾邮件文件夹,则无论您如何配置应用程序。

即使您拥有自己的服务器,仍然会遇到问题。随着时间的推移,如果您发送电子邮件,一些收件人将点击垃圾邮件按钮。这是生活中的事实,你无法阻止它。

唯一的解决方案是将电子邮件外包给您。 Aweber或iContact等公司为您处理电子邮件递送问题。他们与所有主要电子邮件提供商建立了关系,并努力确保您的邮件进入收件人收件箱。 您不再需要担心联系雅虎或Gmail,因为有人点击了垃圾邮件按钮。你可以专注于更重要的事情。

答案 1 :(得分:3)

您可以向自己发送电子邮件并检查标题。这样可以让您了解电子邮件可能采用的路径,但实际上并没有阻止其他域的电子邮件通过不同的路径。

一般来说,那些大型互联网服务提供商拥有非常重要的垃圾邮件过滤器,因此从共享主机向他们发送邮件将变得非常困难。如果您可以获得自己的IP地址并从那里发送邮件,它可能会有所帮助。然后,您可以设置SPF records。没有保证,但这肯定会让你从商业垃圾邮件发送者的角度提升一点。

您还可以使用link text和其他一些反垃圾邮件服务进行挖掘,看看是否还有其他错误。

要求客户将您的发件人地址添加到他们的垃圾邮件白名单中可能也不会受到影响。

答案 2 :(得分:3)

根据RFC2822 Internet Message Format,您的邮件标题无效。

从2.1概述:

  

邮件分为多行字符。一条线是一系列的   用两个字符car-return分隔的字符   和换行;也就是回车(CR)字符(ASCII   值13)紧接着换行(LF)字符(ASCII   价值10)。 (回车/换行对通常写在   本文件为“CRLF”。)

正如我在评论中所指出的,无论如何,您的电子邮件可能与大多数邮件服务器一起使用的原因是他们可能会接受他们的自由。但是,可能有一些邮件服务器会丢弃您的邮件,因为它们不符合RFC2822。

编辑:虽然在mail()函数的PHP文档中提倡使用“\ r \ n”,但有一些debate about whether that's really the right thing to do

mail()函数将与本地sendmail(8)命令(或sendmail_path中配置的任何内容)进行通信,并且可以根据使用的邮件传输代理实现来不同地处理行结尾。根据我的理解,sendmail(8)应该可以使用“\ r \ n”,但qmail(7)例如将“\ r \ n”替换为“\ r \ n \ n”,这可能是打破信息。

这一切都发生在电子邮件发送到最终目的地之前,因此可以通过发送一个用“\ r \ n”构建的自己的电子邮件并验证所有标题来轻松测试行结尾是否正确处理在场。

另请参阅:RFC2822PHP mail() functionsendmail(8)qmail(7)

答案 3 :(得分:2)

我发现在某些情况下设置Return-PathSenderErrors-To标题会有所帮助。

答案 4 :(得分:0)

我注意到,在我的Linux托管服务器上,我必须在额外的头文件和混合/替代头文件中用LF替换所有出现的CRLF。关于PHP documentation说:

“如果没有收到消息,请尝试仅使用LF(\ n)。一些质量差的Unix邮件传输代理会自动将CRLF替换为LF(如果使用CRLF,则会导致CR加倍)。这应该是最后一招,因为它不符合»RFC 2822。“

我已尝试向我的个人帐户发送邮件(仅限“\ n”),并且我在原始邮件中查找了“\ r”和“\ n”...每行都以一个CR并以“\ n”开头!

问题:正如PHP mail()文档所说,我使用wordwrap()函数将行长度剪切为70个字符。 有一种解决方法可让邮件客户端以原始格式显示邮件,而不是每行显示不超过70个字符的列?

答案[解决方案]:我已解决设置quoted-printable为Content-Transfer-Encoding:

$body .= "Content-Transfer-Encoding: quoted-printable\n";
$body .= "Content-Type: text/plain;\n\tcharset=utf-8;\n\tformat=flowed;\n\tdelsp=yes\n";

$body .= "\n" . quoted_printable_encode($message);

quoted_printable_encode()函数仅适用于PHP 5.3,该实现适用于documentation page

答案 5 :(得分:0)

使用PHPMailer(http://phpmailer.worxware.com/)构建电子邮件。也许这不是IP,而是其他东西。有很多东西,垃圾邮件过滤器反应过敏(如缺少消息ID等)。再加上PHPMailer,你有机会通过mail()发送你的邮件,或者由于通过SMTP通过其他主机(如Gmail)的共享托管问题而无法工作。