2017-04-27 18 views
1

私は最近、古くなったメール機能をPHPMailerにアップデートしました。すべてが完璧に動作しますが、現在はBCCに問題があります。PHPMailer BCCがフォーマットを破棄します

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

で1つ以上のアドレスを追加すると、電子メール形式が破棄されます。電子メールは次のようになります。

は、カスタムヘッダーdoesn't作業の追加のいずれか、私はそれがwouldn't電子メール形式を破壊した場合にBCCが正常に動作します

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); 
} 

は、それは(私はいくつかのテキストを削除する必要がありました)次のようになります。

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..... 

私は1つ以上の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

コードを投稿する必要があります。ここでは十分ではありません。 'mail()'トランスポートを使用していない限り、BCCはメッセージヘッダーに含まれませんが、あなたが投稿した最小限の情報で何をしているのか分かりません。 – Synchro

+0

申し訳ありませんが、これで十分だと思いました。私は、より多くのコードで私の投稿を編集し、私の問題が何であるかをよりよく説明します。 –

答えて

1

そこにいくつかの問題があります。主な問題は、Windows-1252でエンコードされたデータを送信しようとしているが、E-Mailヘッダーによれば、メール本文に8ビットのISO-8859-1エンコーディングがあるということです。 Wikipediaにあるように、ISO-8859-1とWindows-1252は同じではありません。ほとんどの文字は同じですが、Windows-1252は高度なISO-8859-1文字セットです。これは電子メール全体を破壊する可能性があります。だから、あなたが使いたいものを決めてください。私はWindows-1252エンコーディングよりもISO-8859-1を好むことをアドバイスします。これは、通常、古い8ビットのEメールのためです。

また、ほとんどのデータはHTML形式のようです。その場合は、form要素のaccept-charset属性をISO-8859-1に設定するだけです。つまり、言い換えれば、クライアントがあなたのために頑張るようにしましょう。しかし、クライアントが実際にISO-8859-1エンコードされたフォームデータなどを送っていることも、PHPバックエンドでも検証してください。あなたはどのクライアントも信頼できないからです。

もう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. MonologのようにPSRLoggerInterfaceを実装するエラー処理には、PSR標準のLoggerを使用します。これはますます業界標準となっています。
+0

電子メールのエンコーディングがISO-8859-1であったことに私は気づきませんでした。私がconvert_text_to_utf8()を使う理由は、コンテンツが単なる1つのエンコーディングではないことがあるからです。この機能は、フォームだけでなく、自動電子メールにも使用されます。だから私は最初にテキストを1つのエンコーディングに変換してからエンコーディングするようにこの関数を作成しました。私はöüäに問題があったので、すべてのクライアントが理解できることを願っています。 今後、私はあなたの1.最適化を使用します。私は二重引用符が単一のものより遅いことを知っていませんでした。 –

+0

PHPMailerのデフォルトはISO-8859-1で、mbstringなしで取得できるようになっていますが、実際に有効にすると効果的です。 '$ mail-> CharSet = 'UTF-8';'でUTF-8に変更することができます。 – Synchro

+0

私の経験では、あまりにも多くの電子メールクライアントにUTF-8の問題があったため、より多くのクライアントがサポートしてくれることを願ってエンコードに切り替えました。壊れた電子メールに関する苦情を聞く必要はありません。 –

関連する問題