PHP邮件头“不必要地编码base64”

时间:2012-10-23 11:02:16

标签: php email base64 spam

我拥有的:

我正在使用PHP邮件功能发送电子邮件。我的标题如下:

    <?php
    $headers = "MIME-Version: 1.0\r\n"
               ."Content-Type: text/plain; charset=utf-8\r\n"
               ."Content-Transfer-Encoding: 8bit\r\n"
               ."From: =?UTF-8?B?". base64_encode($from_name) 
               ."?= <$from_address>\r\n"
               ."X-Mailer: PHP/". phpversion();
    mail($to, $subject, $body, $headers, "-f $from_address");
    ?>

此代码来自可接受的stackoverflow答案:https://stackoverflow.com/a/2801159/835950

我的问题:

垃圾邮件刺客因以下原因应用0.1罚款:

  

0.1 FROM_EXCESS_BASE64来自:不必要的base64编码

我的问题:

我应该如何修改标题以避免这种惩罚。我只是删除base64_encode函数吗?

3 个答案:

答案 0 :(得分:1)

您需要检测是否确实需要base64编码的UTF-8,或者是否所有字符都在ASCII范围内。这有点难看,但有效:

<?php
$headers = "MIME-Version: 1.0\r\n"
           ."Content-Type: text/plain; charset=utf-8\r\n"
           ."Content-Transfer-Encoding: 8bit\r\n"
           ."From: ".(preg_match('/[^\x20-\x7f]/', $from_name)?
            "=?UTF-8?B?". base64_encode($from_name) ."?=" : $from_name )
           ." <$from_address>\r\n"
           ."X-Mailer: PHP/". phpversion();
mail($to, $subject, $body, $headers, "-f $from_address");
?>

或者,您可以使用mb_check_encoding检测字符集,但此正则表达式会使其缩短。

答案 1 :(得分:0)

我在$ from_names上遇到了同样的问题,该问题以UTF-8的形式存储在MySQL数据库中。当像这样的解决方案不需要base64编码时,我可以避免0.01的惩罚:

<?php
function encode_from($s) {
    if (mb_check_encoding($s, 'ASCII'))
        return mb_convert_encoding($s, 'ASCII', 'UTF-8');
    else
        return "=?utf-8?b?".base64_encode($s)."?=";
}
$headers = "MIME-Version: 1.0\r\n"
           ."Content-Type: text/plain; charset=utf-8\r\n"
           ."Content-Transfer-Encoding: 8bit\r\n"
           ."From: " . encode_from($from_name)
           ." <$from_address>\r\n"
           ."X-Mailer: PHP/". phpversion();
mail($to, $subject, $body, $headers, "-f $from_address");
?>

当确实需要UTF-8编码时,垃圾邮件刺客仍然会受到惩罚,但这是垃圾邮件刺客中的一个错误,该错误已在上游修复:

https://bz.apache.org/SpamAssassin/show_bug.cgi?id=7730

答案 2 :(得分:-1)

我会删除base64编码并试一试。

关于PHP.net

我不认为它的二进制数据是$ from from