Java 无法发送带有 html 图片的电子邮件

Java cannot send email with html with images

我正在尝试发送带有 html 的电子邮件,其中有两张图片。这两张图片作为 base64 字符串从 AngularJS 客户端发送,看起来像:

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);

这工作正常并显示图像。

谁能帮我解决这个问题。

使用 ByteArrayDataSource 而不是您自己的 InputStreamDataSource。

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

您的代码也不应该 html 内容引用图像的方式;希望它使用正确的 "cid:" URL.

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

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

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"