Laravel中能否提取邮件纯文本并保留原格式?
Laravel提取邮件纯文本并保留格式的方法
Laravel本身提供了更可靠的方式获取带格式的邮件纯文本内容,无需手动处理HTML标签:
方法1:利用SwiftMailer的HTML转纯文本工具
SwiftMailer(Laravel底层邮件组件)自带HTML到纯文本的转换器,能自动保留段落、换行等结构:
use Swift_Plugins_ConvertHtmlToPlainTextPlugin; use Swift_Message; // 假设你已有邮件HTML内容$body_html $message = new Swift_Message(); $message->setBody($body_html, 'text/html'); // 转换为带格式的纯文本 $converter = new Swift_Plugins_ConvertHtmlToPlainTextPlugin(); $plainText = $converter->convert($message);
方法2:在邮件类中定义纯文本视图
如果你是自定义邮件类,可以直接在build()方法中同时指定HTML视图和纯文本视图,精准控制纯文本格式:
public function build() { return $this->view('emails.order-confirmation') // HTML视图 ->text('emails.order-confirmation-text'); // 对应纯文本视图 }
修复你的现有代码
你之前的代码把所有换行、制表符都替换为空,导致内容聚合。如果要手动处理,需先将HTML块级标签转换为文本换行,再清理多余格式:
// 先将HTML段落、换行标签转换为文本换行 $body_text = str_replace(['<p>', '</p>', '<br>', '<br/>', '<div>', '</div>'], "\n", $body_html); // 移除所有HTML标签 $body_text = strip_tags($body_text); // 解码HTML实体 $body_text = html_entity_decode($body_text); // 合并多余空格但保留换行 $body_text = preg_replace('/\s+/', ' ', $body_text); // 清理首尾空白 $body_text = trim($body_text);
优先推荐方法1或2,因为它们能更准确地处理复杂HTML结构,避免手动替换标签的遗漏问题。
内容的提问来源于stack exchange,提问作者rippleytrigger
相关产品推荐
相关产品推荐

