2009-08-30 103 views
1

在我的网站上我有一个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()函数?

在此先感谢您的回复!


嗨,

今天仍然有些电子邮件提供商的服务,如康卡斯特,继续挡住了我的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"); 

建议?

再次感谢!

+0

看看mail()函数的PHP文档,它们的标头用“\ r \ n”分隔,而不是像你的例子中的“\ n”。可能是规范要求“\ r \ n”,但是您的方法仍然有效,因为某些邮件服务器在接受方面是自由的。 – Inshallah 2009-08-30 15:09:33

+0

果然,PHP文档说只是“\ n”不符合RFC 2822(Internet邮件格式) – Inshallah 2009-08-30 15:12:04

+0

,但“\ r \ n”分隔符是用于asp服务器吗?或不?我认为PHP服务器使用“\ n”作为新行字符! – BitDrink 2009-08-30 15:13:16

回答

3

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

从2.1概述:

信息分为行字符。一行是一系列 字符,用两个字符carriage-return 和换行符分隔;即紧跟换行符(LF)字符(ASCII 值10)的回车(CR)字符(ASCII 值13)。(该回车/换行符对通常写在 本文为“CRLF”)。

正如我在评论中指出,为什么你的电子邮件可能与大多数邮件服务器反正工作的原因是他们可以接受他们的自由。可能有一些邮件服务器会丢弃你的邮件,因为它们不符合RFC2822。

编辑:虽然使用“\ r \ n”在PHP文档中提倡使用mail()函数,但有一些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 \ r \ n”,这可能会破坏该信息。

这一切都发生在电子邮件发送到其最终目的地之前,因此可以通过发送自己用“\ r \ n”构造的电子邮件并通过验证所有电子邮件标题存在。

参见:RFC2822PHP mail() functionsendmail(8)qmail(7)

+0

我有很多成功的发送电子邮件的正确的SPF记录,并使用PHP梅勒 – meme 2009-10-25 16:07:46

3

你可以给自己发一封电子邮件并检查标题。这将给你一个电子邮件可能采取的路径的想法,但真的没有什么阻止电子邮件到其他域通过不同的路径。

一般来说,那些大型的ISP具有真正的重型垃圾邮件过滤器,所以从共享主机向他们发送邮件将非常困难。如果你能得到你自己的IP地址并从那里发送邮件,它可能会有帮助。那么你可以设置SPF records。没有保证,但这肯定会让你摆脱商业垃圾邮件发送者的坑。

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

要求客户将你的发件人地址添加到他们的垃圾邮件白名单可能也不会伤害。

+0

谢谢! 是的,我试图给自己发送很多电子邮件,我无法找到如何改进我的标题......对于我来说一切正常! 关于与共享主机的垃圾邮件过滤器,你是对的! 您关于要求客户将我的域名添加到他们的“安全发件人”列表的建议是我在我的网站上撰写的内容......但是没有任何用户接受此建议! :-( – BitDrink 2009-08-30 15:19:48

2

我发现,设置Return-PathSenderErrors-To头在某些情况下帮助。

+0

返回路径和发件人设置!但我没有想过设置错误,以标题太多,所以谢谢! ) – BitDrink 2009-08-30 16:33:34

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个字符的列?

ANSWER [溶液]:我已经解决了设置引用可打印作为内容传送编码:

$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

0

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

+0

谢谢您的回复!我尝试过使用PHPMailer,但原始信息看起来像我手写的那个...没有任何改进!然而,矿是一个滥用问题,所以我认为,如果我移动我的网站在虚拟服务器上,或者我购买了静态IP,我可以解决这个问题。 – BitDrink 2009-10-22 11:53:51

3

让我解释一下你面对的战斗。暂时忘记技术细节。 那里有数百个电子邮件提供商。最大的是雅虎,Gmail,美国在线,Hotmail等。如果您被这些服务中的任何一个拦截,您的业务可能会受到严重影响。

这些电子邮件提供商非常关注垃圾邮件,并且为了防止垃圾邮件已经发挥了阻止任何可能是垃圾邮件的极端的作用。您可能永远不会收到垃圾邮件投诉,但如果您的共享托管计划中的其他业务受到垃圾邮件投诉,您将受到影响。如果您使用的是可疑垃圾邮件IP地址,则将邮件发送到垃圾邮件文件夹的方式与配置应用程序无关。

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

唯一的解决办法是外包给你电子邮件传送。像Aweber或iContact这样的公司为您处理电子邮件传送问题。他们与所有主要电子邮件供应商有关系,并努力确保您的邮件进入收件人收件箱。 您再也不用担心联系雅虎或Gmail,因为有人点击垃圾邮件按钮。你可以专注于更重要的事情。

+0

非常感谢您的回答! – BitDrink 2009-10-25 19:18:40

相关问题