Create multi-part message in MIME format Freemarker template via Spring 3 JavaMail

匿名 (未验证) 提交于 2019-12-03 08:46:08

问题:

How do you create email message that contains text and HTML version for the same content?

Of course I would like to know how to setup the freemarker template or the header of the message that will be send.

When I look on the source of message multi-part message in MIME format that I receive in inbox every once in while this is what is in there:

This is a multi-part message in MIME format.  ------=_NextPart_000_B10D_01CBAAA8.F29DB300 Content-Type: text/plain Content-Transfer-Encoding: 7bit  ...Text here...  ------=_NextPart_000_B10D_01CBAAA8.F29DB300 Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable  <html><body> html code here ... </body></html> 

回答1:

If you spot any inconsistencies please let me know. I had to extract this from pretty complex object so that's why this looks like it does.

//some important imports import freemarker.template.Template; import org.springframework.mail.javamail.*; import org.springframework.context.*; import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer; import javax.mail.internet.MimeMessage;  private JavaMailSender mailSender; private MessageSource messageSource; private ExecutorService executor = Executors.newFixedThreadPool(50);  MimeMessagePreparator preparator = new MimeMessagePreparator() {     public void prepare(MimeMessage mimeMessage) throws Exception {         MimeMessageHelper message = new MimeMessageHelper(mimeMessage);              message.setFrom(from);             message.setTo(recipient);             message.setSubject(subject);              // Now the message body.             Multipart mp = new MimeMultipart();              BodyPart textPart = new MimeBodyPart();             Template textTemplate = freemarkerConfig.getConfiguration().getTemplate(textEmailTemplate); // "/WEB-INF/emailText/*.ftl"             final StringWriter textWriter = new StringWriter();             textEmailTemplate.process(modelMap, textWriter);             textPart.setText(textWriter.toString()); // sets type to "text/plain"               BodyPart pixPart = new MimeBodyPart();             Template pixTemplate = freemarkerConfig.getConfiguration().getTemplate(pixEmailTemplate); // "/WEB-INF/emailPix/*.ftl"             final StringWriter pixWriter = new StringWriter();             textEmailTemplate.process(modelMap, pixWriter);             pixPart.setContent(pixWriter.toString(), "text/html");              // Collect the Parts into the MultiPart             mp.addBodyPart(textPart);             mp.addBodyPart(pixPart);             // Put the MultiPart into the Message              message.setContent(mp);                         } };  executor.submit(new SendMail(preparator));  class SendMail extends Thread {     MimeMessagePreparator preparator;      SendMail(MimeMessagePreparator preparator) {         this.preparator = preparator;     }      public void run() {         mailSender.send(preparator);       } } 


回答2:

When using Spring you can do:

  String plainText = "MyPleinText";   String htmlText = "<html><body><h1>MyHTML</h1></body></html>";   MimeMessage message = this.mailSender.createMimeMessage();   MimeMessageHelper helper = new MimeMessageHelper(message, true, MAIL_ENCODING);   helper.setText(plainText,htmlText); 

And it will do the job. There is no Freemarker stuff involved.

The MailSender can be:

  <bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">     <property name="host" value="${smtp.host}" />     <property name="port" value="${smtp.port}" />     <property name="defaultEncoding" value="UTF-8" />   </bean> 


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!