我正在尝试使用 javamail API 发送一封包含 html 内容[包括图像]的邮件,当我尝试通过单元测试发送邮件时,它的工作方式异常,这意味着 html 内容已正确传递,但是当我使用应用程序中的相同代码[当在tomcat服务器内运行时],我将所有图像文件作为bin文件获取,如ATT00005.bin等。 这是我的代码
public void sendMail(String userName, String test_name, String toaddress,
String ccaddress, String status, int total_marks, String msg,
String filepath) throws MessagingException, AddressException {
Properties props = System.getProperties();
props.put("mail.smtp.host", SMTP_HOST_NAME);
Session session = Session.getInstance(props, null);
Message message = new MimeMessage(session);
message.setFrom(new InternetAddress(from));
InternetAddress ccaddressTo = new InternetAddress(ccaddress);
message.addRecipient(Message.RecipientType.TO, new InternetAddress(toaddress));
MimeMultipart multipart = new MimeMultipart("related");
BodyPart messageBodyPart = new MimeBodyPart();
String temp1 = "<HTML><BODY><center><TABLE border=0><TR><TD ><img src=\"cid:image1\" border=0></TD>";
String temp2 = "</TR><TR><TD><table width=100% border=0><tr align=center><td><img src=\"cid:image2\" "
+ "border=0 width=340 height=32></td>";
String temp3 = "<tr ></tr ><td align=center>Awarded To </td><tr ></tr ><td align=center>"
+ userName
+ "</td><tr ></tr ><td align=center> <img src=\"cid:image3\" border=0 width=270 height=32> </td>";
String temp4 = "</tr> </tr > <td align=center>TEST CERTIFICATION PROGRAM </td> </tr><tr><td align=\"center\">Test name : "
+ test_name
+ "</td></tr></table></td></tr><TR><TD>"
+ "<img src=\"cid:image4\" border=0 ></TD></TR> </TABLE> </center> </body></HTML>";
String htmlText = temp1 + temp2 + temp3 + temp4;
messageBodyPart.setContent(htmlText, "text/html; charset=utf-8");
multipart.addBodyPart(messageBodyPart);
messageBodyPart = new MimeBodyPart();
DataSource fds1 = new FileDataSource(filepath + "b1.jpg");
messageBodyPart.setDataHandler(new DataHandler(fds1));
messageBodyPart.setHeader("Content-ID", "<image1>");
multipart.addBodyPart(messageBodyPart);
messageBodyPart = new MimeBodyPart();
DataSource fds2 = new FileDataSource(filepath + "cert.gif");
messageBodyPart.setDataHandler(new DataHandler(fds2));
messageBodyPart.setHeader("Content-ID", "<image2>");
multipart.addBodyPart(messageBodyPart);
messageBodyPart = new MimeBodyPart();
DataSource fds3 = new FileDataSource(filepath + "cer2.gif");
messageBodyPart.setDataHandler(new DataHandler(fds3));
messageBodyPart.setHeader("Content-ID", "<image3>");
multipart.addBodyPart(messageBodyPart);
messageBodyPart = new MimeBodyPart();
DataSource fds4 = new FileDataSource(filepath + "b3.jpg");
messageBodyPart.setDataHandler(new DataHandler(fds4));
messageBodyPart.setHeader("Content-ID", "<image4>");
multipart.addBodyPart(messageBodyPart);
} else {
BodyPart messageBodyPart = new MimeBodyPart();
multipart.addBodyPart(messageBodyPart);
messageBodyPart.setText("Hello " + userName + ",\n" + msg);
}
message.setContent(multipart);
// Send the message
Transport transport = session.getTransport("smtp");
transport.connect(SMTP_HOST_NAME, null, null);
transport.sendMessage(message, message.getAllRecipients());
transport.close();
}
我知道有些人在这里问了同样的问题 .zip file gets converted to .bin file while sending the email in java 。但我的问题是,当使用 junit [或在具有 main 方法的应用程序中] 时,相同的代码可以工作,但当应用程序在 tomcat 服务器上运行时,则不能工作。我做错了什么。提前致谢...
最佳答案
如果您不希望系统自动提供名称,则应该指定一个名称:
messageBodyPart = new MimeBodyPart();
DataSource fds1 = new FileDataSource(filepath + "b1.jpg");
messageBodyPart.setDataHandler(new DataHandler(fds1));
messageBodyPart.setHeader("Content-ID", "<image1>");
messageBodyPart.setFileName(filepath + "b1.jpg"); // <= HERE
multipart.addBodyPart(messageBodyPart);
当您在 messageBodyPart
中设置 dataHandler
时,您只需告诉 javamail 机器您要发送的字节在哪里。或者更准确地说,这只是 javamail 所理解的。但 messageBodyPart
中还有另一个字段:fileName
。对于javamail,原始名称和消息中使用的名称完全无关,这可能是我们第一次使用它时脑部受伤的根源......
关于java - 在java-mail中图像被转换为.bin文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29967837/