如何让wp_mail()字符串参数正确解析Markdown与换行格式
问题根源
你当前设置邮件Content-Type为text/html,按照HTML渲染规则,普通文本中的PHP_EOL、\r\n换行符不会被解析为视觉换行,只有<br>标签、块级HTML元素才会产生换行效果,因此所有内容会被挤在同一行显示。另外你当前拼接消息字符串时,换行后添加的大量前置缩进空格也会被带入最终内容,会造成不必要的前导空白。
可行解决方案
方案1:仅需正常换行,不需要Markdown格式渲染
两种实现方式二选一即可,改动量极小:
- 改用纯文本邮件类型:将headers中的Content-Type改为
text/plain; charset=UTF-8,此时你写入的所有换行符都会被邮件客户端正常识别,按纯文本规则排版,不需要额外处理内容,适合告警、通知类不需要复杂样式的邮件。 - 保留HTML类型自动转换换行:在调用
wp_mail前用PHP内置的nl2br()函数处理$message参数,把文本里的换行符自动替换为HTML可识别的<br>标签,调整后的send_mail方法示例:
public function send_mail(string $to, string $subject, string $message): bool { $headers = [ 'Content-Type: text/html; charset=UTF-8' ]; // 将文本换行自动转换为HTML换行标签 $message = nl2br($message); return wp_mail( $to, $subject, $message, $headers ); }
注意:拼接消息字符串时记得去掉换行后多余的前置缩进,避免内容出现无意义的前导空格,正确的拼接示例参考:
$this->send_mail( "Test@example.com", "Pardot Settings Error", "The Pardot integration has trigger a Pardot API error: " . PHP_EOL . "Error: " . $decode_response['code'] . " \r\n" . "Error Description: " . $decode_response['message'] );
方案2:需要完整支持Markdown格式内容排版
如果要让传入的Markdown语法(标题、加粗、列表、引用等)都能正常渲染显示,按以下步骤处理:
- 集成轻量无依赖的Markdown解析类到项目中,这类单文件解析工具不需要复杂安装,引入后即可调用,把传入的Markdown格式字符串转换为标准HTML代码。
- 给解析后的HTML内容套上基础的邮件HTML外壳,设置全局兼容的字体、行高样式,避免不同邮件客户端出现渲染错乱。
- 保留
Content-Type: text/html; charset=UTF-8的请求头,把处理完成的完整HTML内容传入wp_mail即可。
最简实现参考:
public function send_mail(string $to, string $subject, string $message): bool { $headers = [ 'Content-Type: text/html; charset=UTF-8' ]; // 将Markdown内容解析为HTML $parsedHtml = $parsedown->text($message); // 套基础邮件结构,兼容多数客户端渲染 $finalMessage = '<!DOCTYPE html> <html> <body style="font-family: system-ui, sans-serif; line-height: 1.6; padding: 16px; max-width: 600px; margin: 0 auto;">' . $parsedHtml . '</body> </html>'; return wp_mail( $to, $subject, $finalMessage, $headers ); }
调整完成后,你传入的Markdown格式内容就会被正确解析排版,不会再出现内容挤成一行的问题。
内容的提问来源于stack exchange,提问作者Sem
相关产品推荐
相关产品推荐

