2017-04-27 97 views
1

我最近更新了我們古老的郵件功能PHPMailer。一切正常,但現在我遇到了BCC問題。當我添加一個或多個與不會忽略PHPMailer BCC破壞格式

$mail->AddBCC($arr["bcc"]); 

電子郵件格式被破壞。電子郵件將是這樣的:

添加自定義標題doesn't更好地工作,因爲當時我得到的錯誤

Could not instantiate mail function. 

BCC將正常工作,如果它也不會轉回去銷燬電子郵件的格式。

編輯:

這是發送電子郵件的整個功能。

$adressen=mail_get_adressen_name(); 
if(!isset($arr["send_to"])) 
{ 
    return array("fehler"=>"Kein Empfänger angegeben"); 
} 
if(!isset($arr["subject"])) 
{ 
    $arr["subject"]=""; 
} 
if(!isset($arr["from"])) 
{ 
    return array("fehler"=>"Kein Absender angegeben"); 
} 
if(!isset($arr["disposition"])) 
{ 
    $arr["disposition"]=false; 
} 
if(!isset($arr["message"])) 
{ 
    $arr["message"]=""; 
} 
if(!isset($arr["message_nohtml"]) or $arr["message_nohtml"]=="") 
{ 
    $arr["message_nohtml"]=strip_tags(str_ireplace(array("<br />","<br>","<br/>","<li>"), "\r\n", $arr["message"])); 
} 
if(!isset($arr["cc"])) 
{ 
    $arr["cc"]=""; 
} 
else 
{ 
    if(trim($arr["cc"])!="") 
    { 
     if(!stristr($arr["cc"],"@") && strlen($arr["cc"])<4) 
     { 
      $arr["cc"].="@......."; 
     } 
    } 
} 
if(!isset($arr["bcc"])) 
{ 
    $arr["bcc"]=""; 
} 
else 
{ 
    if(trim($arr["bcc"])!="") 
    { 
     if(!stristr($arr["bcc"],"@") && strlen($arr["bcc"])<4) 
     { 
      $arr["bcc"].="@......"; 
     } 
    } 
} 
if(!stristr($arr["send_to"],"@") && strlen($arr["send_to"])<4) 
{ 
    $arr["send_to"].="@......."; 
} 
if(!stristr($arr["from"],"@") && strlen($arr["from"])<4) 
{ 
    $arr["from"].="@........."; 
} 
$anhang=cache_get(HR_USER,$window,"MAIL_ANHANG",$arr); 
$arr["message"]=convert_text_to_utf8($arr["message"]); 
$arr["message_nohtml"]=convert_text_to_utf8($arr["message_nohtml"]); 
$arr["subject"]=convert_text_to_utf8($arr["subject"]); 
$arr["message"]=iconv("UTF-8","Windows-1252",$arr["message"]); 
$arr["message_nohtml"]=iconv("UTF-8","Windows-1252",$arr["message_nohtml"]); 
$arr["subject"]=iconv("UTF-8","Windows-1252",$arr["subject"]); 
$mail = new PHPMailer; 
if(isset($adressen[strtolower($arr["from"])])) 
{ 
    $mail->setFrom($arr["from"],iconv("UTF-8","Windows-1252",convert_text_to_utf8($adressen[strtolower($arr["from"])]))); 
} 
else 
{ 
    $mail->setFrom($arr["from"]); 
} 
if(stristr($arr["send_to"],",")) 
{ 
    $arr2=explode(",",$arr["send_to"]); 
    foreach($arr2 as $val) 
    { 
     if(isset($adressen[strtolower($val)])) 
     { 
      $mail->addAddress($val,iconv("UTF-8","Windows-1252",convert_text_to_utf8($adressen[strtolower($val)]))); 
     } 
     else 
     { 
      $mail->addAddress($val); 
     } 
    } 
} 
else 
{ 
    if(isset($adressen[strtolower($arr["send_to"])])) 
    { 
     $mail->addAddress($arr["send_to"],iconv("UTF-8","Windows-1252",convert_text_to_utf8($adressen[strtolower($arr["send_to"])]))); 
    } 
    else 
    { 
     $mail->addAddress($arr["send_to"]); 
    } 
} 
if($arr["cc"]!="") 
{ 
    if(stristr($arr["cc"],",")) 
    { 
     $arr2=explode(",",$arr["cc"]); 
     foreach($arr2 as $val) 
     { 
      if(isset($adressen[strtolower($val)])) 
      { 
       $mail->AddCC($val,iconv("UTF-8","Windows-1252",convert_text_to_utf8($adressen[strtolower($val)]))); 
      } 
      else 
      { 
       $mail->AddCC($val); 
      } 
     } 
    } 
    else 
    { 
     if(isset($adressen[strtolower($arr["cc"])])) 
     { 
      $mail->AddCC($arr["cc"],iconv("UTF-8","Windows-1252",convert_text_to_utf8($adressen[strtolower($arr["cc"])]))); 
     } 
     else 
     { 
      $mail->AddCC($arr["cc"]); 
     } 
    } 
} 
if(trim($arr["bcc"])!="" and HR_USER=="add") 
{ 
    $mail->AddBCC($arr["bcc"]); 
} 
if(isset($adressen[strtolower($arr["from"])])) 
{ 
    $mail->addReplyTo($arr["from"],iconv("UTF-8","Windows-1252",convert_text_to_utf8($adressen[strtolower($arr["from"])]))); 
} 
else 
{ 
    $mail->addReplyTo($arr["from"]); 
} 

