<< 211·AutoCAD图导出为图片方法汇总_我只是一小小鸟_新浪博客 | 首页 | NFS攻略 - Windows下 NFS 客户端的安装及设置 - Bash @ Linux - ITeye技术网站 >>

Spring 高效批量邮件发送 - shupili141005 - ITeye技术网站

Gmail 邮件发送配置

 

email.properties 文件:

# Gmail Configuration
email.host=smtp.gmail.com 
email.port=587 
email.username=******
email.password=******
email.defaultEncoding=UTF-8

 

applicationContext.xml 文件:

    <!-- Email Service -->
    <bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
        <property name="host" value="${email.host}"/>
        <property name="port" value="${email.port}"/>
        <property name="username" value="${email.username}"/>
        <property name="password" value="${email.password}"/>
        <property name="javaMailProperties">
            <props>
                <prop key="mail.transport.protocol">smtp</prop>
                <prop key="mail.smtp.starttls.enable">true</prop>
        <prop key="mail.smtp.host">smtp.gmail.com</prop>
        <prop key="mail.smtp.auth">true</prop>
        <prop key="mail.smtp.port">465 </prop>
            </props>
            <!--
            <value>
                mail.smtp.auth=true
            </value>
             -->
        </property>
        <property name="defaultEncoding" value="${email.defaultEncoding}"></property>
    </bean>
    <bean id="emailSender" class="com.tucue.common.util.SimpleEmailSender">
        <property name="mailSender" ref="mailSender"></property>
    </bean>
    <!-- end of Email Service -->

 

FAQ :

com .sun .mail .smtp .SMTPSendFailedException: 530   5 .7 0  Must  issue  a  STARTTLS  command  first .

 

A :

<prop key="mail.smtp.starttls.enable">true</prop>

 

Send Batch Mail

http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/mail/MailSender .html

 

Method Summary
 void send (SimpleMailMessage  simpleMessage) 
          Send the given simple mail message.
 void send (SimpleMailMessage [] simpleMessages) 
          Send the given array of simple mail messages in batch.

 

http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/mail/javamail/JavaMailSender .html

 

Method Summary
 MimeMessage createMimeMessage () 
          Create a new JavaMail MimeMessage for the underlying JavaMail Session of this sender.
 MimeMessage createMimeMessage (InputStream  contentStream) 
          Create a new JavaMail MimeMessage for the underlying JavaMail Session of this sender, using the given input stream as the message source.
 void send (MimeMessage  mimeMessage) 
          Send the given JavaMail MIME message .
 void send (MimeMessage [] mimeMessages) 
          Send the given array of JavaMail MIME messages in batch .
 void send (MimeMessagePreparator  mimeMessagePreparator) 
          Send the JavaMail MIME message prepared by the given MimeMessagePreparator.
 void send (MimeMessagePreparator [] mimeMessagePreparators) 
          Send the JavaMail MIME messages prepared by the given MimeMessagePreparators.

 

方案一:首先获取要发送邮件的所有地址,然后迭代的封装单个 MimeMessage 之后就将其发送出去(即发送一封邮件)。

 

SimpleEmailSender.java 文件

Java代码  收藏代码
  1.     /** 
  2.      * 功能: 传入邮件接收者地址、标题和内容,然后发送单个邮件服务 
  3.      * @param {@link String} emailAddress 
  4.      * @param {@link String} subject 
  5.      * @param {@link String} content 
  6.      * @throws MessagingException 
  7.      */  
  8.     public static void sendSimpleEmail(<span style="color: #ff0000;">String receiver</span>  
  9. , String subject, String content) throws MessagingException {  
  10.         JavaMailSender sender = (JavaMailSender) mailSender;  
  11.           
  12.         <span style="color: #ff0000;">MimeMessage mimeMessage</span>  
  13.  = sender.createMimeMessage();  
  14.         MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage, true"UTF-8");  
  15.         messageHelper.setFrom("***@<span style="color: #ff0000;">gmail</span>  
  16. .com");  
  17.         messageHelper.setTo(receiver);  
  18.         messageHelper.setSubject(subject);  
  19.         messageHelper.setText(content, true);  
  20.           
  21.         sender.send(<span style="color: #ff0000;">mimeMessage</span>  
  22. );  
  23.     }  

 

 UserInfoAction.java 文件

