2011-01-03 28 views
5

Làm thế nào để bạn tạo thư email có chứa văn bản và phiên bản HTML cho cùng một nội dung?Tạo thông điệp nhiều phần trong định dạng MIME Freemarker mẫu qua Spring 3 JavaMail

Tất nhiên tôi muốn biết cách thiết lập mẫu dấu vị trí hoặc tiêu đề của thư sẽ được gửi.

Khi tôi nhìn vào nguồn gốc của thông điệp nhắn đa phần ở định dạng MIME mà tôi nhận được trong hộp thư đến mỗi một lần trong khi đây là những gì có trong đó:

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> 

Trả lời

4

Nếu bạn phát hiện bất kỳ mâu thuẫn hãy cho tôi biết. Tôi đã phải trích xuất nó từ một đối tượng khá phức tạp nên đó là lý do tại sao nó trông giống như vậy.

//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); 
     } 
} 
1

Khi sử dụng Spring bạn có thể làm:

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); 

Và nó sẽ thực hiện công việc. Không có nội dung nào có liên quan đến Freemarker.

MailSender có thể là:

<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> 
Các vấn đề liên quan