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

Images are converted to .bin files in java-mail

我正在尝试使用 javamail API 发送具有 html 内容[包括图像] 的邮件,每当我尝试通过单元测试发送邮件时,它的工作方式都是例外的意思 html 内容已正确交付,但是当我在应用程序中使用相同的代码时 [When 运行 inside tomcat server] ,我将所有图像文件作为 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,原始名称和邮件中使用的名称完全无关,这可能是我们第一次使用它时脑部受伤的根源......