openjweb 邮件管理功能介绍

迷途d书童 发布于 2012/03/09 12:19
阅读 118
收藏 0

Openjweb的邮件管理功能介绍:

 

(1)    定义系统发件箱,在后台定时发邮件时会顺序选择系统发件箱进行邮件发送,这样在群发广告邮件时可降低发件箱地址被看作是垃圾邮箱的几率。

(2)    用户可定义自己的邮件群组,并为自己的用户群组增加成员,每个用户只能看到自己创建的群组。

(3)    用户发送邮件时即可以用自己的邮件作为邮件发送地址,也可将邮件加到系统邮件列表中由系统定时发送。

(4)    由于系统配置了邮件定时发送作业,所以在业务系统中可根据业务需要增加邮件正文、邮件标题、收件人信息等内容插入到邮件发送队列中,这样支持了当某种业务事件发生时,系统会以邮件的方式通知收件人。

(5)    如果邮件发送失败,邮件发送队列的邮件状态会变为失败状态,可重新设置状态为“队列中”,系统可继续发送这个邮件。

 

下面是openjweb平台的邮件管理的界面:

 

系统邮箱设置:

 

用户个人邮箱设置(可设置多个):

 

 

个人邮件群组设置:

 

为一个群组选择组成员(用户在上面的列表中只能看到自己创建的群组):

 

 

发邮件功能:(用户即可以直接发送,也可以将邮件加到系统的邮件发送队列中,如果一次群发很多收件人的话,适合由系统定时发送):

 

 

在上图中,如果要发送大量收件人,建议是否选择系统发件箱为

 

邮件发送队列:

 

如果上面的发邮件功能用系统发件箱发送,那么邮件会被添加到发送队列中,见下图:

 

 

系统后台会定时发送状态为“队列中”的邮件,如果发送成功,状态变为“已发送”,发送失败,则状态变为“发送失败”,点编辑,可将“发送失败”再改回队列中”,这样可以尝试再次发送,下面是编辑页面:

 

开发说明:

(1)       定时器配置(为了调试方便,设置了每分钟运行一次邮件发送,每次取最早的100条进行发送),见下面的定时器配置(core-service-demo.xml)

 

 

<bean id="defaultTimerBean" class="org.openjweb.core.schedule.JobSchedule"/>

<bean id="mailTimerMethod" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">

        <property name="targetObject" ref="defaultTimerBean" />

        <property name="targetMethod" value="doSendMail" />

        <property name="concurrent" value="false" /> <!--将并发设置为false-->

    </bean>

   

    <bean id="mailTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">

        <property name="jobDetail" ref="mailTimerMethod" />

        <!-- 1分钟发送一次邮件 -->

        <property name="cronExpression" value="0 0/1 * * * ?" />

    </bean>

   

    <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">

        <property name="triggers">

            <list>

                <!--作业调度器,list下可加入其他的调度器-->

                <ref bean="defaultTrigger"/>

                <ref bean="luceneTrigger"/> 

                <ref bean="mailTrigger"/> 

            </list>

        </property>

    </bean>

 

下面是作业调度类的代码(供参考):

 

package org.openjweb.core.schedule;

 

 

import java.util.List;

 

import org.apache.log4j.Logger;

import org.apache.lucene.demo.IndexHTML;

 

import org.openjweb.core.entity.CommSystemMail;

import org.openjweb.core.mail.Mail;

import org.openjweb.core.service.IDBSupportService;

import org.openjweb.core.service.ServiceLocator;

import org.openjweb.core.util.StringUtil;

import org.quartz.JobExecutionContext;

import org.quartz.JobExecutionException;

import org.springframework.scheduling.quartz.QuartzJobBean;

 

import com.openjweb.mail.entity.MailSendQueue;

 

public class JobSchedule extends QuartzJobBean

{

    static Logger logger = Logger.getLogger(JobSchedule.class);

    static long counter = 0;  //计数器

    static int mailScheduleFlag =0;//doSendMail修改,其他方法不要修改此参数

