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。
我发送的电子邮件的内容传输编码有一个奇怪的问题。
在其中添加以下行:
$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。