在企业级应用中,用户经常需要掌握当前业务流转的状态。为满足该业务需求,通常的解决方案是,在业务流程的关键节点处设置系统提醒服务,如:手机短信提醒和邮件提醒等。大型企业一般都会在企业内部部署企业级的邮件服务器,所以邮件提醒服务较手机短信提醒会更加经济和安全。本文将总结,在企业级业务系统中,如何使用.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.MailSystem.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恢复到上面的设置

上面就是我在工作时间总结的和邮件相关的内容,总体感觉简单易用。如有遗漏,欢迎大家一起补充!

posted on 2013-06-12 19:45  Maxwell Zhou  阅读(1187)  评论(0编辑  收藏  举报