在企业级应用中,用户经常需要掌握当前业务流转的状态。为满足该业务需求,通常的解决方案是,在业务流程的关键节点处设置系统提醒服务,如:手机短信提醒和邮件提醒等。大型企业一般都会在企业内部部署企业级的邮件服务器,所以邮件提醒服务较手机短信提醒会更加经济和安全。本文将总结,在企业级业务系统中,如何使用.Net的邮件服务接口,实现邮件提醒功能。
1. 设置配置文件(Web.config/App.config)
.Net提供在系统的配置文件中统一设置交互方法和发送人等信息的接口。配置之后,当使用SmtpClient发送邮件时,系统默认使用配置文件中的设置。下面是样例代码。需要注意的是,在企业内部发送邮件时,有时即使不配置userName和password也可以发送邮件(依赖于企业内部邮件服务器的配置)。但是,当需要往外发送邮件时,必须配置有效的userName和password.
<system.net> <mailSettings> <smtp deliveryMethod="Network" from="you@yourdomain.com"> <network host="Smtp server address" port="25" userName="username" password="password"> </smtp> </mailSettings> </system.net>
2. 发送邮件的步骤
在.Net Framework中有两个和邮件服务相关的命名空间System.Net.Mail和System.Web.Mail, 其中后者已被废弃,所以,确保用的是System.Net.Mail内的类库。发送邮件一般分2步:
a. 创建MailMessage实例
var msg = new MailMessage(); //msg.From 默认使用配置文件中的设置 msg.To.Add(new MailAddress("liming@163.com", "李明")); msg.CC.Add(new MailAddress("zhangsan@163.com", "张三")); msg.Bcc.Add(new MailAddress("lisi@163.com", "李四")); msg.Subject = "subjectt";//邮件标题 msg.SubjectEncoding = Encoding.UTF8;//邮件标题编码 msg.Body = "content";//邮件内容 msg.IsBodyHtml = true;//是否是HTML邮件
b. 创建SmtpClient实例
var client = new SmtpClient(); //默认使用配置文件中的设置 //同步发送 try { client.Send(msg); } catch (SmtpException ex) { //exception handle } //异步发送 object userState = msg; try { //发送完成后的处理逻辑可以在Callback函数中完成 client.SendCompleted += new SendCompletedEventHandler(SendCompletedCallback); client.SendAsync(msg, out userState); } catch (SmtpException ex) { //exception handle }
3. 邮件相关的业务逻辑
在业务系统中,邮件正文的内容往往不是那么容易直接获取的,针对不同的用户和业务流程,邮件的模板和填充模板的内容都会有不同。所以,为了高效稳定的生成邮件正文,往往会使用模板引擎来实现邮件正文的自动生成,如:NVelocity。在此,我们不展开讨论模板引擎的使用。
除邮件正文的生成以外,往往用户还会要求对系统发出去的邮件保存历史记录,尤其是往外发送给客户的关键邮件。在实践中,我的做法是将MailMessage的各字段调用ToString方法后保存在数据库MailLog的表中。值得一提的是,MailMessage.To/CC/Bcc方法,ToString后的格式是一致的,并且可逆。看如下代码:
var msg = new MailMessage(); msg.To.Add(new MailAddress("liming@163.com", "李明")); msg.To.Add(new MailAddress("zhangsan@163.com", "张三")); var tolist = msg.To.ToString(); //tolist is "李明"<liming@163.com>;"张三"<zhangsan@163.com> //当发送失败,需要重新发送的时候,基于MailLog可以很方便的实现 msg.To.Clear(); msg.To.Add(tolist); //msg.To恢复到上面的设置
上面就是我在工作时间总结的和邮件相关的内容,总体感觉简单易用。如有遗漏,欢迎大家一起补充!