    private static List sysMailList = null;//系统邮箱列表,设置为静态变量以避免每次都要去系统邮件列表

   

     

   

    /**

     * 定时从邮件队列中选择未发送邮件发送邮件

     * @throws Exception

     *

     */

    public synchronized void doSendMail() 

    {

       //定时器同时调用两次的问题需要查找原因

       if(mailScheduleFlag > 0)

       {

           logger.info("邮件进程占用,返回...");

           return ;//保证同一时刻只有一个定时器运行,通过这种方式保证每次定时时间到时,只执行一个线程

       }

       mailScheduleFlag = 1;//锁定

       logger.info("开始发送邮件....");

      

       IDBSupportService service = (IDBSupportService)ServiceLocator.getBean("IDBSupportService3");

       if(sysMailList==null)

       {

           try

           {

              sysMailList = service.findAll("org.openjweb.core.entity.CommSystemMail");//系统邮件列表比较少,所以全部取出

      

           }

           catch(Exception ex)

           {

              logger.error(ex.toString());

              mailScheduleFlag = 0;

              return ;//如果出现异常,则解除锁定退出

             

           }

       }

        

       if(sysMailList==null||sysMailList.size()==0)

       {

           logger.info("没有配置系统邮件列表");

            mailScheduleFlag = 0;//锁定解除

            return  ;//如果没有配置系统发送邮箱列表则返回

       }

      

       int size = sysMailList.size();//发邮件时,顺序用不同的邮件地址发送

       //int   mod=10   %   3;  

        

       List mailList = null;

       try

       {

           mailList = service.findPage("com.openjweb.mail.entity.MailSendQueue", " where sendStatus in ('00') order by createDt ", 1, 100);

           //对于发送状态失败'03'的可以改为队列中然后重发

       }

       catch(Exception ex)

       {

           logger.error(ex.toString());

           mailScheduleFlag = 0;

           return ;//如果出现异常,则解除锁定退出

       }

        if(mailList!=null&&mailList.size()>0)

        {

            int j = -1; //轮流使用系统发件箱

            for(int i=0;i<mailList.size();i++)

            {

               j++;

               if(j>=size)

               {

                   j=0;

               }

 

               MailSendQueue  queueEnt = (MailSendQueue)mailList.get(i);

               CommSystemMail senderEnt = ( CommSystemMail)sysMailList.get(j);

               //发邮件

               //发邮件完成后变更状态,最后发送时间,使用的发送邮箱等

               Mail mail = null;

               try

               {

                   mail = new Mail(senderEnt.getSmtpAddr(),senderEnt.getMailAddr(),queueEnt.getSenderName(),

                      senderEnt.getMailLoginAcct(),senderEnt.getMailLoginPwd(),queueEnt.getMailReceiver(),

                      queueEnt.getMailTitle(),queueEnt.getMailContent());

                   //mail.addAttachfile("");//测试发送附件

                   mail.send();

                   //发送成功后,开始写

                   queueEnt.setSendStatus("01");//已发送

                   queueEnt.setSysMailRowId(queueEnt.getRowId());

                   queueEnt.setLastSendDt(StringUtil.getCurrentDateTime());

                   service.saveOrUpdate(queueEnt);

                  

               } 

               catch(Exception ex)

               {

                   logger.error(ex.toString());

                   queueEnt.setSendStatus("03");//已发送

                   queueEnt.setSysMailRowId(queueEnt.getRowId());

                   queueEnt.setLastSendDt(StringUtil.getCurrentDateTime());

                   try

                   {

                   service.saveOrUpdate(queueEnt);

                   }

                   catch(Exception e)

                   {

                   logger.error("更改邮件队列状态失败!");

                   }

                   mailScheduleFlag = 0;

                  return ;//如果出现异常,则解除锁定退出

               }

               

               

            }

        }

        else

        {

            logger.info("没有待发送邮件!");

        }

         mailScheduleFlag = 0;//锁定解除

        logger.info("邮件发送完毕!");

    }

}

 

 


原文链接:http://blog.csdn.net/baozhengw/article/details/4252505
加载中
返回顶部
顶部