У меня есть клиент, который хотел, чтобы их сотрудники по продажам могли заполнять высокоразработанные шаблоны из 2 столбцов html и отправлять электронные письма, используя их. Максимум 6 получателей за электронную почту.
Решение работало очень хорошо, пока они не решили, что они хотят отправлять каждому получателю отдельно. Нет CC, нет BCC.
Я понял, где я просто взорвал массив адресов, прежде чем я зациклился, но это создало электронные письма с пустым контентом. Строка темы была прекрасной, но контент был равен нулю.
Интересно, если я вставляю die () и выгружаю $ html_text на экран, я вижу, что я ожидаю иметь в качестве контента.
Первоначально я устанавливал контент, тему и т. Д. Вне цикла, но, видя пустой контент, я думал, что, возможно, я должен установить vars внутри цикла, хотя это не имело для меня никакого смысла. Он ничего не изменил.
Вот код цикла:
if (count($_SESSION['recipients']) > 0) { foreach ($_SESSION['recipients'] as $to) { $template = $_SERVER['DOCUMENT_ROOT'] . '/leads/templates/'.$_SESSION['templateFile']; ob_start(); include($template); $html = ob_get_contents(); ob_end_clean(); if (strlen($html) == 0) { echo "The template at $template did not load."; exit; } $bullets = unslash($_SESSION['bullets']); $bullets = preg_replace('/<li>/', '* ', $bullets); $bullets = strip_tags($bullets); $TextMessage = strip_tags(unslash($_SESSION['message'])) . "\n\n" . $bullets; $notice_text = "This is a multi-part message in MIME format."; $plain_text = str_replace(' ',' ', $TextMessage); $html_text = $html; $email = $_SESSION['user']->email; $name = $_SESSION['user']->first_name . ' ' . $_SESSION['user']->last_name; $from = "$name <$email>"; $subject = unslash($_SESSION['subject']); $semi_rand = md5(time()); $mime_boundary = "==MULTIPART_BOUNDARY_$semi_rand"; $mime_boundary_header = chr(34) . $mime_boundary . chr(34); $body = "$notice_text --$mime_boundary Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit $plain_text --$mime_boundary Content-Type: text/html; charset=us-ascii Content-Transfer-Encoding: 7bit $html_text --$mime_boundary--"; if (@mail($to, $subject, $body, "From: " . $from . "\n" . "MIME-Version: 1.0\n" . "Content-Type: multipart/alternative;\n" . " boundary=" . $mime_boundary_header)) { $out .= " Email sent to " . htmlentities($to) . ".<br />"; } else { $out .= " Email to htmlentities($to) NOT sent successfully!"; } } // foreach
Любые советы очень ценятся!
2010.08.06 – EDIT: я попытался заменить $ html_text и $ plain_text жестко закодированным текстом и нашел те же результаты: пустая почта отправлена. Также попытался переместить поколение $ mime_boundary и $ mime_boundary_header вне цикла без успеха.
Однако, если я добавлю die('<pre>'.$body.'</pre>');
сразу после отправки пустой почты, я вижу все, что я ожидаю в HTML, а также текст и границы … Вот пример:
This is a multi-part message in MIME format. --==MULTIPART_BOUNDARY_94e43eed6cf2826fc5787c860814066e Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit My plain text here * Bullet point 1 * Bullet point 2 --==MULTIPART_BOUNDARY_94e43eed6cf2826fc5787c860814066e Content-Type: text/html; charset=us-ascii Content-Transfer-Encoding: 7bit // RENDERED HTML CONTENTS SHOW UP HERE
Возможно, показывая содержимое каждой переменной компонента, в то время как цикл может дать некоторые идеи?
Кажется, что NULL может показаться в составе тела тела каким-то образом – первым инстинктом.
Я свободно признаю, что понятия не имею, почему это преуспевает там, где foreach () не удалось, но решение kludgy заключалось в том, чтобы исключить foreach () и назначить шесть возможных адресов следующим образом:
// #5 // if ($to = $_SESSION['recipients'][4]) { mail($to, $subject, $body, "From: " . $from . "\n" . "MIME-Version: 1.0\n" . "Content-Type: multipart/alternative;\n" . " boundary=" . $mime_boundary_header); echo "Email sent to " . htmlentities($to) . ".<br />"; }
Он выполняет эту работу без каких-либо других изменений кода, и, поскольку Ларри Уолл сказал, что «Делает ход последним самым последним».