java - 在java-mail中图像被转换为​​.bin文件

标签 java tomcat jakarta-mail

我正在尝试使用 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/

相关文章:

Java Mail 正在显示 <h2> 文本

java - Brave (Zipkin) 是否支持从客户端到服务器的并行请求

tomcat - 在 META-INF/context.xml 中设置 Web 应用程序的路径?

eclipse - 重启 TomCat 时使用 sass-maven-plugin 编译 *.scss 文件

java - 甲骨文 ADF : ADFC-10001: cannot instantiate class 'com.wip.view.backing.Index'

java - 创建 mimetype : application/EDIFACT 的 javax.mail 消息

java - POP3 RFC : Server sending a non standard response

java - Swing 组件支持哪些 HTML 标签?

java - wifiManager.getScanResults() 返回 0

java - 使用 Java 3.0 驱动程序检查 MongoDB 身份验证