$mail->isHTML(true); 

$mail->Subject = $arr["subject"]; 
$mail->Body = $arr["message"]; 
$mail->AltBody = $arr["message_nohtml"]; 

if($arr["disposition"]) 
{ 
    $mail->ConfirmReadingTo = $arr["from"]; 
} 
if(is_array($anhang)) 
{ 
    foreach($anhang as $val) 
    { 
     $mail->addAttachment($val["pfad"],$val["name"]); 
    } 
} 
if($mail->send()) 
{ 
    return array("fehler"=>""); 
} 
else 
{ 
    err($mail->ErrorInfo); 
    return array("fehler"=>"Mail versand fehlgeschlagen. Bitte melden Sie sich bei der EDV.<br>".$mail->ErrorInfo); 
} 

當我發送電子郵件,而不BCC它看起來像這樣(我不得不刪除一些文本):

Für Sie wurde ein Vorgang zu Auftrag 11EDV erstellt. 
Vorgang öffnen 

Kategorie: 
EDV Entwicklung 

Vorgangs-Bemerkung: 
Gibt es eine Möglichkeit, eine E-Mail mit einer Auftragsbestätigung als Anhang direkt im HIS als Auftragsbestätigung hochzuladen? 
Momentan müssen wir die PDF ja auf dem PC zwischenspeichern und dann im HIS als Event Anhang hochladen. 

letzte Event-Bemerkung von hoj: 
Anregung von ....some name.... 


.......some footer..... 

當我添加一個或多個BCC不會忽略同一個電子郵件看起來是這樣的:

Planung (intern) (EDV Entwicklung) Dokumentnummer: 11EDV - 75, BVNR: 71122 
.....my email adress...... 
27.04.2017 11:24 
An: .....my email adress......, 
This is a multi-part message in MIME format. 

--b1_49abaa950e1203ed180ed1d5471145f7 
Content-Type: text/plain; charset=iso-8859-1 
Content-Transfer-Encoding: 8bit 

Für Sie wurde ein Vorgang zu Auftrag 11EDV erstellt. 
Vorgang öffnen 

Kategorie: 
EDV Entwicklung 

Vorgangs-Bemerkung: 
Gibt es eine Möglichkeit, eine E-Mail mit einer Auftragsbestätigung als Anhang direkt im HIS als Auftragsbestätigung hochzuladen? 

Momentan müssen wir die PDF ja auf dem PC zwischenspeichern und dann im HIS als Event Anhang hochladen. 

letzte Event-Bemerkung von hoj: 
Anregung von ....some name.... 


......footer....... 


--b1_49abaa950e1203ed180ed1d5471145f7 
Content-Type: text/html; charset=iso-8859-1 
Content-Transfer-Encoding: 8bit 

Für Sie wurde ein Vorgang zu Auftrag 11EDV erstellt.<br> <b>Vorgang öffnen</b></a><br><br>Kategorie:<br>EDV Entwicklung<br><br>Vorgangs-Bemerkung:<br>Gibt es eine Möglichkeit, eine E-Mail mit einer Auftragsbestätigung als Anhang direkt im HIS als Auftragsbestätigung hochzuladen?<br /> 
Momentan müssen wir die PDF ja auf dem PC zwischenspeichern und dann im HIS als Event Anhang hochladen.<br><br>letzte Event-Bemerkung von <b>hoj</b>:<br>Anregung von ....some name....<br> 


