【问题标题】:html email with reference to an image as base64 Stringhtml 电子邮件参考图像作为 base64 字符串
【发布时间】:2014-04-16 14:31:30
【问题描述】:

我想使用 Java Mail API (javax.mail) 发送一封电子邮件。消息必须包含 html,并且里面有对图像的引用。这是一个挑战,因为不允许引用磁盘上的物理文件,但我为该图像创建了一个 base64 字符串 (http://www.base64-image.de/step-1.php) 并将该数据复制到静态字符串变量。 使用 javax.mail 我构建了一个包含两部分的 MulitPart 类型的消息。第一部分是 html 本身,第二部分是图像。 html部分通过<img src="cid:image-id"/>.引用图片

Message msg = new MimeMessage(session);
Multipart multipart = new MimeMultipart("related");
BodyPart htmlPart = new MimeBodyPart();
        htmlPart.setContent("<html><body><h2>A title</h2>Some text in here<br/>" +
                "<img src=\"cid:the-img-1\"/><br/> some more text<img src=\"cid:the-img-1\"/></body></html>", "text/html");
multipart.addBodyPart(htmlPart);

public static final String base64logo = "/9j/4AAQSkZJRgABAQEASABIAAD/4QBe…"; // ein ganz langer String erzeugt über http://www.base64-image.de/step-1.php

sun.misc.BASE64Decoder decoder = new sun.misc.BASE64Decoder();
byte[] imageByte = decoder.decodeBuffer(base64logo);
InternetHeaders header = new InternetHeaders();
BodyPart imgPart=new MimeBodyPart(header, imageByte);
imgPart.setHeader("Content-ID","the-img-1");
imgPart.setDisposition(MimeBodyPart.INLINE);
multipart.addBodyPart(imgPart);
msg.setContent(multipart);

很遗憾,收到的电子邮件中缺少图片。

当我指向磁盘上的文件时,它正在工作:

DataSource ds=new FileDataSource("c:/temp/image001.jpg");
imgPart.setDataHandler(new DataHandler(ds));

我们正在与 Talend 一起开发,我们无法参考 到外部文件,因为这会使部署过程 更复杂。

你能在我的方法中找到一些错误的做法吗?

亲切的问候 希尔德里希

【问题讨论】:

  • 一般做法是正确的。我怀疑图像参考有问题。查看您发送的邮件的完整来源。图片应该在那里,检查您引用它的 id 是否正确。
  • 谢谢!但是参考 (Content-ID) 拼写正确。
  • 我也遇到了同样的问题,请问有解决办法吗?

标签: java jakarta-mail


【解决方案1】:

尝试在此处放置尖括号

imgPart.setHeader("Content-ID","<the-img-1>");

我在这个博客的一篇旧帖子的 cmets 上找到了这个答案

http://www.jroller.com/eyallupu/entry/javamail_sending_embedded_image_in

在 Aravind Velayudhan Nair 的评论中

它对我有用!

【讨论】:

    【解决方案2】:

    很久以前就有人问过这个问题。但我会回答这个问题,因为我遇到了同样的问题,来自我自己的回答 here

    byte[] tile = DatatypeConverter.parseBase64Binary(base64logo);
    BodyPart messageBodyPart = new MimeBodyPart();
    DataHandler dataHandler = new DataHandler(new ByteArrayDataSource(tile, "image/jpeg"));
    messageBodyPart.setDataHandler(dataHandler);
    messageBodyPart.setHeader("Content-ID", "<the-img-1>");
    multipart.addBodyPart(messageBodyPart);
    msg.setContent(multipart);
    

    希望对某人有所帮助。

    【讨论】:

      猜你喜欢
      • 2013-04-20
      • 1970-01-01
      • 1970-01-01
      • 2019-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-20
      相关资源
      最近更新 更多