如果客户允许,我希望使用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" ) );