代码之家  ›  专栏  ›  技术社区  ›  BitDrink

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

  •  2
  • BitDrink  · 技术社区  · 16 年前

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

    建议?

    再次感谢!

    6 回复  |  直到 15 年前
        1
  •  3
  •   Inshallah    16 年前

    根据,您的邮件头无效 RFC2822 Internet Message Format .

    从2.1概述:

    消息被分成若干行字符。一条线是一系列 用两个字符的回车分隔的字符 和换行符;即回车(CR)字符(ASCII 值13),后跟换行(LF)字符(ASCII) 值10)。(回车/换行对通常写入 此文档为“CRLF”。)

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

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

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

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

    参见: RFC2822 ,请 PHP mail() function ,请 SeNemail(8) ,请 Qmail(7)

        2
  •  4
  •   codingguy3000    15 年前

    我来解释一下你面临的战斗。先别管技术细节了。 有数百家电子邮件提供商。最大的是雅虎、Gmail、AOL、Hotmail等。如果这些服务中的任何一个被阻止,您的业务都可能受到严重影响。

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

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

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

        3
  •  3
  •   easel    16 年前

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

    一般来说,那些大的ISP有很重的垃圾邮件过滤器,所以从共享主机发邮件给他们会很困难。如果你能从那里得到你自己的IP地址并发送邮件,这可能会有所帮助。然后你可以设置 SPF records . 没有保证,但这肯定会让你从商业垃圾邮件制造者的陷阱中走出来。

    你也可以用 link text 以及其他一些反垃圾邮件服务,看看你是否做错了什么。

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

        4
  •  2
  •   ceejayoz    16 年前

    我找到了那个场景 Return-Path ,请 Sender Errors-To 在某些情况下,标题有帮助。

        5
  •  0
  •   Felix    16 年前

    使用PHPMailer( http://phpmailer.worxware.com/ )用于生成电子邮件。也许不是IP,而是别的什么。有很多事情,垃圾邮件过滤器的反应过敏(如丢失消息ID等)。另外,使用phpmailer,您还可以通过mail()发送邮件,或者如果由于其他主机(如gmail)上的smtp共享托管问题而无法正常工作。

        6
  •  0
  •   BitDrink    16 年前

    我注意到,对于我的Linux主机服务器,我必须在额外的头文件和混合/可选的头文件中用LF替换所有出现的CRLF。关于那个 PHP documentation 说:

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

    我试图将一封邮件(仅使用“\n”)发送到我的个人帐户,并且在原始邮件中查找了“\r”和“\n”…每行以CR结尾,并以“\n”开头!

    问题: 正如php mail()文档所述,我使用wordwarp()函数将行长度缩短为70个字符。 有一个解决方案可以让邮件客户端以其原始格式显示邮件,而不是以每行长度不超过70个字符的列的形式显示邮件?

    回答[解决方案]: 我已经解决了将引用的可打印文件设置为内容传输编码:

    $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);
    

    引用的_printable_encode()函数仅在php 5.3中可用,该实现适用于 documentation page .