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"
我正在尝试发送带有 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"