使用java mail将图像嵌入html电子邮件

使用java mail将图像嵌入html电子邮件,java,html,jakarta-ee,ejb-3.0,jakarta-mail,Java,Html,Jakarta Ee,Ejb 3.0,Jakarta Mail,我用javamail发送html和图像,但由于某些原因,我没有将图像视为html的一部分,我只将它们视为附件。我不知道这是为什么。这是我的一个用户收到电子邮件时的样子: 我还想提及html的外观: private String generateActivationLinkTemplate() { String htmlText = ""; htmlText ="<table width=\"600\" border=\"0\" cellspacing=\"0\" cellpadd

我用javamail发送html和图像,但由于某些原因,我没有将图像视为html的一部分,我只将它们视为附件。我不知道这是为什么。这是我的一个用户收到电子邮件时的样子:

我还想提及html的外观:

private String generateActivationLinkTemplate() {
    String htmlText = "";
htmlText ="<table width=\"600\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\">  <tr>    <td><img src=\"cid:logoimg\"/></td>  </tr>  <tr>    <td height=\"220\"> <p>Thanks for Joining Site.com</p>      <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. </p>    <p>Username:<br />      Password: </p>    <p>To confirm your email click <a href=\"#\">here</a>.</p></td>  </tr>  <tr>    <td height=\"50\" align=\"center\" valign=\"middle\" bgcolor=\"#CCCCCC\">www.site.com | contact@site.com | +38200 123 456</td>  </tr></table>";}
@Stateless(name = "ejbs/EmailServiceEJB")
public class EmailServiceEJB implements IEmailServiceEJB {

@Resource(name = "mail/myMailSession")
private Session mailSession;

public void sendAccountActivationLinkToBuyer(String destinationEmail,
        String name) {

    // Destination of the email
    String to = destinationEmail;
    String from = "dontreply2thismessage@gmail.com";

    try {
        Message message = new MimeMessage(mailSession);
        // From: is our service
        message.setFrom(new InternetAddress(from));
        // To: destination given
        message.setRecipients(Message.RecipientType.TO,
                InternetAddress.parse(to));
        message.setSubject("Uspijesna registracija");
        // How to found at http://www.rgagnon.com/javadetails/java-0321.html
        message.setContent(generateActivationLinkTemplate(), "text/html");

        Date timeStamp = new Date();
        message.setSentDate(timeStamp);

        // Prepare a multipart HTML
        Multipart multipart = new MimeMultipart();
        // Prepare the HTML
        BodyPart htmlPart = new MimeBodyPart();
        htmlPart.setContent(generateActivationLinkTemplate(), "text/html");

        // PREPARE THE IMAGE
        BodyPart imgPart = new MimeBodyPart();

        String fileName = "logoemailtemplate.png";

        ClassLoader classLoader = Thread.currentThread()
                .getContextClassLoader();
        if (classLoader == null) {
            classLoader = this.getClass().getClassLoader();
            if (classLoader == null) {
                System.out.println("IT IS NULL AGAIN!!!!");
            }
        }

        DataSource ds = new URLDataSource(classLoader.getResource(fileName));

        imgPart.setDataHandler(new DataHandler(ds));
        imgPart.setHeader("Content-ID", "logoimg");

        multipart.addBodyPart(imgPart);
        multipart.addBodyPart(htmlPart);            

        // Set the message content!
        message.setContent(multipart);

        Transport.send(message);

    } catch (MessagingException e) {
        throw new RuntimeException(e);
    }

}
我认为java部分在我看来很好,但我怀疑的只是html标记,我认为它有什么问题吗?我认为img标签工作不正常,并且没有理由图像不会出现在电子邮件上(请注意,它只是作为附件出现):


您是否检查了内容类型是否正确以及图像内容配置是否设置为“内联”


此外,内容ID需要是全局唯一的,您不能只说“logoimg”。尝试登录随机数字-dontreply2thismessage@gmail.com。这可能不是你的问题

错误是由于

应该有:
imgPart.setHeader(“Content ID”,”)

不是:
imgPart.setHeader(“内容ID”、“logoimg”)


Ie:您需要“”

您能发布生成的MIME代码吗,或者至少发布标题可见但内容被删减的MIME代码吗?您能告诉我如何查找或生成MIME代码,以便我发布它吗。我有点困惑。我唯一改变的是这个imgPart.setHeader(“Content-ID”);现在可以很好地工作了。我使用了两种方法imgPart.setDisposition(BodyPart.INLINE);以及htmlPart.setDisposition(BodyPart.INLINE);但结果是一样的。我不明白你对内容id说了什么,你能解释一下我该怎么处理它吗?你把内容id设置为“logoimg”。内容ID应该是唯一的标识符,在世界上任何地方都不会重复,并且必须包含@符号。为什么,我不知道。您需要向我们展示生成的MIME。电子邮件产生了什么MIME?好的,我对html标记属性有点经验不足。你的意思是这样的:?我也不知道如何找到电子邮件产生的MIME,我在哪里可以找到它?我发现了这个:多部分/混合;boundary=“--------=\u Part\u 16\u 27478153.1299771549937”然后我调用方法getContentType(),我不知道在哪里可以找到带有@符号的代码,我真的不明白你的意思很高兴它能工作。基本上,以“cid:”开头的图像的url应该是图像MIME部分的内容ID头,前面是“cid:”。“cid:”URL的基本意思是“图片就在这条消息的某个地方,找一些有这个内容ID头的东西”。谢谢!这有帮助。我也在尝试“登录”而不是“
<img src=\"cid:logoimg\"/>