可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
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>