• Spring发送基于freemarker模板的邮件


    在项目开发过程中,我们经常会遇到需要发送邮件的场景,比如:用户验证邮箱的时候,有活动通知或者提醒通知的时候……有些时候我们可能只需要发送一些简单文本内容即可,但是大多数情况下我们更希望邮件的内容是丰富多彩,而且是“定制的”,能够灵活修改。这时候使用一个方便修改的邮件模板就显得非常必要了。

    对于发送邮件,大家都知道Oracle提供了官方的JavaMail API,这个API没有包含在标准的JDK中,所以需要额外下载。JavaMail功能全而强大,但是在易用性方面还是略微差点,这方面Spring对JavaMail API的调用作了很好的封装,让开发者更多地考虑邮件的内容处理即可。至于邮件模板的生成,这里选用非常强大且好用的模板引擎Freemarker。

    下面是简单的代码示例:
    一、发送邮件处理类

    FreemarkerMailService.java

    Java代码  收藏代码
    1. /** 
    2.  * 使用freemarker文件作为模板发送邮件 
    3.  * @author wdmcygah 
    4.  * 
    5.  */  
    6. @Service  
    7. public class FreemarkerMailService {  
    8.   
    9.     @Autowired  
    10.     private JavaMailSender mailSender;  
    11.       
    12.     @Autowired  
    13.     private FreeMarkerConfigurer fmConfigurer;  
    14.       
    15.     /** 
    16.      * 发送邮件 
    17.      * @param templateName 模板文件名 
    18.      * @param toEmailAddr  要发送到的邮箱地址 
    19.      * @param subject   邮件主题名 
    20.      * @param content   邮件内容 
    21.      */  
    22.     public void sendMail(String templateName,String toEmailAddr, String subject, Map<String,String> content){  
    23.         MimeMessage msg = mailSender.createMimeMessage();  
    24.         try {  
    25.             MimeMessageHelper helper=new MimeMessageHelper(msg,false,"utf-8");  
    26.             //要发送到的邮箱地址  
    27.             helper.setTo(toEmailAddr);  
    28.             //从哪发送的邮箱地址,自己改成真实的  
    29.             helper.setFrom("fromEmailAddress");  
    30.             helper.setSubject(subject);  
    31.             String text = getMailContent(content,templateName);  
    32.             helper.setText(text,true);  
    33.             helper.setSentDate(new Date());  
    34.             mailSender.send(helper.getMimeMessage());  
    35.         } catch (MessagingException e) {  
    36.             e.printStackTrace();  
    37.             System.out.println("发送邮件异常");  
    38.         }  
    39.           
    40.     }  
    41.   
    42.     /** 
    43.      * 根据模板获得解析后的内容 
    44.      * @param content   邮件内容 
    45.      * @param templateName  邮件模板名 
    46.      * @return 
    47.      */  
    48.     private String getMailContent(Map<String,String> content, String templateName) {  
    49.         String result = null;  
    50.         try {  
    51.             Template template = fmConfigurer.getConfiguration().getTemplate(templateName);  
    52.             result = FreeMarkerTemplateUtils.processTemplateIntoString(template, content);  
    53.         } catch (IOException e) {  
    54.             e.printStackTrace();  
    55.             System.out.println("获得freemarker模板出错");  
    56.         } catch (TemplateException e) {  
    57.             e.printStackTrace();  
    58.             System.out.println("模板解析出错");  
    59.         }  
    60.         return result;  
    61.     }  
    62. }  

    二、关键配置文件

    spring-mail.xml

    Xml代码  收藏代码
    1. <bean id="javaMailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">  
    2.         <!-- 这里选用163邮件服务器地址 -->  
    3.         <property name="host" value="smtp.163.com"></property>  
    4.         <!-- 用户名、密码改成自己真实的 -->  
    5.         <property name="username" value="real_username"></property>  
    6.         <property name="password" value="real_password"></property>  
    7.         <property name="defaultEncoding" value="UTF-8"></property>  
    8.         <property name="javaMailProperties">  
    9.             <props>  
    10.                 <prop key="mail.smtp.auth">true</prop>  
    11.             </props>  
    12.         </property>  
    13.     </bean>     
    14.   
    15.     <bean id="freeMarker" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">    
    16.       <property name="templateLoaderPath" value="classpath:/freemarker"/><!--指定模板文件目录-->     
    17.       <property name="freemarkerSettings"><!-- 设置FreeMarker环境属性-->     
    18.           <props>    
    19.               <prop key="template_update_delay">1800</prop><!--刷新模板的周期,单位为秒-->     
    20.               <prop key="default_encoding">UTF-8</prop><!--模板的编码格式 -->    
    21.               <prop key="locale">zh_CN</prop><!-- 本地化设置-->    
    22.           </props>    
    23.       </property>    
    24.     </bean>   
    Xml代码  收藏代码
    1.    

    三、Freemarker模板文件

    hello.ftl

    Java代码  收藏代码
    1. 恭喜你,${name}!你已经用spring+freemarker发送了一封模板邮件!  

    四、主要依赖包

    Xml代码  收藏代码
    1. <dependency>  
    2.             <groupId>org.springframework</groupId>  
    3.             <artifactId>spring-context-support</artifactId>  
    4.             <version>4.0.0.RELEASE</version>  
    5.         </dependency>  
    6.         <dependency>  
    7.             <groupId>javax.mail</groupId>  
    8.             <artifactId>mail</artifactId>  
    9.             <version>1.4.7</version>  
    10.         </dependency>  
    11. <dependency>  
    12.             <groupId>org.freemarker</groupId>  
    13.             <artifactId>freemarker</artifactId>  
    14.             <version>2.3.21</version>  
    15.         </dependency>  

    五、测试类

    Java代码  收藏代码
    1. public class FreemarkerMailServiceTest extends BaseTest{  
    2.   
    3.   @Autowired  
    4.   private FreemarkerMailService fmService;  
    5.       
    6.   @Test  
    7.   public void sendMail() {  
    8.       String templateName = "hello.ftl";  
    9.       Map<String,String> content = new HashMap<String, String>();  
    10.       content.put("name", "wdmcygah");  
    11.       String addr = "ToEmailAddress";  
    12.       String subject = "测试";  
    13.       fmService.sendMail(templateName, addr, subject, content);  
    14.   }  
    15. }  

    如果想看完整源码,可以到我的Github仓库查看:https://github.com/wdmcygah/research-spring
    另外有些时候你可能只是想发送简单文本,那就在设置邮件内容(setText)的时候设置简单文本即可,同时比如邮件里面希望附带附件之类的,只需调用MimeMessageHelper的addAttachment方法即可。类似下面的这种处理方式:

    JavaMailService.java

    Java代码  收藏代码
      1. /** 
      2.  * 邮件发送处理类 
      3.  * @author wdmcygah 
      4.  * 
      5.  */  
      6. @Service  
      7. public class JavaMailService {  
      8.   
      9.     @Autowired  
      10.     private JavaMailSender mailSender;  
      11.       
      12.     /** 
      13.      * 发送简单文本 
      14.      */  
      15.     public void sendSimpleMail(){  
      16.         MimeMessage javaMailMessage = mailSender.createMimeMessage();  
      17.         MimeMailMessage msgWrapper = new MimeMailMessage(javaMailMessage);  
      18.         msgWrapper.setTo("toEmailAddress");  
      19.         msgWrapper.setFrom("fromEmailAddress");  
      20.         msgWrapper.setSubject("测试");  
      21.         msgWrapper.setText("测试的内容.");  
      22.         msgWrapper.setSentDate(new Date());  
      23.         mailSender.send(msgWrapper.getMimeMessage());  
      24.         System.out.println("发送成功........");  
      25.     }  
      26.       
      27.     /** 
      28.      * 发送更多内容邮件 
      29.      */  
      30.     public void sendMultiMail(){  
      31.         mailSender.send(new MimeMessagePreparator() {  
      32.             public void prepare(MimeMessage mimeMessage) throws Exception {  
      33.                 MimeMessageHelper helper = new MimeMessageHelper(mimeMessage,true,"UTF-8");  
      34.                 helper.setTo("toEmailAddress");  
      35.                 helper.setFrom("fromEmailAddress");  
      36.                 helper.setSubject("测试");  
      37.                 StringBuilder sb = new StringBuilder("<html><body>hello..</body></html>");  
      38.                 helper.setText(sb.toString(),true);  
      39.                 helper.addInline("inlinePng", new ClassPathResource("/multisource/test.jpg"));  
      40.                 helper.addAttachment("test.png", new ClassPathResource("/multisource/test.png"));  
      41.             }  
      42.         });  
      43.     }  
      44.       
      45. }  
  • 相关阅读:
    Python: 编程遇到的一些问题以及网上解决办法?
    Python: Win7下使用 pip install lxml 无法安装lxml?
    Python:Pycharm下无法导入安装好的第三方模块?
    Python:如何删除文件中的空白行?
    Pycharm 快捷键
    Python读取二进制文件
    python实现grep
    Python学习笔记
    VBA批量查找和复制文件
    %~dp0是什么意思
  • 原文地址:https://www.cnblogs.com/cmfwm/p/7686554.html
Copyright © 2020-2023  润新知