2015-10-13 55 views
1

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

在添加以下行:

$mail->Encoding = '8bit'; 

在我的代码,但引用可打印发送的电子邮件...

在源:

Content-Transfer-Encoding: quoted-printable 

我不t知道如何做我的电子邮件与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 = '[email protected]_domain.com'; 
$mail->Password = 'my_password'; 
$mail->SMTPSecure = ''; 
$mail->Port  = 25; 
$mail->From  = '[email protected]_domain.com'; 
$mail->FromName = 'bla'; 
$mail->addAddress('[email protected]'); 
$mail->addReplyTo('[email protected]_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(); 

非常感谢帮忙

+1

请问您可以添加完整的电子邮件代码 – Mitul

回答

3

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

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

仅仅因为你经常能够逃避这一点,你不应该,只要在Postel's law的基础上。

+0

可以用$ mail-> WordWrap做这个工作吗? – Macbernie

+0

事实上,只有非常小的内容,Content-Transfer-Encoding:8bit!但是有了一个真正的大html内容,我该怎么做?.. :( – Macbernie

+1

你可以试一试'WordWrap',但是你可能会发现边缘情况,增加的换行符会阻止HTML正常工作,或者导致客户端浏览器兼容性问题,所以你可能更喜欢强加自己的策略,或者只是简化你的内容,如果你的HTML大于30K左右,你应该考虑简化它。 – Synchro

1

我怀疑这是故意的。你可能达不到这个线的代码中\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); 
} 

我不能告诉你肯定的,但有可能邮件规格根本不允许排长队(尽管在实践中他们经常使用似乎)。