2017-04-27 18 views
1

최근 이메일 기능을 PHPMailer로 업데이트했습니다. 모든 것이 완벽하게 작동하지만 지금은 BCC에 문제가 있습니다.PHPMailer BCC가 형식을 바꿉니다.

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

과 함께 하나 이상의 주소를 추가하면 이메일 형식이 파괴됩니다. 이메일은 다음과 같이 표시됩니다

사용자 정의 헤더 나던 작업을 추가하거나 다음 나는 오류

Could not instantiate mail function. 

이 난 인터뷰 이메일-형식을 파괴하는 경우 BCC가 잘 작동 할를 얻을 수 있기 때문이다.

편집 :

이것은 전자 메일을 보내는 전체 기능입니다. 내가 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); 
} 

그것은 (I 일부 텍스트를 제거했다) 다음과 같습니다

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가 같은 이메일을 Adresses 추가 다음과 같습니다

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를 제거하기 때문에 BCC를 표시 할 수 없다는 것을 알고 있습니다. 그리고 그게 내가 원하는 건 아니야. 나는 왜 전자 메일이 일반 전자 메일 대신 소스 코드로 표시되는지 알고 싶습니다.

+0

코드를 게시해야합니다. 계속하려면 충분하지 않습니다. 'mail()'전송을 사용하지 않는 한 숨은 참조는 메시지 헤더에 포함되지 않습니다.하지만 게시 한 최소한의 정보로 무엇을하는지 말할 수는 없습니다. – Synchro

+0

죄송 합니다만 이것이 충분하다고 생각했습니다. 나는 더 많은 코드로 내 게시물을 편집하고 내 문제가 무엇인지 더 잘 설명합니다. –

답변

1

거기에 몇 가지 문제점이 있습니다. 주요 문제는 Windows-1252 인코딩 된 데이터를 보내려고하지만 E-Mail 헤더에 의하면 메일 본문에 8 비트 ISO-8859-1 인코딩이 있다는 것입니다. Wikipedia에서 볼 수 있듯이 ISO-8859-1과 Windows-1252는 동일하지 않습니다. 대부분의 문자는 동일하지만 Windows-1252는 고급 ISO-8859-1 문자 집합입니다. 이로 인해 전체 전자 메일이 파괴 될 수 있습니다. 그래서, 어느 쪽을 사용하고 싶은지 결정하십시오. Windows-1252 Encoding에 비해 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. 또한 유형 안전 comparsion 사용할 수 있습니다. 따라서 문자열 비교를 사용하려면 대신
  3. Monolog과 같은 PSRLoggerInterface을 구현하는 오류 처리를 위해 PSR 표준 로거를 사용하십시오. 이것은 점점 더 업계 표준이되었습니다.
+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에 문제가있어서 더 많은 클라이언트가 지원하기를 희망하는 인코딩으로 전환했기 때문에 깨진 이메일에 대한 불만을 들어야하지 않습니다. –