openjweb 邮件管理功能介绍

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("邮件发送完毕!");

}

}

阅读更多
换一批

没有更多推荐了,返回首页