2017-04-27 4 views
1

Ich habe vor kurzem unsere alte E-Mail-Funktion zu PHPMailer aktualisiert. Alles funktioniert perfekt, aber jetzt habe ich ein Problem mit BCC. Wenn ich eine oder mehrere Adressen mitPHPMailer BCC zerstört Format

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

hinzufügen, wird das E-Mail-Format zerstört. E-Mails werden wie folgt aussehen:

einen benutzerdefinierten Header nicht funktioniert Hinzufügen entweder weil dann erhalte ich die Fehler

Could not instantiate mail function. 

BCC gut funktionieren würde, wenn es würde nicht die E-Mail-Format zerstören.

EDIT:

Dies ist die gesamte Funktion E-Mail zu senden.

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

Als ich die E-Mail ohne BCC senden sieht es wie folgt aus (ich hatte einige Text zu entfernen):

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

Als ich hinzufügen eine oder mehrere BCC Adresses die gleiche E-Mail wie folgt aussieht:

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

Ich hoffe es ist jetzt klar, was ich meine. Ich weiß, dass die BCCs nicht angezeigt werden können, weil der E-Mail-Server sie entfernt. Und das ist nicht was ich will. Ich möchte nur wissen, warum die E-Mail als Quellcode anstelle einer normalen E-Mail angezeigt wird.

+0

Sie müssen Ihren Code posten - es gibt hier nicht genug, um weiterzumachen. BCC wird nicht in die Nachrichtenkopfzeilen aufgenommen, es sei denn, Sie verwenden den 'mail()' -Transport - aber ich kann nicht sagen, was Sie mit den minimalen Informationen tun, die Sie gepostet haben. – Synchro

+0

Entschuldigung, ich dachte, das ist genug. Ich bearbeite meinen Beitrag mit mehr Code und mit einer besseren Erklärung, was mein Problem ist. –

Antwort

1

Ich sehe da einige Probleme. Ich denke, das Hauptproblem ist, dass Sie versuchen, Windows-1252 kodierte Daten zu senden, aber Ihre E-Mail-Header sagt, dass Sie 8-Bit-ISO-8859-1-Codierung im Mail-Körper haben. Wie Sie in Wikipedia finden können, sind ISO-8859-1 und Windows-1252 nicht identisch. Die meisten Zeichen sind gleich, aber Windows-1252 ist der erweiterte ISO-8859-1-Zeichensatz. Dies könnte Ihre gesamte E-Mail zerstören. Entscheiden Sie also, welche Sie verwenden möchten. Ich würde Ihnen empfehlen, ISO-8859-1 gegenüber Windows-1252-Kodierung zu bevorzugen, weil das normalerweise für alte 8-Bit-E-Mails ist.

Auch die meisten Daten scheinen von einem HTML-Formular zu kommen. Wenn ja, können Sie einfach das accept-charset Attribut in Ihrem form Element auf ISO-8859-1 setzen. Also, mit anderen Worten: Lassen Sie den Kunden die harte Arbeit für Sie erledigen. Aber bitte validiere es auch auf deinem PHP-Backend, dass der Client dir wirklich ISO-8859-1 codierte Formulardaten und etwas anderes sendet. Weil Sie keinem Kunden vertrauen können.

Ein anderer Grund könnte sein, dass Sie zuerst von einer unbekannten Kodierung in UTF-8 und von UTF-8 zurück zu Windows-1252 konvertieren, was ebenfalls einige Probleme verursachen könnte. iconv kann dies in einem Schritt Griff für Sie (Ich werde die erste gefundene Zeile bildet den Anfang der Codeprobe als Beispiel):

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

Bitte beachten Sie, dass diese Zeile über die PHP-Erweiterung mbstring erfordert. Sie haben bereits iconv direkt als Ihre Konvertierungsfunktion gewählt, da diese speziell für die Konvertierung von E-Mail-Kodierungen entwickelt wurde. Für jeden anderen Zweck haben wir mbstring. Aber die Funktionalität ist sehr begrenzt, so dass Sie eine mbstring Funktion benötigen, um die angegebene Codierung für eine Zeichenfolge zu erkennen.

Eine weitere Optimierung deutet an, dass ich bisher gefunden:

  1. Es besteht keine Notwendigkeit für Sie, doppelte Anführungszeichen zu verwenden, weil es keinen Ausdruck im Inneren ist. Sie können also einfache Anführungszeichen verwenden, die in einer schnelleren Laufzeit wirken. Vielleicht nicht schneller in dieser kleinen Funktion, aber in großen Anwendungen ist es viel schneller. Und es ist auch sicherer, weil Sie PHP daran hindern, Ausdrücke auszuwerten, die möglicherweise vom Client umgangen wurden.
  2. Sie könnten auch Typ-Safe-Vergleich verwenden. Also, für String comparsion verwenden $string === 'test' statt $string == 'test
  3. Verwenden Sie einen PSR-Standard Logger für Ihre Fehlerbehandlung, die die PSRLoggerInterface implementiert, wie Monolog. Dies wird mehr und mehr zum Industriestandard.
+0

Vielen Dank, ich wusste nicht, dass die Codierung der E-Mail ISO-8859-1 war. Der Grund, warum ich convert_text_to_utf8() verwende, ist, dass der Inhalt manchmal nicht nur 1 kodiert ist. Wir verwenden diese Funktion nicht nur mit einem Formular, sondern auch für automatische E-Mails. Also habe ich diese Funktion erstellt, um zuerst Text in nur eine Kodierung und dann in eine Kodierung zu konvertieren, ich hoffe jeder Klient versteht, weil wir Probleme mit öüä hatten. In Zukunft werde ich Ihre 1. Optimierung verwenden. Ich wusste nicht, dass doppelte Anführungszeichen langsamer als einzelne sein würden. –

+0

PHPMailer ist standardmäßig ISO-8859-1, so dass es ohne MBString auskommen kann, aber es hilft wirklich, es aktiviert zu haben. Sie können zu UTF-8 wechseln mit '$ mail-> CharSet = 'UTF-8';'. – Synchro

+0

Ich hatte die Erfahrung, dass zu viele E-Mail-Clients Probleme mit UTF-8 hatten, also wechselte ich zu einer Kodierung, von der ich hoffe, dass sie von mehr Clients unterstützt wird und ich keine Beschwerden über kaputte E-Mails hören muss. –