3

在我的网站中,我有一个 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");

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

提前感谢您的回复!!!


你好,

直到今天,一些电子邮件提供商服务(例如 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");

建议?

再次感谢!

4

6 回答 6

4

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

这些电子邮件提供商非常关注垃圾邮件,为了打击垃圾邮件,他们已经走到了极端,阻止任何可能是垃圾邮件的邮件。您可能永远不会收到垃圾邮件投诉,但如果您的共享托管计划中的另一家企业收到垃圾邮件投诉,您将受到影响。如果您使用可疑的垃圾邮件 IP 地址,您如何配置应用程序并不重要,您的邮件将被发送到垃圾邮件文件夹。

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

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

于 2009-10-25T19:12:59.237 回答
3

你可以给自己发一封电子邮件并检查标题。这将使您了解电子邮件可能采用的路径,但实际上没有什么可以阻止发送到其他域的电子邮件通过不同的路径。

一般来说,那些大型 ISP 具有非常强大的垃圾邮件过滤器,因此从共享主机向它们发送邮件将会很困难。如果您可以获取自己的 IP 地址并从那里发送邮件,它可能会有所帮助。然后就可以设置SPF 记录了。不能保证,但这肯定会让您脱离商业垃圾邮件发送者的陷阱。

您还可以对链接文本和其他一些反垃圾邮件服务进行一些挖掘,看看您是否做错了什么。

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

于 2009-08-30T15:06:35.353 回答
3

根据RFC2822 Internet 邮件格式,您的邮件标头无效。

从 2.1 概述:

消息被分成多行字符。行是由回车和换行这两个字符分隔的一系列字符;即,回车 (CR) 字符(ASCII 值 13)紧跟换行 (LF) 字符(ASCII 值 10)。(回车/换行对在本文档中通常写为“CRLF”。)

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

编辑:虽然在邮件()函数的 PHP 文档中提倡使用“\r\n”,但对于这是否真的是正确的做法存在一些争论

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

这一切都发生在电子邮件被传递到其最终目的地之前,因此可以通过向自己发送一个由“\r\n”构造的电子邮件消息并验证所有标题是否存在,可以很容易地测试行尾是否被正确处理。

参见:RFC2822 , PHP mail() 函数, sendmail(8) , qmail(7)

于 2009-08-30T15:24:33.043 回答
2

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

于 2009-08-30T15:42:41.447 回答
0

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

于 2009-10-22T10:11:51.950 回答
0

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

“如果没有收到消息,请尝试仅使用 LF (\n)。一些质量较差的 Unix 邮件传输代理会自动将 LF 替换为 CRLF(如果使用 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 中可用,该实现适用于文档页面

于 2009-10-22T09:35:43.250 回答