具体实现
- 数据库字段
WfTasks表中增加IsEMailUnSent字段,标识邮件是否发送。
SysUser表中增加Email字段,用于读取任务办理人的邮件地址。
WfProcess表中增加PageUrl,用于确定邮件模板中的链接地址。
- HangFire作业
添加HangFire定时任务作业,增加每分钟定时任务作业,从Dashboard可以看到作业的执行情况。
- 邮件模板
包括邮件标题,邮件正文信息,参见JobAdminDefine.cs文件中的示例,考虑到企业用户的多样化需求,开发人员可以在此处进行自定义扩展。
privatestaticreadonlystring Title = "新待办事项提醒邮件!";
privatestaticreadonlystring Content = @"< h1 >新待办任务提醒</h1>" +
"<p>您有一条新的待办任务: " +
"<a href='{0}'>业务单据名称和单据序号</a>" +
"请您及时登录业务系统处理!谢谢!</p>";
privatestaticreadonlystring SendEMailAccount = "test@abc.com";
privatestaticreadonlystring SendEMailPassword = "123456";
privatestaticreadonlystring SendEMailHost = "smtp.abc.com";
privatestaticreadonlyint SendEMailHostPort = 25;
- 异步邮件发送代码
邮件发送是作为系统后台作业,而且是异步方式,这样可以满足批量数据的循环处理模式,而且为系统以后的性能扩展留有余地。具体代码示例如下:
///<summary>
/// 待办任务发送邮件通知
///</summary>
publicvoid SendTaskEMail(IList<ProcessEntity> processList,
IList<UserEMailEntity> userList)
{
var wfService = newWorkflowService();
var taskList = wfService.GetTaskListEMailUnSent();
if (taskList != null&& taskList.Count() > 0)
{
foreach (var task in taskList)
{
Func<TaskViewEntity, IList<ProcessEntity>, IList<UserEMailEntity>, Task> func = SendEMailAsync;
BackgroundTaskRunner.FireAndForgetTaskAsync(func, task, processList, userList);
}
}
}