......footer....... 

--b1_49abaa950e1203ed180ed1d5471145f7-- 

我希望現在清楚我的意思。我知道BCC無法顯示,因爲電子郵件服務器會刪除它們。而那不是我想要的。我只想知道爲什麼電子郵件將顯示爲源代碼而不是普通電子郵件。

+0

你需要發佈你的代碼 - 這裏沒有足夠的繼續。 BCC不會包含在郵件標題中,除非您使用的是「郵件()」傳輸方式 - 但我無法確定您在發佈的最簡單信息時所做的操作。 – Synchro

+0

對不起,我認爲這就夠了。我編輯我的帖子更多的代碼和更好的解釋我的問題是什麼。 –

回答

1

我在那裏看到一些問題。我認爲主要的問題是,您嘗試發送Windows-1252編碼數據,但您的電子郵件標頭說,您在郵件正文中具有8位ISO-8859-1編碼。正如您在Wikipedia中發現的那樣,ISO-8859-1和Windows-1252是不一樣的。大多數字符是相同的,但Windows-1252是先進的ISO-8859-1字符集。這可能會破壞你的整個電子郵件。所以,請決定,你想使用哪一個。我建議你比Windows-1252編碼更喜歡ISO-8859-1,因爲這通常適用於舊的8位電子郵件。

此外,大部分數據似乎來自HTML表單。如果是這樣,您可以簡單地將form元素中的accept-charset屬性設置爲ISO-8859-1。換句話說:讓客戶爲你做好工作。但請驗證它也在您的PHP後端,客戶端發送給您真正ISO-8859-1編碼形式的數據和其他東西。因爲你不能相信任何客戶。

另一個原因可能是,您首先從未知編碼轉換爲UTF-8,再從UTF-8轉換回Windows-1252,這可能會導致一些問題。 iconv可以一步處理這件事情(我會第一時間發現線形成了你的代碼示例頂部爲例):

mail->addReplyTo($arr['from'], iconv(mb_detect_encoding($adressen[strtolower($arr['from'])]),'Windows-1252', $adressen[strtolower($arr['from'])])); 

請注意,這條線以上要求PHP mbstring擴展。您已經選擇iconv作爲您的轉換功能,因爲這一項是專門用於電子郵件編碼轉換和其他用途的,所以我們得到了mbstring。但iconv功能非常有限,因此您需要使用mbstring函數來檢測字符串上的給定編碼。

另一個優化暗示,我發現迄今:

  1. 沒有必要對你來說,用雙引號,因爲它裏面沒有任何表情。所以你可以使用單引號,在更快的運行時間中使用這些效果。在這個小功能中可能不會更快,但在大型應用中,速度要快得多。它也更安全,因爲你阻止PHP評估表達式,這可能會被客戶端繞過。
  2. 你也可以使用類型安全的比較。因此,對於字符串比較,使用$string === 'test'而不是$string == 'test
  3. 使用PSR標準記錄器進行錯誤處理,該記錄器實現PSRLoggerInterface,如Monolog。這成爲越來越多的行業事實標準。
+0

非常感謝你,我沒有意識到郵件的編碼是ISO-8859-1。我使用convert_text_to_utf8()的原因是有時內容不僅僅是1編碼。我們不僅使用此功能,而且還使用自動電子郵件。所以我創建了這個函數,首先將文本轉換爲只有一種編碼,然後轉換爲編碼,我希望每個客戶都能理解,因爲我們與öüä有問題。 將來我會用你的1.優化。我不知道雙引號會比單引號慢。 –

+0

PHPMailer默認爲ISO-8859-1,以便它可以在不使用mbstring的情況下獲得,但它確實有助於啓用它。您可以使用'$ mail-> CharSet ='UTF-8';'來更改爲UTF-8。 – Synchro

+0

我的經驗是,太多的電子郵件客戶端有UTF-8的問題,所以我切換到一個編碼,我希望更多的客戶支持,我不需要聽取有關破損的電子郵件的投訴。 –