Spring的JavaMail实现异步发送邮件

具体背景就不说了,可以网上搜索相关知识,或者直接看Sping MailSender的官坊网页。这里就直接实战了(Java实现异步发送电子邮件,包含中文无乱码)。

Maven:

    <dependency>
      <groupId>com.sun.mail</groupId>
      <artifactId>javax.mail</artifactId>
      <version>1.5.0</version>
    </dependency>

ApplicationContext.xml:

    <!-- SET default mail properties -->
    <bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
        <property name="host" value="smtp.sina.com"/>
        <property name="protocol" value="smtp" /> 
        <!-- 465 for Gamil -->
        <property name="port" value="25"/>
        <property name="username" value="xxx@sina.com"/>
        <property name="password" value="xxx"/>
        <property name="javaMailProperties">
            <props>
                <prop key="mail.transport.protocol">smtp</prop>
                <prop key="mail.smtp.auth">true</prop>
                <!-- true for Gamil -->
                <prop key="mail.smtp.starttls.enable">false</prop>
                <prop key="mail.debug">true</prop>
            </props>
        </property>
    </bean>
     
    <!--Asyn send Eamil--> 
    <bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">  
       <property name="corePoolSize" value="10"/>  
       <property name="maxPoolSize" value="30"/>  
    </bean>
 
    <!-- You can have some pre-configured messagess also which are ready to send -->
    <bean id="preConfiguredMessage" class="org.springframework.mail.SimpleMailMessage">
        <property name="to" value="xxx@gmail.com"></property>
        <property name="from" value="xxx@sina.com"></property>
        <property name="subject" value="Test email from sina."/>
    </bean>

Email实体类:

package com.xxx;

import java.io.Serializable;

/**
 * @author 
 *
 */
public class ApplicationEmail implements Serializable {  
          
    public String getAddressee() {
        return addressee;
    }
    public void setAddressee(String addressee) {
        this.addressee = addressee;
    }
    public String getCc() {
        return cc;
    }
    public void setCc(String cc) {
        this.cc = cc;
    }
    public String getSubject() {
        return subject;
    }
    public void setSubject(String subject) {
        this.subject = subject;
    }
    public String getContent() {
        return content;
    }
    public void setContent(String content) {
        this.content = content;
    }
    
    /**收件人**/  
    private String addressee;    
     /**抄送给**/   
    private String cc;    
     /**邮件主题**/  
    private String subject;   
      /**邮件内容**/  
    private String content;    
     /**附件**/   
    //private MultipartFile[] attachment = new MultipartFile[0];    
      
      
}  

异步邮件发送封装类:

package com.xxx;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Properties;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeUtility;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.core.task.TaskExecutor;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;

import com.xxx.Mailer;

/**
 * @author 
 *
 */
@Service
public class ApplicationMailer implements Mailer
{
    @Autowired
    private JavaMailSender mailSender;
     
    
    @Autowired
    private TaskExecutor taskExecutor;
    
    
    @Autowired
    private SimpleMailMessage preConfiguredMessage;
 
    
    /**
     * 同步发送邮件
     * 
     * @param email
     * @throws MessagingException
     * @throws IOException
     */
    public void sendMailBySynchronizationMode(ApplicationEmail email) throws MessagingException, IOException { 
         Session session=Session.getDefaultInstance(new Properties());
         MimeMessage mime= new MimeMessage(session);
         MimeMessageHelper helper = new MimeMessageHelper(mime, true, "utf-8");    
         helper.setFrom("xxx@sina.com");//发件人    
         helper.setTo(InternetAddress.parse(email.getAddressee()));//收件人    
         //helper.setBcc("administrator@chinaptp.com");//暗送   
         helper.setReplyTo("xxx@sina.com");//回复到   
         helper.setSubject(email.getSubject());//邮件主题    
         helper.setText(email.getContent(), true);//true表示设定html格式  
         
         mailSender.send(mime);
    }
    
    
    /**
     * 异步发送邮件
     * 
     * @param email
     */
    public void sendMailByAsynchronousMode(final ApplicationEmail email){  taskExecutor.execute(new Runnable(){    
         public void run(){      
        try {      
              sendMailBySynchronizationMode(email);   
             } catch (Exception e) {    
            }    
         }    
      });   
    }
}

public interface Mailer {
    public void sendMailByAsynchronousMode(final ApplicationEmail email);
}

调用Service异步发送邮件:

  @Autowired
  private Mailer mailer;

   //这是要异步发送邮件
   ApplicationEmail email = new ApplicationEmail();
   email.setAddressee("xxx@gmail.com");
   email.setSubject("测试邮件有一份");
   email.setContent("这个是内容html内容");
   mailer.sendMailByAsynchronousMode(email);

这里实现异步使用的是Task Execution,也可以用异步注解@Async,或者JMS(需要J2EE环境);如果需要调度可以用Quartz(使用场景如:每天2:00需要批量给会员发邮件)

如果要实现高可靠的高并发的异步邮件发送,可以用JMS或Queue,参考

本文结束。(干货分享:Spring和JavaMail发送邮件的经验.pdf

 

 

 

 

posted on 2013-07-26 17:58  Mainz  阅读(6599)  评论(1编辑  收藏  举报

导航