3

我有的:

我正在使用 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

我的问题:

Spam Assassin 的惩罚为 0.1,原因如下:

0.1 FROM_EXCESS_BASE64 来自:base64 编码不必要

我的问题:

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

4

3 回答 3

3

您需要检测是否真的需要使用 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检测字符集,但此正则表达式使其简短。

于 2017-07-27T10:46:17.200 回答
0

我在 MySQL 数据库中存储为 UTF-8 的 $from_names 遇到了同样的问题。当 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 编码时,Spam Assassin 仍在应用惩罚,但这是 Spam Assassin 中的一个错误,已在上游修复:

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

于 2020-02-26T19:29:18.670 回答
-1

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

关于PHP.net

我不认为它是作为 $from_name 进来的二进制数据

于 2012-10-23T11:05:28.823 回答