Java не может отправить письмо с HTML с изображениями

1

Я пытаюсь отправить электронную почту с 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);

Это прекрасно работает и показывает изображения.

Кто-нибудь, пожалуйста, помогите мне исправить это.

Теги:
base64
gmail
javamail

2 ответа

1
Лучший ответ

Используйте ByteArrayDataSource вместо собственного источника InputStreamDataSource.

В вашем коде отображается только одно изображение; надеюсь, вы используете разные идентификаторы контента для каждого изображения.

Ваш код также не должен указывать, как содержимое html ссылается на изображения; надеюсь, что он использует правильный URL-адрес "cid:".

В FAQ по JavaMail больше информации о том, как отправлять сообщения, содержащие изображения.

  • 0
    Большое спасибо, все остальное прекрасно, как другой идентификатор контента и т. Д. Я пытался в течение достаточно долгого времени, я не могу поверить, что он работает с ByteArrayDataSource. Я сделал DataHandler dataHandler = new DataHandler(new ByteArrayDataSource(tile, "image/*"));
  • 0
    Вы действительно хотите использовать правильный тип изображения MIME, например, image / gif или image / jpeg, а не image / *, который не является допустимым типом MIME.
Показать ещё 5 комментариев
0

Для всех, у кого есть эта проблема. Я исправил его с помощью ответа @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"

Ещё вопросы

Сообщество Overcoder
Наверх
Меню