2015-10-13 63 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); 
} 

我不能告訴你肯定的,但有可能郵件規格根本不允許排長隊(儘管在實踐中他們經常使用似乎)。