Недавно я обновил нашу древнюю функцию электронной почты до PHPMailer. Все отлично работает, но теперь у меня возникли проблемы с BCC. Когда я добавляю один или несколько адресов с
$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.
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 не могут быть показаны, потому что сервер электронной почты удаляет их. И это не то, что я хочу. Я просто хочу знать, почему электронная почта будет отображаться в виде исходного кода вместо обычной электронной почты.
Я вижу там некоторые проблемы. Я думаю, что основная проблема заключается в том, что вы пытаетесь отправить данные в кодировке Windows-1252, но ваш заголовок электронной почты говорит, что в теле письма есть 8-битная кодировка ISO-8859-1. Как вы можете найти в Википедия, ISO-8859-1 и Windows-1252 не совпадают. Большинство символов совпадают, но Windows-1252 — это расширенный набор символов ISO-8859-1. Это может уничтожить всю вашу электронную почту. Поэтому, пожалуйста, решите, какой из них вы бы хотели использовать. Я бы посоветовал вам предпочесть ISO-8859-1 кодировке Windows-1252, потому что это обычно для старых 8-битных электронных писем.
Кроме того, большая часть данных, похоже, поступает из формы HTML. Если это так, вы можете просто установить accept-charset
атрибут в вашем form
Элемент к 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
функция для обнаружения заданной кодировки в строке.
Еще одна подсказка по оптимизации, которую я нашел до сих пор:
$string === 'test'
вместо $string == 'test
PSRLoggerInterface
, лайк Монолог. Это становится все более и более отраслевым стандартом де-факто.Других решений пока нет …