将PHPMailer HTML消息转换为文本消息


Converting PHPMailer HTML message to Text Message

如果客户允许,我希望使用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参数现在可以是一个闭包,您可以通过它来实现自己的转换器,例如您可能在packagegist上找到的任何转换器。

虽然strip_tags()不是100%好看(取决于HTML内容),但它可以满足您的需要。

$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" ) );