Spring Boot中如何用MimeMessageHelper同时发送HTML与文本邮件
解决Spring Boot MimeMessageHelper同时发送HTML和纯文本邮件的问题
嘿,我完全懂你现在遇到的困扰——你先后调用了两次setText()方法,结果后面的纯文本内容把之前的HTML内容覆盖了对吧?这是因为你用的setText(String text, boolean isHtml)重载方法,每次调用都会替换掉邮件里已有的内容,不管你之前设置的是HTML还是纯文本。
要同时支持HTML和纯文本格式的邮件,其实MimeMessageHelper早就为我们准备了专门的重载方法,不用分开调用两次!
正确的做法:使用双参数的setText重载
直接调用setText(String plainText, String htmlText)这个方法,第一个参数传入纯文本内容,第二个参数传入HTML内容。这样Spring会自动帮你构建一个multipart/alternative类型的邮件,邮件客户端会根据自身支持情况自动选择显示纯文本还是HTML版本。
修改后的代码片段如下:
MimeMessage message = mailSender.createMimeMessage(); MimeMessageHelper helper = new MimeMessageHelper(message, MimeMessageHelper.MULTIPART_MODE_MIXED_RELATED, StandardCharsets.UTF_8.name()); helper.setTo(bo.getToEmails().parallelStream().toArray(String[]::new)); helper.setBcc(bo.getBccEmails().parallelStream().toArray(String[]::new)); helper.setCc(bo.getCcEmails().parallelStream().toArray(String[]::new)); // 关键:用双参数的setText同时设置纯文本和HTML内容 helper.setText(textBody, htmlBody); helper.setSubject(bo.getSubject()); helper.setFrom(new InternetAddress(bo.getFromEmail(), bo.getSenderLabel()));
为什么原来的方式不行?
你之前调用的setText(String text, boolean isHtml),每次调用都会重置邮件的内容部分:
- 第一次调用
setText(htmlBody, true):把邮件内容设置为HTML格式 - 第二次调用
setText(textBody, false):直接把邮件内容替换成了纯文本格式
而双参数的setText方法会分别构建纯文本和HTML两个邮件部分,让它们作为替代选项存在,这样客户端就能正确识别并显示对应的格式了。
内容的提问来源于stack exchange,提问作者Shahid Ghafoor
相关产品推荐
相关产品推荐

