2017-04-27 98 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的问题,所以我切换到一个编码,我希望更多的客户支持,我不需要听取有关破损的电子邮件的投诉。 –