zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    开发进度01
    eclipse 调用cmd运行DataX
    kettle 新建DB连接双击打不开
    用户体验评价
    找水王课堂练习
    人月神话阅读笔记01
    用户模板和用户场景
    大道至简阅读笔记03
    第九周
    第八周总结
  • 原文地址:https://www.cnblogs.com/Mainz/p/3217594.html
Copyright © 2011-2022 走看看