Как правильно отправить составное / альтернативное письмо с PHP

Я пытаюсь использовать встроенную почтовую функцию PHP для отправки составных сообщений, содержащих html и текстовую версию моего сообщения. Я играл с разными типами кодирования, но продолжаю сталкиваться с проблемами. Изначально я поставил Content-Transfer-Encoding в Binary но это привело к тому, что восклицательные знаки помещались каждые 78 символов. Я тоже пробовал base64 но я считаю, что base64 излишне для того, что я делаю.

Все, что я делаю, это отправляю базовый HTML, без кодированных изображений, файлов или вложений. Я бы предпочел метод кодирования, который по-прежнему позволял бы читать исходный код человеком.

я слышал, что Quoted-Printable это то, что я ищу, но когда я попытался отправить сообщения с использованием этого типа кодировки, результат получился действительно странным. Я заметил кучу " символы разбросаны по всему исходному коду сообщения.

Вот код, который я использую:

    $to = "to@test.com";
    $subject = "test subject";
    $boundary = uniqid('np');               
    $headers = "MIME-Version: 1.0\r\n";
    $headers .= "From: from-address@test.com\r\n";
    $headers .= "Reply-To: reply-address@test.com\r\n";
    $headers .= "Return-Path: return-path@test.com\r\n";
    $headers .= "Content-Type: multipart/alternative;boundary=" . $boundary . "\r\n";
    $message = "This is a MIME encoded message.";

    $message .= "\r\n\r\n--" . $boundary . "\r\n";
    $message .= "Content-Type: text/plain; charset=UTF-8\r\n";
    $message .= "Content-Transfer-Encoding: Quoted-Printable\r\n";
    $message .= $plainTextMessage;

    $message .= "\r\n\r\n--" . $boundary . "\r\n";
    $message .= "Content-Type: text/html; charset=UTF-8\r\n";
    $message .= "Content-Transfer-Encoding: Quoted-Printable\r\n";
    $message .= $HTMLmessage;

    $message .= "\r\n\r\n--" . $boundary . "--";

    $ok = mail($to,$subject,$message,$headers);

Какого черта я здесь делаю не так?

1 ответ

Нет необходимости в сторонней библиотеке или внешнем узле пересылки почты. Это то, что я использую, и это работает как шарм. Он также исправляет некоторые потенциальные дыры в безопасности, заставляя заголовки использовать адрес $from, который в противном случае может раскрыть пользователя вашей системы:

private function sendMail($to, $from, $fromName, $subject, $text, $html)
{

    $boundary = uniqid('np');

    $headers = "MIME-Version: 1.0\r\n";
    $headers .= "From: ".$fromName." <".$from.">" . "\r\n"; 
    $headers .= "X-Sender: ".$fromName." <".$from.">\n";
    $headers .= "Return-Path: <".$from.">\n";
    $headers .= "To: ".$to."\r\n";
    $headers .= "Content-Type: multipart/alternative;boundary=" . $boundary . "\r\n";

    // Content body
    $message = "This is a MIME encoded message.";
    $message .= "\r\n\r\n--" . $boundary . "\r\n";
    $message .= "Content-type: text/plain;charset=utf-8\r\n\r\n";

    // Plain text body
    $message .= $text;
    $message .= "\r\n\r\n--" . $boundary . "\r\n";
    $message .= "Content-type: text/html;charset=utf-8\r\n\r\n";

    // Html body
    $message .= $html;
    $message .= "\r\n\r\n--" . $boundary . "--";

    // Send mail
    mail('', $subject, $message, $headers, '-f ' . $from);

}

Привет, попробуйте следующий код,

    $to = "to@test.com";
    $subject = "test subject";
    $plainTextMessage = "Hi all";
    $HTMLmessage = "<b>Hi all</b>";
     //$boundary = uniqid('np');               
    $boundary = md5(uniqid(time()));   
    $headers .= "From: from-address@test.com\r\n";
    $headers .= "Reply-To: reply-address@test.com\r\n";
    $headers .= "Return-Path: return-path@test.com\r\n";
    $headers .= "Content-Type: multipart/alternative;boundary=" . $boundary . "\r\n";
    $message = "This is a MIME encoded message.";

    $message .= "\r\n\r\n--" . $boundary . "\r\n";
    $message .= "Content-Type: text/plain; charset=UTF-8\r\n";
    $message .= "Content-Transfer-Encoding: Quoted-Printable\r\n";
    $message .= $plainTextMessage;

    $message .= "\r\n\r\n--" . $boundary . "\r\n";
    $message .= "Content-Type: text/html; charset=UTF-8\r\n";
    $message .= "Content-Transfer-Encoding: Quoted-Printable\r\n";
    $message .= $HTMLmessage;

    $message .= "\r\n\r\n--" . $boundary . "--";

    $ok = mail($to,$subject,$message,$headers);

Может это поможет

Другие вопросы по тегам