`
linqincai
  • 浏览: 24153 次
  • 性别: Icon_minigender_1
  • 来自: 温州
社区版块
存档分类
最新评论

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

    博客分类:
  • j2ee
阅读更多

本文转自:http://mengqingyu.iteye.com/blog/389273

 

 

以下是我对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>    
<?xml version="1.0" encoding="UTF-8"?>  
<beans xmlns="http://www.springframework.org/schema/beans"  
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
       xmlns:aop="http://www.springframework.org/schema/aop"  
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd   
       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">  
    <!-- 注意:这里的参数(如用户名、密码)都是针对邮件发送者的 -->  
    <bean id="mailSender"  
  class="org.springframework.mail.javamail.JavaMailSenderImpl">  
        <property name="host">  
            <value>smtp.163.com</value>  
        </property>  
        <property name="javaMailProperties">  
            <props>  
                <prop key="mail.smtp.auth">true</prop>  
                <prop key="mail.smtp.timeout">25000</prop>  
            </props>  
        </property>  
        <property name="username">  
            <value>username@163.com</value>  
        </property>  
        <property name="password">  
            <value>password</value>  
        </property>  
    </bean>  
</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. }  
/
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;

public class EmailUtil {

	private static EmailUtil emailUtil = null;
	
	public ApplicationContext ctx = null; 
	
	private EmailUtil() {
		//获取上下文  		
		ctx = new ClassPathXmlApplicationContext("applicationContext-mail.xml");   
	}
	/**
	 * 
	 * @function:获得单例
	 */
	public static EmailUtil getInstance()
	{
		if(emailUtil==null)
		{
			synchronized (EmailUtil.class) 
			{
				if(emailUtil==null) {
					emailUtil = new EmailUtil();
				}
			}
		}
		return emailUtil;
	}

	public void sentEmails(String emails,String subject,String text)
	{			
		//获取JavaMailSender bean   
		JavaMailSender sender = (JavaMailSender) ctx.getBean("mailSender");   
		//SimpleMailMessage只能用来发送text格式的邮件  
		SimpleMailMessage mail = new SimpleMailMessage(); 
		String email[] = emails.split(";");
		for(int i=0;i<email.length;i++) {
			try {   
				mail.setTo(email[i]);//接受者
   				mail.setFrom("username@163.com"); 
				mail.setSubject(subject);//主题   
				mail.setText(text);//邮件内容   
				sender.send(mail);   
			} catch (Exception e) {   
				e.printStackTrace();  
			}
		}
	}
	
	/**
	 * @function:测试邮件发送
	 */
	public static void main(String[] args) {	
		String	mail_title	= "注册成功";
		String	mail_content	= "恭喜!您已经注册成功.<BR>欢迎使用本网站,主页地址:<a href='http://www.baidu.com'/>";
	    EmailUtil email = EmailUtil.getInstance();   
	    email.sentEmails("username@163.com",mail_title,mail_content);
	}   
}


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>    
<html>  
   <head>  
      <meta http-equiv="content-type" content="text/html;charset=utf8">  
   </head>  
   <body>  
       恭喜您成功注册!您的用户名为:<font color='red' size='30'>${content}</font>  
   </body>  
</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>    
<?xml version="1.0" encoding="UTF-8"?>     
<beans xmlns="http://www.springframework.org/schema/beans"     
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"     
       xmlns:aop="http://www.springframework.org/schema/aop"     
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd      
       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">     
    <!-- 注意:这里的参数(如用户名、密码)都是针对邮件发送者的 -->     
    <bean id="mailSender"     
  class="org.springframework.mail.javamail.JavaMailSenderImpl">     
        <property name="host">     
            <value>smtp.163.com</value>     
        </property>     
        <property name="javaMailProperties">     
            <props>     
                <prop key="mail.smtp.auth">true</prop>     
                <prop key="mail.smtp.timeout">25000</prop>     
            </props>     
        </property>     
        <property name="username">     
            <value>username@163.com</value>     
        </property>     
        <property name="password">     
            <value>password</value>     
        </property>     
    </bean>     
</beans>   
<bean id="freeMarker" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">  
  <property name="templateLoaderPath" value="classpath:mailTemplate"/><!--指定模板文件目录-->    
  <property name="freemarkerSettings"><!-- 设置FreeMarker环境属性-->    
      <props>  
          <prop key="template_update_delay">1800</prop><!--刷新模板的周期,单位为秒-->    
          <prop key="default_encoding">UTF-8</prop><!--模板的编码格式 -->  
          <prop key="locale">zh_CN</prop><!-- 本地化设置-->  
      </props>  
  </property>  
</bean>  
    <!-- ************************           Email Service配置         ********************************* -->
	 <bean id="emailService" class="EmailService">
		<property name="sender" ref="mailSender"></property> 
		<property name="freeMarkerConfigurer" ref="freeMarker"></property>  
	</bean>
</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. }  
import javax.mail.MessagingException;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.ui.freemarker.*;   
import org.springframework.web.servlet.view.freemarker.*;   
import freemarker.template.*;   

public abstract class EmailAbstract {
	
	protected String from;
	protected String subject;
	protected JavaMailSender sender;
	protected FreeMarkerConfigurer freeMarkerConfigurer=null; //FreeMarker的技术类   
	 
	public String getFrom() {
		return from;
	}

	public void setFrom(String from) {
		this.from = from;
	}

	public String getSubject() {
		return subject;
	}

	public void setSubject(String subject) {
		this.subject = subject;
	}

	public JavaMailSender getSender() {
		return sender;
	}

	public void setSender(JavaMailSender sender) {
		this.sender = sender;
	}
	
  public void setFreeMarkerConfigurer(FreeMarkerConfigurer freeMarkerConfigurer) {   
      this.freeMarkerConfigurer = freeMarkerConfigurer;   
  }
	/**
	 * 发送单个html格式邮件
	 */
	public abstract void sendEmail(String content,String address);
	/**
	 * 批量发送html格式邮件
	 */
	public abstract void sendBatchEmail(String content,List<String> address);
}

 

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.         messageHelper.addInline("a"new File("E:/logo_a.jpg")); //附件内容          
  40.         messageHelper.addInline("b"new File("E:/logo_b.png"));          
  41.         File file=new File("E:/测试中文文件.rar");           
  42.         // 这里的方法调用和插入图片是不同的,使用MimeUtility.encodeWord()来解决附件名称的中文问题         
  43.         messageHelper.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.   }    
  79. }  
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.ui.freemarker.*;   
import org.springframework.web.servlet.view.freemarker.*;   
import freemarker.template.*;   

public class EmailService extends EmailAbstract {

	/**
	 * 发送带模板的单个html格式邮件
	 */
	public void sendMessage(String content,String address) throws MessagingException {
		  MimeMessage msg = sender.createMimeMessage();
		  //设置utf-8或GBK编码,否则邮件会有乱码,true表示为multipart邮件 
		  MimeMessageHelper helper = new MimeMessageHelper(msg, true, "utf-8"); 
		  helper.setTo(addr

  


  
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics