`

Spring邮件发送(可带附件,模板,群发,异步发送等功能)

阅读更多


以下是我对spring发送邮件的总结:
分别使用了两种方法:单例模式和属性全注入的方法。
发送模式又分为:单发,群发。
可发送:text,html模板,附件等。
1、单例模式(单发,群发text)
在classpath底下新建application-mail.xml,内容如下:
Xml代码:

Java代码  收藏代码
  1. <?xml version= "1.0"  encoding= "UTF-8" ?>    
  2. <beans xmlns="http://www.springframework.org/schema/beans"     
  3.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"     
  4.        xmlns:aop="http://www.springframework.org/schema/aop"     
  5.        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd      
  6.        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">     
  7.     <!-- 注意:这里的参数(如用户名、密码)都是针对邮件发送者的 -->    
  8.     <bean id="mailSender"     
  9.   class = "org.springframework.mail.javamail.JavaMailSenderImpl" >    
  10.         <property name="host" >    
  11.             <value>smtp.163 .com</value>    
  12.         </property>    
  13.         <property name="javaMailProperties" >    
  14.             <props>    
  15.                 <prop key="mail.smtp.auth" > true </prop>    
  16.                 <prop key="mail.smtp.timeout" > 25000 </prop>    
  17.             </props>    
  18.         </property>    
  19.         <property name="username" >    
  20.             <value>username@163 .com</value>    
  21.         </property>    
  22.         <property name="password" >    
  23.             <value>password</value>    
  24.         </property>    
  25.     </bean>    
  26. </beans>    


或者把以上的Beans配置到applicaiont.xml里面也可以。
发送text格式的Email类:

Java代码  收藏代码
  1. /  
  2. import  org.springframework.context.ApplicationContext;  
  3. import  org.springframework.context.support.ClassPathXmlApplicationContext;  
  4. import  org.springframework.mail.SimpleMailMessage;  
  5. import  org.springframework.mail.javamail.JavaMailSender;  
  6.   
  7. public   class  EmailUtil {  
  8.   
  9.     private   static  EmailUtil emailUtil =  null ;  
  10.       
  11.     public  ApplicationContext ctx =  null ;   
  12.       
  13.     private  EmailUtil() {  
  14.         //获取上下文            
  15.         ctx = new  ClassPathXmlApplicationContext( "applicationContext-mail.xml" );     
  16.     }  
  17.     /**  
  18.      *   
  19.      * @function:获得单例  
  20.      */   
  21.     public   static  EmailUtil getInstance()  
  22.     {  
  23.         if (emailUtil== null )  
  24.         {  
  25.             synchronized  (EmailUtil. class )   
  26.             {  
  27.                 if (emailUtil== null ) {  
  28.                     emailUtil = new  EmailUtil();  
  29.                 }  
  30.             }  
  31.         }  
  32.         return  emailUtil;  
  33.     }  
  34.   
  35.     public   void  sentEmails(String emails,String subject,String text)  
  36.     {             
  37.         //获取JavaMailSender bean      
  38.         JavaMailSender sender = (JavaMailSender) ctx.getBean("mailSender" );     
  39.         //SimpleMailMessage只能用来发送text格式的邮件     
  40.         SimpleMailMessage mail = new  SimpleMailMessage();   
  41.         String email[] = emails.split(";" );  
  42.         for ( int  i= 0 ;i<email.length;i++) {  
  43.             try  {     
  44.                 mail.setTo(email[i]);//接受者   
  45.                 mail.setFrom("username@163.com" );   
  46.                 mail.setSubject(subject);//主题      
  47.                 mail.setText(text);//邮件内容      
  48.                 sender.send(mail);     
  49.             } catch  (Exception e) {     
  50.                 e.printStackTrace();    
  51.             }  
  52.         }  
  53.     }  
  54.       
  55.     /**  
  56.      * @function:测试邮件发送  
  57.      */   
  58.     public   static   void  main(String[] args) {      
  59.         String  mail_title  = "注册成功" ;  
  60.         String  mail_content    = "恭喜!您已经注册成功.<BR>欢迎使用本网站,主页地址:<a href='http://www.baidu.com'/>" ;  
  61.         EmailUtil email = EmailUtil.getInstance();     
  62.         email.sentEmails("username@163.com" ,mail_title,mail_content);  
  63.     }     
  64. }  


2.属性全注入的方法(单发,群发html模板)
FreeMarker是一个被广泛使用的模板框架,Spring可以很好的支持该框架。Spring为FreeMarker提供了一个 FreeMarkerConfigurer类,通过此类可方便地创建FreeMarker的基础环境,Spring提供 FreeMarkerTemplateUtils工具类来完成解析模板的任务。下面以用户注册成功后发送的模板文件 registerUser.ftl,${content}标签代表一个可被替换的动态属性。FreeMarker模板的标签支持级联属性, 如${user.id}则表示user对象的id属性。在配置文件中已设置好模板目录,所以可在类中直接用模板文件名来定位模板文件。模板文件用UTF- 8编码格式,避免中文乱码。通过设置template_update_delay属性,可让FreeMarker定期刷新模板,从而使应用程序在不重启下 更新模板。

Html代码  收藏代码
  1. < html >     
  2.    < head >     
  3.       < meta   http-equiv = "content-type"   content = "text/html;charset=utf8" >     
  4.    </ head >     
  5.    < body >     
  6.        恭喜您成功注册!您的用户名为:< font   color = 'red'   size = '30' > ${content} </ font >     
  7.    </ body >     
  8. </ html >     

 

Xml代码  收藏代码
  1. <? xml   version = "1.0"   encoding = "UTF-8" ?>        
  2. < beans   xmlns = "http://www.springframework.org/schema/beans"        
  3.        xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"        
  4.        xmlns:aop = "http://www.springframework.org/schema/aop"        
  5.        xsi:schemaLocation ="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd        
  6.        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">        
  7.     <!-- 注意:这里的参数(如用户名、密码)都是针对邮件发送者的 -->        
  8.     < bean   id = "mailSender"        
  9.   class = "org.springframework.mail.javamail.JavaMailSenderImpl" >        
  10.         < property   name = "host" >        
  11.             < value > smtp.163.com </ value >        
  12.         </ property >        
  13.         < property   name = "javaMailProperties" >        
  14.             < props >        
  15.                 < prop   key = "mail.smtp.auth" > true </ prop >        
  16.                 < prop   key = "mail.smtp.timeout" > 25000 </ prop >        
  17.             </ props >        
  18.         </ property >        
  19.         < property   name = "username" >        
  20.             < value > username@163.com </ value >        
  21.         </ property >        
  22.         < property   name = "password" >        
  23.             < value > password </ value >        
  24.         </ property >        
  25.     </ bean >        
  26. </ beans >      
  27. < bean   id = "freeMarker"   class = "org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer" >     
  28.   < property   name = "templateLoaderPath"   value = "classpath:mailTemplate" /> <!--指定模板文件目录-->       
  29.   < property   name = "freemarkerSettings" > <!-- 设置FreeMarker环境属性-->       
  30.       < props >     
  31.           < prop   key = "template_update_delay" > 1800 </ prop > <!--刷新模板的周期,单位为秒-->       
  32.           < prop   key = "default_encoding" > UTF-8 </ prop > <!--模板的编码格式 -->     
  33.           < prop   key = "locale" > zh_CN </ prop > <!-- 本地化设置-->     
  34.       </ props >     
  35.   </ property >     
  36. </ bean >     
  37.     <!-- ************************           Email Service配置         ********************************* -->   
  38.      < bean   id = "emailService"   class = "EmailService" >   
  39.         < property   name = "sender"   ref = "mailSender" > </ property >    
  40.         < property   name = "freeMarkerConfigurer"   ref = "freeMarker" > </ property >     
  41.     </ bean >   
  42. </ beans >     

 

Java代码  收藏代码
  1. import  javax.mail.MessagingException;  
  2. import  org.springframework.mail.javamail.JavaMailSender;  
  3. import  org.springframework.ui.freemarker.*;     
  4. import  org.springframework.web.servlet.view.freemarker.*;     
  5. import  freemarker.template.*;     
  6.   
  7. public   abstract   class  EmailAbstract {  
  8.       
  9.     protected  String from;  
  10.     protected  String subject;  
  11.     protected  JavaMailSender sender;  
  12.     protected  FreeMarkerConfigurer freeMarkerConfigurer= null //FreeMarker的技术类      
  13.        
  14.     public  String getFrom() {  
  15.         return  from;  
  16.     }  
  17.   
  18.     public   void  setFrom(String from) {  
  19.         this .from = from;  
  20.     }  
  21.   
  22.     public  String getSubject() {  
  23.         return  subject;  
  24.     }  
  25.   
  26.     public   void  setSubject(String subject) {  
  27.         this .subject = subject;  
  28.     }  
  29.   
  30.     public  JavaMailSender getSender() {  
  31.         return  sender;  
  32.     }  
  33.   
  34.     public   void  setSender(JavaMailSender sender) {  
  35.         this .sender = sender;  
  36.     }  
  37.       
  38.   public   void  setFreeMarkerConfigurer(FreeMarkerConfigurer freeMarkerConfigurer) {     
  39.       this .freeMarkerConfigurer = freeMarkerConfigurer;     
  40.   }  
  41.     /**  
  42.      * 发送单个html格式邮件  
  43.      */   
  44.     public   abstract   void  sendEmail(String content,String address);  
  45.     /**  
  46.      * 批量发送html格式邮件  
  47.      */   
  48.     public   abstract   void  sendBatchEmail(String content,List<String> address);  
  49. }  

 

Java代码  收藏代码
  1. import  javax.mail.Message;  
  2. import  javax.mail.MessagingException;  
  3. import  javax.mail.internet.InternetAddress;  
  4. import  javax.mail.internet.MimeMessage;  
  5. import  org.springframework.mail.javamail.MimeMessageHelper;  
  6. import  org.springframework.ui.freemarker.*;     
  7. import  org.springframework.web.servlet.view.freemarker.*;     
  8. import  freemarker.template.*;     
  9.   
  10. public   class  EmailService  extends  EmailAbstract {  
  11.   
  12.     /**  
  13.      * 发送带模板的单个html格式邮件  
  14.      */   
  15.     public   void  sendMessage(String content,String address)  throws  MessagingException {  
  16.           MimeMessage msg = sender.createMimeMessage();  
  17.           //设置utf-8或GBK编码,否则邮件会有乱码,true表示为multipart邮件    
  18.           MimeMessageHelper helper = new  MimeMessageHelper(msg,  true "utf-8" );   
  19.           helper.setTo(address);    //邮件接收地址   
  20.           helper.setFrom(from);   //邮件发送地址,这里必须和xml里的邮件地址相同一致   
  21.           helper.setSubject(subject);   //主题    
  22.           String htmlText = getMailText(content);   //使用模板生成html邮件内容      
  23.           helper.setText(htmlText, true );    //邮件内容,注意加参数true,表示启用html格式       
  24.           sender.send(msg); //发送邮件   
  25.     }  
  26.     /**  
  27.      * 批量发送带附件的html格式邮件  
  28.      */   
  29.     public   void  sendBatchEmail(String content,List<String> address)  throws  MessagingException {  
  30.         MimeMessage msg = sender.createMimeMessage();  
  31.         MimeMessageHelper helper = new  MimeMessageHelper(msg,  true "utf-8" );  
  32.         String toList = getMailList(address);  
  33.         InternetAddress[] iaToList = new  InternetAddress().parse(toList);  
  34.         msg.setRecipients(Message.RecipientType.TO,iaToList);  
  35.         helper.setFrom(from);  
  36.         helper.setSubject(subject);  
  37.         helper.setText(content, true );  
  38.          //添加内嵌文件,第1个参数为cid标识这个文件,第2个参数为资源        
  39.         helper.addInline("a" new  File( "E:/logo_a.jpg" ));  //附件内容          
  40.         helper.addInline("b" new  File( "E:/logo_b.png" ));         
  41.         File file=new  File( "E:/测试中文文件.rar" );          
  42.         // 这里的方法调用和插入图片是不同的,使用MimeUtility.encodeWord()来解决附件名称的中文问题         
  43.         helper.addAttachment(MimeUtility.encodeWord(file.getName()), file);  
  44.          //如果主题出现乱码,可以使用该函数,也可以使用下面的函数      
  45.           //helper.setSubject(MimeUtility.encodeText(String text,String charset,String encoding))        
  46.          //第2个参数表示字符集,第三个为目标编码格式。   
  47.           //MimeUtility.encodeWord(String word,String charset,String encoding)     
  48.         sender.send(msg);  
  49.     }  
  50.     /**  
  51.      * 集合转换字符串  
  52.      */   
  53.     public  String getMailList(List<String> to){       
  54.       StringBuffer toList = new  StringBuffer();  
  55.       int  length = to.size();  
  56.       if (to!= null  && length < 2 ){  
  57.            toList.append(to.get(0 ));  
  58.       }else {  
  59.            for ( int  i= 0 ;i<length;i++){  
  60.                    toList.append(to.get(i));  
  61.                    if (i!=(length- 1 )){  
  62.                        toList.append("," );  
  63.                    }  
  64.            }  
  65.        }  
  66.        return  toList.toString();  
  67.     }  
  68.     //通过模板构造邮件内容,参数content将替换模板文件中的${content}标签。      
  69.   private  String getMailText(String content)  throws  Exception {     
  70.     String htmlText = "" ;      
  71.     //通过指定模板名获取FreeMarker模板实例      
  72.     Template tpl = freeMarkerConfigurer.getConfiguration().getTemplate("registerUser.ftl" );     
  73.     Map map = new  HashMap();     //FreeMarker通过Map传递动态数据      
  74.     map.put("content" ,content);  //注意动态数据的key和模板标签中指定的属性相匹配      
  75.     //解析模板并替换动态数据,最终content将替换模板文件中的${content}标签。      
  76.     htmlText = FreeMarkerTemplateUtils.processTemplateIntoString(tpl,map);     
  77.     return  htmlText;     
  78.   }   

分享到:
评论
1 楼 流浪鱼 2012-02-27  
写的不错啊

相关推荐

Global site tag (gtag.js) - Google Analytics