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