1. 数据库字段

WfTasks表中增加IsEMailUnSent字段,标识邮件是否发送。

SysUser表中增加Email字段,用于读取任务办理人的邮件地址。

WfProcess表中增加PageUrl,用于确定邮件模板中的链接地址。

  1. HangFire作业

添加HangFire定时任务作业,增加每分钟定时任务作业,从Dashboard可以看到作业的执行情况。

  1. 邮件模板

包括邮件标题,邮件正文信息,参见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;

  1. 异步邮件发送代码

邮件发送是作为系统后台作业,而且是异步方式,这样可以满足批量数据的循环处理模式,而且为系统以后的性能扩展留有余地。具体代码示例如下:

///<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);

                }

            }

}