【问题标题】:Java cannot send email with html with imagesJava 无法发送带有图像的 html 的电子邮件
【发布时间】:2017-06-05 16:29:21
【问题描述】:

我正在尝试使用包含两个图像的 html 发送电子邮件。这两个图像是从 AngularJS 客户端作为 base64 字符串发送的,看起来像:

data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA+gAAALuCAYAAAA9jTxNAAAgAElEQ

请注意,我已将 base64 字符串截断,因为它太长了。

String temp = baseString.split(",")[1];
byte[] tile = DatatypeConverter.parseBase64Binary(temp);

BodyPart messageBodyPart = new MimeBodyPart();
InputStream inputStream = new ByteArrayInputStream(tile);
DataHandler dataHandler = new DataHandler(new InputStreamDataSource(inputStream));
messageBodyPart.setDataHandler(dataHandler);
messageBodyPart.setHeader("Content-ID", "<image>");
multipart.addBodyPart(messageBodyPart);

InputStreamDataSource:

public class InputStreamDataSource implements DataSource {

    private InputStream inputStream;

    public InputStreamDataSource(InputStream inputStream) {
        this.inputStream = inputStream;
    }

    public InputStream getInputStream() {
        return inputStream;
    }

    public OutputStream getOutputStream() throws IOException {
        throw new UnsupportedOperationException("Not implemented");
    }

    public String getContentType() {
        return "*/*";
    }

    public String getName() {
        return "InputStreamDataSource";
    }
}

图片未显示在邮件中。

但是当我使用 FileDataSource 而不是 base64 字符串时,它工作得非常好:

    DataSource fds = new FileDataSource("D:\\Projects\\Extras\\sofa1.png");
    messageBodyPart.setDataHandler(new DataHandler(fds));
    messageBodyPart.setHeader("Content-ID", "<image>");
    multipart.addBodyPart(messageBodyPart);

这可以正常工作并显示图像。

请有人帮我解决这个问题。

【问题讨论】:

    标签: java gmail base64 jakarta-mail


    【解决方案1】:

    使用ByteArrayDataSource 代替您自己的 InputStreamDataSource。

    您的代码仅显示一张图片;希望您为每张图片使用不同的 Content-ID。

    您的代码也不应该如何引用图像的 html 内容;希望它使用正确的“cid:” URL。

    JavaMail 常见问题解答中有更多关于 how to send messages that include images 的信息。

    【讨论】:

    • 非常感谢,其他一切都很好,比如不同的内容 ID 等我已经尝试了很长时间,我不敢相信它可以与 ByteArrayDataSource 一起使用。我做了DataHandler dataHandler = new DataHandler(new ByteArrayDataSource(tile, "image/*"));
    • 您真的想要使用正确的图像 MIME 类型,例如 image/gif 或 image/jpeg,而不是 image/*,因为它不是有效的 MIME 类型。
    • 充其量,您很幸运,您用于测试的任何邮件阅读器都在解决您的错误并忽略错误的 MIME 类型。
    • 哦,我不知道,我会相应地更改它。非常感谢您的帮助。
    • 根据你上面的数据,应该是image/png。
    【解决方案2】:

    对于遇到此问题的其他人。我已经使用@Bill Shannon 的回答修复了它。这将使用 html 电子邮件中的 base64 字符串设置图像 src。

    String temp = base64String.split(",")[1];
    byte[] tile = DatatypeConverter.parseBase64Binary(temp);
    BodyPart messageBodyPart = new MimeBodyPart();
    DataHandler dataHandler = new DataHandler(new ByteArrayDataSource(tile, "image/png"));
    messageBodyPart.setDataHandler(dataHandler);
    messageBodyPart.setHeader("Content-ID", "<image>");
    multipart.addBodyPart(messageBodyPart);
    

    html 字符串类似于:

    "<img style=\"height: 100px; width: 100px;\" src=\"cid:image\" alt=\"Tile\" title=\"Tile\">\r\n"
    

    【讨论】:

      猜你喜欢
      • 2013-11-11
      • 2013-06-01
      • 2012-04-07
      • 2011-08-27
      • 1970-01-01
      • 1970-01-01
      • 2011-09-19
      • 1970-01-01
      • 2015-07-29
      相关资源
      最近更新 更多