Я пытаюсь отправить электронную почту с 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);
Это прекрасно работает и показывает изображения.
Кто-нибудь, пожалуйста, помогите мне исправить это.
Используйте ByteArrayDataSource вместо собственного источника InputStreamDataSource.
В вашем коде отображается только одно изображение; надеюсь, вы используете разные идентификаторы контента для каждого изображения.
Ваш код также не должен указывать, как содержимое html ссылается на изображения; надеюсь, что он использует правильный URL-адрес "cid:".
В FAQ по JavaMail больше информации о том, как отправлять сообщения, содержащие изображения.
Для всех, у кого есть эта проблема. Я исправил его с помощью ответа @Bill Shannon. Это установит изображение src, используя строку base64 в html-письме.
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"
DataHandler dataHandler = new DataHandler(new ByteArrayDataSource(tile, "image/*"));