Java代码  收藏代码
  1.     // 用户 -> 批量邮件发送  
  2.     public String sendBatchEmail() {  
  3.         if(!emailReceiverList.equals("")) { // 发送用户邮件  
  4. //          String[] receiverList = emailReceiverList.split(",");  
  5.             String[] receiverList = new String[20];  
  6.             for(int i = 0; i < 20; ++i) {  
  7.                 receiverList[i] = "[email protected]";  
  8.             }  
  9.             long start = System.currentTimeMillis();  
  10.             for(<span style="color: #ff0000;">String receiver: receiverList</span>  
  11. ) {  
  12.                 try {  
  13.                     <span style="color: #ff0000;">SimpleEmailSender.sendSimpleEmail(receiver, emailSubject, emailContent);</span>  
  14.   
  15.                 } catch (MessagingException e) {  
  16.                     e.printStackTrace();  
  17.                 }  
  18.             }  
  19.             long end = System.currentTimeMillis();  
  20.             System.out.println(end - start);  
  21.         } else {// 发送用户组邮件  
  22.             List<String> receiverList = userInfoService.getUserEmailByGroupId(groupID);  
  23.             for(String receiver: receiverList) {  
  24.                 try {  
  25.                     SimpleEmailSender.sendSimpleEmail(receiver, emailSubject, emailContent);  
  26.                 } catch (MessagingException e) {  
  27.                     e.printStackTrace();  
  28.                 }  
  29.             }  
  30.         }  
  31.   
  32.         return SUCCESS;  
  33.     }  

 方案二:首先获取要发送邮件的所有地址,然后一起封装成 MimeMessage[] 之后就将其发送出去(即批量发送所有要发送的邮件)。

 

SimpleEmailSender.java 文件

Java代码  收藏代码
  1. /** 
  2.      * 功能: 传入邮件接收者地址列表、标题和内容,然后发送批量邮件服务 
  3.      * @param {@link List<String>} receiverList 
  4.      * @param {@link String} subject 
  5.      * @param {@link String} content 
  6.      * @throws MessagingException 
  7.      */  
  8.     public static void sendBulkEmail(<span style="color: #ff0000;">List<String> receiverList</span>  
  9. , String subject, String content) throws MessagingException {  
  10.         JavaMailSender sender = (JavaMailSender) mailSender;  
  11.         int len = receiverList.size();  
  12.         <span style="color: #ff0000;">MimeMessage[] mimeMessageList</span>  
  13.  = new MimeMessage[len];    // 注意:是<span style="color: #ff0000;">数组类型</span>  
  14.   
  15.         MimeMessageHelper messageHelper = null;  
  16.           
  17.         for(int i = 0; i < len; ++i) {  
  18.             <span style="color: #ff0000;">mimeMessageList[i]</span>  
  19.  = sender.createMimeMessage();  
  20.             messageHelper = new MimeMessageHelper(mimeMessageList[i], true"UTF-8");  
  21.             messageHelper.setFrom("[email protected]");  
  22.             messageHelper.setTo(receiverList.get(i));  
  23.             messageHelper.setSubject(subject);  
  24.             messageHelper.setText(content, true);  
  25.         }  
  26.           
  27.         sender.send(<span style="color: #ff0000;">mimeMessageList</span>  
  28. );  
  29.     }  
 

UserInfoAction.java 文件

Java代码  收藏代码
  1. // 用户 -> 批量邮件发送  
  2. public String sendBatchEmail() {  
  3.     if(!emailReceiverList.equals("")) { // 发送用户邮件  
  4. /           String[] receiverList = emailReceiverList.split(",");  
  5.         <span style="color: #ff0000;">List<String> receiverList</span>  
  6. new ArrayList<String>(20);  
  7.         for(int i = 0; i < 20; ++i) {  
  8.             receiverList.add("[email protected]");  
  9.         }  
  10.         long start = System.currentTimeMillis();  
  11.         try {  
  12. /               SimpleEmailSender.sendBulkEmail(Arrays.asList(receiverList), emailSubject, emailContent);  
  13.             SimpleEmailSender.<span style="color: #ff0000;">sendBulkEmail(receiverList</span>  
  14.  emailSubject, emailContent);  
  15.         } catch (MessagingException e) {  
  16.             e.printStackTrace();  
  17.         }  
  18.         long end = System.currentTimeMillis();  
  19.         System.out.println(end - start);  
  20.     } else {// 发送用户组邮件  
  21.         List<String> receiverList = userInfoService.getUserEmailByGroupId(groupID);  
  22.         try {  
  23.             SimpleEmailSender.sendBulkEmail(receiverList, emailSubject, emailContent);  
  24.         } catch (MessagingException e) {  
  25.             e.printStackTrace();  
  26.         }  
  27.     }  
  28.   
  29.     return SUCCESS;  
  30. }  

 

根据上述两种方案,通过发送 20 封邮件进行测试后发,发现第二种方案(用时 36984 ms)比第一种(81266 ms)的 执行效率 2.1 倍多 

 

总结

通过这次实验,感觉自己收获了不少。第一,评价哪种方案优劣,用你需要的数据测试就能体现执行效率,但健壮性和可扩展性就不能一概而论了;第二,要想编写更加高效的代码,就必须对你特别重要(特别是常用基础类)的 API 有足够的熟知。就以这个案例为例,刚开始我没有仔细看过 JavaMailSender 的 API ,导致就不知道用 send (MimeMessage [] mimeMessages) 这个函数,所以也不知道存在第二种方案。后来突然发现有这个函数,就像能不能对先前的发送单个邮件服务加以改进,第二种方案也就是这样萌生的。

 

阅读全文……

标签 : ,



发表评论 发送引用通报