У меня есть этот скрипт, который запускается через задание cron раз в месяц для отправки отчетов awstats клиентам. Недавно нам пришлось изменить его из-за ужесточения ограничений на наш сервер исходящей почты. К сожалению, некоторые получатели получают отчет в виде необработанного HTML-кода в теле сообщения. Кто-нибудь может сказать по сценарию, где я ошибся?
##########################
## Call to get awstats
##########################
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL,"http://www.$your_domain:2082/awstats.pl"."?month=$report_month&year=$report_year&output=main&config=$your_domain"."&lang=en&framename=mainright");
curl_setopt($curl, CURLOPT_USERPWD, "$user:$password");
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
//$attachment = curl_exec($curl);
$attachment = "<br /><br /><div align=\"center\"><a href=\"$logo_link\"><img src=\"$logo_path\" border=\"0\" /></a>\n";
$attachment .= "<br /><font color=\"#FF0000\"><b>AwStats Report for $your_domain ($report_monthname $report_year)</b></font></div>\n";
$attachment .= "<base href=\"$awstats_img_path\">\n";
$attachment .= curl_exec($curl);
curl_close($curl);
##########################
## Call to send email
##########################
$subject = "AwStats Report for $your_domain ($report_monthname $report_year)";
$header = "From: " . $email_from . " <" . $email_from . ">\n";
$header .= "Reply-To: " . $email_from . "\n";
$header .= "MIME-Version: 1.0\n";
$header .= "Content-Type: multipart/mixed; boundary=\"" . $uid . "\"\n\n";
$uid = md5(uniqid(time()));
$message = "--" . $uid . "\n";
$message .= "Content-type:text/html; charset=iso-8859-1\n";
$message .= "Content-Transfer-Encoding: 7bit\n\n";
$message .= $attachment . "\n\n";
mail($email_to, $subject, $message, $header);
Я явно пропустил объявления переменных здесь. Но они все в коде. Я на самом деле получаю копию сообщения, и оно хорошо отображается в Apple Mail на рабочем столе.
Спасибо,
CJ
Вы пропускаете конечную границу MIME в электронном письме, что приводит к тому, что некоторые клиенты не отображают ее правильно.
Добавьте это как последнюю строку перед mail();
$message .= "--{$uid}--\n"; // terminate mime boundary
РЕДАКТИРОВАТЬ: После вашего комментария я заметил еще одну проблему.
$header .= "Content-Type: multipart/mixed; boundary=\"" . $uid . "\"\n\n";
$uid = md5(uniqid(time()));
необходимо изменить на:
$uid = md5(uniqid(time()));
$header .= "Content-Type: multipart/mixed; boundary=\"" . $uid . "\"\n\n";
Граница изначально была пустой, что могло бы объяснить, почему некоторые почтовые клиенты не показывали ее должным образом.
Других решений пока нет …