2015-08-21 4 views
3

Я пытаюсь отправить электронное письмо с встроенным изображением с помощью ThymeLeaf и Spring, но пока ничего не получилось. Письмо отправляется, но встроенное изображение не отображается в письме.Как отправить электронную почту со встроенным изображением с помощью ThymeLeaf

Проект не веб-(не веб-сайт), но на рабочем столе автономно, не мобильный

Это, как я получить файл изображения:

URL url = getClass().getResource("/LawFirmAdvisoryGroup.jpg"); 
File file = new File(url.getPath()); 

MultipartFile multipartFile = new MockMultipartFile(file.getName(), 
    file.getName(), "image/jpeg", IOUtils.toByteArray(input)); 

Мой класс обслуживания:

@Autowired 
private JavaMailSender mailSender; 

@Autowired 
private TemplateEngine templateEngine; 

public void sendMailWithInline(final String recipientName, final String recipientEmail, final MultipartFile image, final byte[] imageBytes) 
throws MessagingException { 

    final Context ctx = new Context(); 
     ctx.setVariable("imageResourceName", image.getName()); // so that we can reference it from HTML 

     final MimeMessage mimeMessage = this.mailSender.createMimeMessage(); 
     final MimeMessageHelper message 
     = new MimeMessageHelper(mimeMessage, true, "UTF-8"); 
     message.setSubject("Inline Image"); 
     message.setFrom("[email protected]"); 
     message.setTo(recipientEmail); 

     // Add the inline image, referenced from the HTML code as "cid:${imageResourceName}" 
     final InputStreamSource imageSource = new ByteArrayResource(imageBytes); 
     message.addInline(image.getName(), imageSource, image.getContentType()); 


     final String htmlContent = this.templateEngine.process("left_sidebar.html", ctx); 
     message.setText(htmlContent, true); 
     this.mailSender.send(mimeMessage); 

    } 

HTML:

<!DOCTYPE html> 
<html xmlns:th="http://www.thymeleaf.org"> 
    <head> 
    <title th:remove="all">Email with inline image</title> 
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
    </head> 
    <body> 
    <p> 
     <img src="LawFirmAdvisoryGroup.jpg" th:src="'cid:' + ${imageResourceName}" /> 
    </p> 
    </body> 
</html> 
+0

«_so далеко не success_ ". Вы действительно должны пытаться быть более описательными в том, что происходит, а не просто говорить «это не работает». – csmckelvey

+0

@Takendarkk Я редактировал вопрос. Письмо отправляется, но встроенное изображение не отображается в письме. –

+0

@ Program-Me-Rev, вы решили его? –

ответ

2

Это отлично работает:

Просто добавьте ссылку на изображение, размещенное на внешнем сервере, от рабочего стола. Используйте встроенный CSS вместо классов CSS.

Этот веб-сайт поможет вам преобразовать классы CSS в встроенный CSS, Premailer.Dialect.

Избегайте любых фантазийных CSS, просто используйте самые простые. Плавающий (например, float: left;) следует избегать как можно больше, если вы хотите, чтобы ваша HTML-почта легко протекала, даже в мобильных устройствах и других небольших экранах.

Включите NekoHTML в библиотеках проекта и изменить Spring spring.xml на:

<!-- THYMELEAF: Template Resolver for email templates --> 
<bean id="emailTemplateResolver" class="org.thymeleaf.templateresolver.ClassLoaderTemplateResolver"> 
    <property name="prefix" value="resources/WEB_INF/HTMLMailTemplates/XXXX/html/" /> 
    <!-- <property name="templateMode" value="HTML5" /> --> 
    <property name="templateMode" value="LEGACYHTML5" /> 
    <property name="characterEncoding" value="UTF-8" /> 
    <property name="order" value="1" /> 
</bean> 

Образец этого:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
    <title>Email With Inline Images</title> 

    <style> 
     body { 
      background-image: url('https://dl.dropbox.com/s/XXXX/pageBackGround.gif'); 
      background-repeat: repeat; 
      margin:0; 
      outline:0; 
     } 
     .pageContentWrapper { 
      padding:10px; 
      width: 100%; 
      background-image: url('https://dl.dropbox.com/s/XXXX/smallerInlineImage.gif'); 
      background-repeat: repeat; 
     } 
     .smallerInlineImage { 
      width: 22px; 
      height: 22px; 
      padding: 0 4px 6px 0; 
      float: left; 
     } 
    </style> 

</head> 

<body> 
    <div class="pageContentWrapper"> 
     <div class="smallerInlineImage"> 
      <img src="https://dl.dropboxusercontent.com/s/3ydel6zp53pb65b/smallerInlineImage.png" height="22" width="22"> 
     </div> 
    </div> 
</body> 

Класс обслуживания:

@Service 
public class ThymeEmailService { 

    @Autowired 
    private JavaMailSender mailSender; 

    @Autowired 
    private TemplateEngine templateEngine; 

    public void sendMailWithInline() throws MessagingException { 

     final Context ctx = new Context(); 

     final MimeMessage mimeMessage = this.mailSender.createMimeMessage(); 
     final MimeMessageHelper message = new MimeMessageHelper(mimeMessage, true, "UTF-8"); 
     message.setSubject("Sample Email Subject"); 
     message.setFrom("[email protected]"); 
     message.setTo("[email protected]"); 

     final String htmlContent = this.templateEngine.process("emailTemplate.html", ctx); 
     message.setText(htmlContent, true); 

     String[] attachments = {"C:\\Users\\MyPc\\Dropbox\\CV\\myPDFAttachment.pdf"}; 

     for (String attachment : attachments) { 
      FileSystemResource file = new FileSystemResource(attachment); 
      message.addAttachment(file.getFilename(), file); 
     } 

     this.mailSender.send(mimeMessage); 
    } 
} 
+1

Это не встроенное изображение, как задано в вопросе ... – bphilipnyc

1

Просто переместите вызов setText() до нескольких строк.

документация Javadoc для MimeMessageHelper.addInLine() говорит:

Примечание: Invoke addInlineпослеsetText(java.lang.String); Кроме того, почтовые программы могут быть не в состоянии правильно разрешить встроенные ссылки.

Смежные вопросы