Thymeleaf не прикреплять все иконки к шаблону - PullRequest
0 голосов
/ 04 октября 2018

У меня проблема с Thymeleaf , когда я пытаюсь создать электронное письмо со значками на шаблоне.Я выполнил шаги, как указано в документации См. Часть 4.3 , но в электронном письме отображаются только 2 из 3 значков.

Сначала я загружаю значки:

private byte[] loadImage(String path, String extension) {
    byte[] image = new byte[0];

    try {
        URL file = getClass().getClassLoader().getResource(path);
        BufferedImage buffer = ImageIO.read(file);
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        ImageIO.write(buffer, extension, outputStream);
        image = outputStream.toByteArray();
    } catch (IOException exception) {
        log.debug(exception.getLocalizedMessage());
    }

Затем я добавляю значки к MimeMessageHelper:

private void attachIcons(MimeMessageHelper message) {
    try {
        byte[] logoIconInBytes = loadImage(LOGO_ICON_PATH, "png");
        InputStreamSource logoImageSource = new ByteArrayResource(logoIconInBytes);
        message.addInline(LOGO_IMAGE_RESOURCE, logoImageSource, IMAGE_CONTENT_TYPE);
        byte[] phoneIconInBytes = loadImage(PHONE_ICON_PATH, "png");
        InputStreamSource phoneImageSource = new ByteArrayResource(phoneIconInBytes);
        message.addInline(PHONE_IMAGE_RESOURCE, phoneImageSource, IMAGE_CONTENT_TYPE);
        byte[] emailIconInBytes = loadImage(EMAIL_ICON_PATH, "png");
        InputStreamSource emailImageSource = new ByteArrayResource(emailIconInBytes);
        message.addInline(EMAIL_IMAGE_RESOURCE, emailImageSource, IMAGE_CONTENT_TYPE);
    } catch (MessagingException exception) {
        log.debug(exception.getLocalizedMessage());
    }
}

Где:

private static final String LOGO_ICON_PATH = "data" + File.separator + "logo_example.png";
private static final String PHONE_ICON_PATH = "data" + File.separator + "phone.png";
private static final String EMAIL_ICON_PATH = "data" + File.separator + "email.png";
private static final String IMAGE_CONTENT_TYPE = "image/png";

Затем я устанавливаю переменные на context перед отправкой электронного письма:

......
context.setVariable(LOGO_IMAGE_RESOURCE, LOGO_IMAGE_RESOURCE);
context.setVariable(PHONE_IMAGE_RESOURCE, PHONE_IMAGE_RESOURCE);
context.setVariable(EMAIL_IMAGE_RESOURCE, EMAIL_IMAGE_RESOURCE);
String content = templateEngine.process(templateName, context);
......

И в шаблоне я вызываю переменные на их соответствующих <img>:

....
<img class="resize" th:src="|cid:${logoIcon}|" alt="Test">
....
<td class="someCssClass"> <img th:src="|cid:${phoneIcon}|" alt="phone"> </td>
<td class="someCssClass"> <img th:src="|cid:${emailIcon}|" alt="email"> </td>
....

Но значок email не отображается, проверяя DOM с Firefox Dev Tools Я нашел это:

Doom inspection

Вы можете видеть, что Logo и Телефон значки прикреплены, но значок Email не прикреплен.

Я изменил значок, думая, что, возможно, файл был поврежден, но ничего не изменилось.

Где проблема?

С уважением.

1 Ответ

0 голосов
/ 05 октября 2018

Ну, случайно я обнаружил проблему.Я не знаю, является ли это ошибкой или потому что я не знаю, как использовать API, но это странная вещь, которая происходила:

Когда я добавил значки:

byte[] logoIconInBytes = loadImage(LOGO_ICON_PATH, "png");
InputStreamSource logoImageSource = new ByteArrayResource(logoIconInBytes);
message.addInline(LOGO_IMAGE_RESOURCE, logoImageSource, IMAGE_CONTENT_TYPE);
byte[] phoneIconInBytes = loadImage(PHONE_ICON_PATH, "png");
InputStreamSource phoneImageSource = new ByteArrayResource(phoneIconInBytes);
message.addInline(PHONE_IMAGE_RESOURCE, phoneImageSource, IMAGE_CONTENT_TYPE);
byte[] emailIconInBytes = loadImage(EMAIL_ICON_PATH, "png");
InputStreamSource emailImageSource = new ByteArrayResource(emailIconInBytes);
message.addInline(EMAIL_IMAGE_RESOURCE, emailImageSource, IMAGE_CONTENT_TYPE);

Я удалил строки кода электронной почты, чтобы написать их снова на случай, если возникнет какая-либо ошибка.

byte[] logoIconInBytes = loadImage(LOGO_ICON_PATH, "png");
InputStreamSource logoImageSource = new ByteArrayResource(logoIconInBytes);
message.addInline(LOGO_IMAGE_RESOURCE, logoImageSource, IMAGE_CONTENT_TYPE);
byte[] phoneIconInBytes = loadImage(PHONE_ICON_PATH, "png");
InputStreamSource phoneImageSource = new ByteArrayResource(phoneIconInBytes);
message.addInline(PHONE_IMAGE_RESOURCE, phoneImageSource, IMAGE_CONTENT_TYPE);

Случайно я запустил приложение, сгенерировал и отправил электронное письмо, и заметил, что значок телефона не отображается.Я удалил значок телефона и загрузил только логотип, на этот раз ни один значок не отображался в электронном письме.

Итак, решение заключается в добавлении фиктивного контента после загрузки всех значков для отображения.

byte[] logoIconInBytes = loadImage(LOGO_ICON_PATH, "png");
InputStreamSource logoImageSource = new ByteArrayResource(logoIconInBytes);
message.addInline(LOGO_IMAGE_RESOURCE, logoImageSource, IMAGE_CONTENT_TYPE);
byte[] phoneIconInBytes = loadImage(PHONE_ICON_PATH, "png");
InputStreamSource phoneImageSource = new ByteArrayResource(phoneIconInBytes);
message.addInline(PHONE_IMAGE_RESOURCE, phoneImageSource, IMAGE_CONTENT_TYPE);
byte[] emailIconInBytes = loadImage(EMAIL_ICON_PATH, "png");
InputStreamSource emailImageSource = new ByteArrayResource(emailIconInBytes);
message.addInline(EMAIL_IMAGE_RESOURCE, emailImageSource, IMAGE_CONTENT_TYPE);
// Dummy content that won't be displayed to make all previous icons visible on the email
message.addInline("emptyIcon", new ByteArrayResource(new byte[0]), IMAGE_CONTENT_TYPE);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...