Java无法使用带图像的html发送电子邮件

时间:2017-06-05 16:29:22

标签: java gmail base64 javamail

我正在尝试使用带有两个图像的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);

这样可以正常显示图像。

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

2 个答案:

答案 0 :(得分:1)

使用ByteArrayDataSource代替您自己的InputStreamDataSource。

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

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

JavaMail FAQ提供了有关how to send messages that include images的更多信息。

答案 1 :(得分:0)

对于有这个问题的其他人。我用@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"