JavaMail技术问题:邮件文本正文被识别为附件,需正常显示
解决JavaMail中文本正文被识别为附件的问题
我来帮你搞定这个问题!你遇到的情况是因为邮件的Multipart结构设置不符合MIME规范——不同类型的Multipart有明确分工,搞混嵌套逻辑就会导致文本正文被当成附件处理。
问题根源分析
你原来的代码把文本正文和HTML正文放在了"mixed"类型的子Multipart里,再嵌套进"alternative"的父Multipart,最后添加附件。但"mixed"类型是用来容纳正文+附件的组合,而"alternative"才是专门用来存放**不同格式的正文(text/plain和text/html)**的容器,让邮件客户端自行选择显示格式。你的结构颠倒后,邮件客户端会把"mixed"里的每个BodyPart都当成独立的内容块,自然就把文本正文识别成附件了。
修正后的代码
下面是调整后的正确实现,我标注了关键修改点:
final String subject = "Automation Execution Report"; // 待发送的消息文本 StringBuilder msg = new StringBuilder(); msg.append("Hi All"+"\n"); msg.append("We have executed the Automation Suite in current build."+"\n"); msg.append("Please find the automation report in the attachment"); try { Message message = new MimeMessage(session); message.setFrom(new InternetAddress(from)); message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to)); message.setSubject(subject); File dir = new File(System.getProperty("user.dir")+ File.separator+"test_reports"); File[] files = dir.listFiles(); File lastModifiedFile = files[0]; for (int i = 1; i < files.length; i++) { if (lastModifiedFile.lastModified() < files[i].lastModified()) { lastModifiedFile = files[i]; } } String attach = lastModifiedFile.toString(); // 1. 顶层用mixed类型,用来包含正文组和附件(这是带附件邮件的标准顶层容器) Multipart multipart = new MimeMultipart("mixed"); // 2. 创建alternative类型的Multipart,专门存放不同格式的正文 Multipart contentMultipart = new MimeMultipart("alternative"); // 文本正文:添加到alternative容器中 MimeBodyPart txtpart = new MimeBodyPart(); txtpart.setContent(msg.toString(), "text/plain"); contentMultipart.addBodyPart(txtpart); // HTML正文:同样添加到alternative容器中 MimeBodyPart htmlpart = new MimeBodyPart(); StringWriter writer = new StringWriter(); IOUtils.copy(new FileInputStream(new File("D:\\SVN CODE\\test-output\\customized-emailable-report.html")), writer); htmlpart.setContent(writer.toString(), "text/html"); contentMultipart.addBodyPart(htmlpart); // 3. 把正文组包装成一个BodyPart,加到顶层mixed容器中 MimeBodyPart contentPart = new MimeBodyPart(); contentPart.setContent(contentMultipart); multipart.addBodyPart(contentPart); // 4. 把附件单独加到顶层mixed容器中 BodyPart attachPart = new MimeBodyPart(); DataSource source = new FileDataSource(attach); attachPart.setDataHandler(new DataHandler(source)); attachPart.setFileName("Test Automation report.html"); multipart.addBodyPart(attachPart); // 设置邮件内容 message.setContent(multipart); System.out.println("Sending"); Transport transport = session.getTransport("smtp"); transport.connect(host,25,from, password); transport.sendMessage(message, message.getAllRecipients()); transport.close(); System.out.println("Done"); } catch (Exception e) { // 记得补上异常捕获,避免代码报错崩溃 e.printStackTrace(); }
核心修改说明
- 顶层容器用
"mixed":这是带附件邮件的标准结构,负责容纳正文块和附件 - 用
"alternative"管理双格式正文:邮件客户端会自动选择显示text或HTML版本,不会把它们识别为附件 - 结构层级清晰:正文组作为一个整体放到顶层容器,附件单独添加,完全符合MIME邮件规范
这样调整后,你的文本正文就能正常显示在邮件正文中,HTML正文和附件也能正常工作啦!
内容的提问来源于stack exchange,提问作者testergirl
相关产品推荐
相关产品推荐

