PHPMailer 编码 8 位

PHPMailer Encoding 8 bit

我发送的电子邮件的内容传输编码有一个奇怪的问题。

在其中添加以下行:

$mail->Encoding = '8bit';

在我的代码中,但是使用 quoted-printable 发送的电子邮件...

来源:

Content-Transfer-Encoding: quoted-printable

我不知道如何发送带有 8 位内容传输编码的电子邮件...

$mail->Encoding = '8bit';好像不行...

全部代码:

$mail             = new PHPMailer;

$mail->SMTPDebug  = 3;

$mail->isSMTP();
$mail->setLanguage('fr', './PHPMailer/language/');

$mail->CharSet    = 'UTF-8';
$mail->Encoding   = '8bit';
$mail->Host       = 'my_domain.com';
$mail->SMTPAuth   = true;
$mail->Username   = 'news@my_domain.com';
$mail->Password   = 'my_password';
$mail->SMTPSecure = '';
$mail->Port       = 25;
$mail->From       = 'news@my_domain.com';
$mail->FromName   = 'bla';
$mail->addAddress('my@mail.net');
$mail->addReplyTo('news@my_domain.com', 'bla');
$mail->AddCustomHeader("Content-Transfer-Encoding: 8bit\r\n");
$mail->WordWrap   = 10000;
$mail->isHTML(true);
$mail->Subject    = 'Subject';
$mail->Body       = 'bla';
$mail->AltBody    = "bla";

$mail->send();

非常感谢您的帮助

我怀疑这是故意的。您可能在 \PHPMailer::createBody():

中点击了这行代码
//If lines are too long, and we're not already using an encoding that will shorten them,
//change to quoted-printable transfer encoding
if ('base64' != $this->Encoding and self::hasLineLongerThanMax($this->Body)) {
    $this->Encoding = 'quoted-printable';
    $bodyEncoding = 'quoted-printable';
}

... 其中行长度限制被硬编码为 1000:

/**
 * Detect if a string contains a line longer than the maximum line length allowed.
 * @param string $str
 * @return boolean
 * @static
 */
public static function hasLineLongerThanMax($str)
{
    //+2 to include CRLF line break for a 1000 total
    return (boolean)preg_match('/^(.{'.(self::MAX_LINE_LENGTH + 2).',})/m', $str);
}

我不能肯定地告诉你,但有可能邮件规范根本不允许长行(即使在实践中它们通常 似乎 有效)。

是的,我写了那个代码。 RFC5322 section 2.1.1 在电子邮件消息中施加硬性行长度限制(这是规范中的必须要求)。如果您指定的编码不允许在不改变内容的情况下改变行长度(例如 8bit),PHPMailer 会自动切换到 quoted-printable 编码。这种方法意味着通过编码保留您的确切内容,同时允许换行。

如果您想避免这种情况,请换行(或以其他方式减少)您的行长度,使其少于 998 个字符。

仅仅因为你经常能够逃脱惩罚,你不应该,如果只是基于 Postel's law