【问题标题】:PHPMailer BCC destroys FormatPHPMailer BCC 销毁 Format
【发布时间】:2017-09-25 00:41:03
【问题描述】:

我最近将我们古老的电子邮件功能更新为 PHPMailer。一切正常,但现在我遇到了密件抄送问题。当我用

添加一个或多个地址时
$mail->AddBCC($arr["bcc"]);

电子邮件格式被破坏。电子邮件将如下所示:

This is a multi-part message in MIME format. 

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

添加自定义标头也不起作用,因为我得到了错误

Could not instantiate mail function.

如果密件抄送不会破坏电子邮件格式,它将可以正常工作。

编辑:

这是发送电子邮件的全部功能。

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

当我添加一个或多个密件抄送地址时,相同的电子邮件如下所示:

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

我希望它现在清楚我的意思。我知道密件抄送无法显示,因为电子邮件服务器已将其删除。那不是我想要的。我只是想知道为什么电子邮件会显示为源代码而不是普通电子邮件。

【问题讨论】:

  • 您需要发布您的代码 - 这里还不够。除非您使用 mail() 传输,否则密件抄送不会包含在邮件标头中 - 但我无法用您发布的最少信息来判断您在做什么。
  • 对不起,我以为这就够了。我用更多代码编辑我的帖子,并更好地解释我的问题是什么。

标签: php email phpmailer html-email bcc


【解决方案1】:

我发现那里有一些问题。我认为主要问题是,您尝试发送 Windows-1252 编码数据,但您的电子邮件标头显示邮件正文中有 8 位 ISO-8859-1 编码。正如您在Wikipedia 中可能发现的那样,ISO-8859-1 和 Windows-1252 并不相同。大多数字符是相同的,但 Windows-1252 是高级 ISO-8859-1 字符集。这可能会破坏您的整个电子邮件。所以,请决定,你想使用哪一个。我建议您更喜欢 ISO-8859-1 而不是 Windows-1252 编码,因为这通常适用于旧的 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 标准 Logger 进行错误处理,它实现了 PSRLoggerInterface,如 Monolog。这越来越成为行业事实上的标准。

【讨论】:

  • 非常感谢,我没有意识到电子邮件的编码是 ISO-8859-1。我使用 convert_text_to_utf8() 的原因是有时内容不仅仅是 1 编码。我们不仅将此功能用于表单,还用于自动电子邮件。所以我创建了这个函数,首先将文本转换为仅一种编码,然后转换为我希望每个客户都能理解的编码,因为我们遇到了 öüä 的问题。以后我会用你的1.优化。我不知道双引号会比单引号慢。
  • PHPMailer 默认为 ISO-8859-1,因此它可以在没有 mbstring 的情况下运行,但启用它确实很有帮助。您可以使用 $mail-&gt;CharSet = 'UTF-8'; 更改为 UTF-8。
  • 我的经验是太多的电子邮件客户端在使用 UTF-8 时遇到了问题,所以我改用了一种我希望更多客户支持的编码,而且我不必听有关损坏电子邮件的投诉。
猜你喜欢
  • 1970-01-01
  • 2013-01-19
  • 2015-11-25
  • 1970-01-01
  • 1970-01-01
  • 2020-06-17
  • 1970-01-01
  • 1970-01-01
  • 2015-04-14
相关资源
最近更新 更多