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

时间:2014-09-16 15:42:14

标签: php html phpmailer

如果客户允许,我希望使用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标签。这种情况有哪些选择?

2 个答案:

答案 0 :(得分:1)

虽然不是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" ) );

答案 1 :(得分:1)

呃,你知道PHPMailer有两个内置HTML到纯文本转换器吗? Strip_tags是一个相当糟糕的解决方案 - 它通常会导致难以理解的混乱。我得到的最好结果来自于使用真正的基于文本的浏览器(特别是elinks),它可以很好地将HTML呈现为文本,能够执行诸如保留多列布局,下划线,链接之类的操作引用和一些CSS。但是,shelling out并不总是一个选项,因此存在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参数现在可以成为一个闭包,您可以通过它来实现自己的转换器,例如您可能找到的任何转换器on packagist