Я хочу отправить письмо с использованием HTML, если это разрешено клиентом, иначе текст. Что-то вроде следующего:
$mail = new PHPMailer();
$htmlMessage="Hello John,<br /><br />How are you?";
$textMessage="Hello John,\n\nHow are you?";
$mail->Body = $htmlMessage;
$mail->AltBody = $textMessage;
Однако я не хочу выписывать сообщение целиком для обоих, но создаю одну версию и автоматически преобразую ее во вторую.
Учитывая это точное сообщение, я должен просто создать $textMessage
, а затем использовать nl2br()
добавить HTML разрывы строк?
Что, если мое HTML-сообщение было немного сложнее и содержало жирный текст, список и т. Д.? Я согласен с тем, что текстовое сообщение несколько уродливо, но я не хочу, чтобы в сообщении была куча HTML-тегов. Каковы мои варианты для этого сценария?
Э-э, вы знаете, что PHPMailer имеет два встроенные конвертеры HTML в обычный текст? Strip_tags
это довольно плохое решение — оно часто приводит к нечитаемому беспорядку. Лучшие результаты, которые я получил от использования настоящего текстового браузера (в частности, ELinks), которая может сделать большую работу по визуализации HTML в виде текста, способную сохранять такие вещи, как сохранение многостолбцовых макетов, подчеркивание, ссылки на ссылки и некоторые CSS. Однако обстрел не всегда возможен, поэтому существуют PHP-решения.
PHPMailer выполняет автоматическое преобразование для простой текстовой версии в msgHTML()
, так что ваш код будет просто так:
$mail = new PHPMailer();
$htmlMessage="Hello John,<br /><br />How are you?";
$mail->msgHTML($htmlMessage);
Есть опция для немного более продвинутого конвертера (в комплекте extras
папку), который вы можете вызвать, установив «расширенный» параметр в msgHTML
:
$mail->msgHTML($htmlMessage, '', true);
Попробуйте оба, посмотрите, что лучше для вас, но всегда стоит прочитать документы и исходный код!
Обновить С тех пор, как я опубликовал этот ответ, PHPMailer пришлось удалить класс html2text из комплекта по лицензионным причинам, но механизм для добавления собственного конвертера был улучшен — advanced
Параметр теперь может быть замыканием, с помощью которого вы можете реализовать свой собственный конвертер, такой как любой из тех, которые вы можете найти на упаковке.
Хотя не на 100% хорошо выглядит (в зависимости от содержимого HTML), strip_tags()
будет делать то, что вы хотите.
$mail = new PHPMailer();
$htmlMessage="Hello John,<br /><br />How are you?";
$textMessage="Hello John,\n\nHow are you?";
$mail->Body = $htmlMessage;
$mail->AltBody = strip_tags( $htmlMessage );
Вы не хотели бы использовать nl2br()
поскольку AltBody ожидает только простой текст. Появится любое форматирование HTML <br/>
будет отображаться как текст в вашем контенте). Вы могли бы сделать что-то вроде:
$mail->AltBody = strip_tags( str_replace( $htmlMessage, array( '<br>', '<br/>', '<br />' ), "\r\n" ) );