四、MSMQ在邮件发送程序中的应用
在邮件程序的应用中,实现发送邮件的方法有很多种,很多朋友都比较喜欢邮件发送组件(如:JMail),在.NET Framework里也给我们提供了发送邮件的类StmpClient,位于System.Net下。我想很多朋友都曾用到过此类,如果说是在一个小型的邮件应用里,完全没有使用MSMQ的必要,因为数据量不大,直接处理就OK,这里我以邮件程序来说只是出于对MSMQ应用的介绍。说实在的,我也不知道怎么才能把这个东东给介绍清楚,先看看一张图吧!

现在的需求是这样的,有一个邮件发送客户端(SendMail.aspx,界面效果如上图所示)和一个邮件发送管理的服务端(MailServer.aspx),当在SendMail.aspx里发送邮件的时候,我们不直接将其发到目标地址去,而是将其发送到消息队列,然后由MailServer.aspx来负责从消息队列里读取出邮件信息在将其发送到目标地址。其实SendMail.aspx的职责就是完成把邮件信息发送到消息队列,示意性代码如下:
1protected void btnSendMail_Click(object sender, EventArgs e)
2{
3 //取出数据存入MailInfo对象
4 MailInfo info = new MailInfo();
5 info.Title = tbTitle.Text;
6 info.Content = tbContent.Text;
7 info.StmpServer = tbSmtpServer.Text;
8 info.Sender = tbSender.Text;
9 info.SenderPwd = tbSenderPwd.Text;
10 info.ReceiveAddress = tbReceive.Text;
11
12 if (info != null)
13 {
14 CreateQueue();
15 SendMessage(info);
16 }
17}
CreateQueue和SendMessage这两个方法完成消息队列的创建和发送信息到队列,MailInfo类封装的是邮件的详细信息(既邮件的属性),详细定义如下:
1public class MailInfo 2{ 3 public MailInfo() 4 { 5 6 } 7 8 private string _Title; 9 public string Title 10 { 11 get { return _Title; } 12 set { _Title = value; } 13 } 14 15 private string _Content; 16 17 public string Content 18 { 19 get { return _Content; } 20 set { _Content = value; } 21 } 22 private string _Sender; 23 24 public string Sender 25 { 26 get { return _Sender; } 27 set { _Sender = value; } 28 } 29 private string _SenderPwd; 30 31 public string SenderPwd 32 { 33 get { return _SenderPwd; } 34 set { _SenderPwd = value; } 35 } 36 private string _StmpServer; 37 38 public string StmpServer 39 { 40 get { return _StmpServer; } 41 set { _StmpServer = value; } 42 } 43 private string _ReceiveAddress; 44 45 public string ReceiveAddress 46 { 47 get { return _ReceiveAddress; } 48 set { _ReceiveAddress = value; } 49 } 50} |
转到邮件管理端(MailServer.aspx),他负责从消息队列里读取出邮件信息并把此邮件发送到目标地址去。其实现很简单,说直接点他也就是完成了两项操作(从队列读消息、将消息发送到目的邮箱),从队列读取消息的代码如下:
1/**//// <summary>
2/// 连接消息队列并从队列中接收消息
3/// </summary>
4private MailInfo ReceiveMessage()
5{
6 MailInfo info = null;
7 //连接到本地队列
8 MessageQueue myQueue = new MessageQueue(".\\private$\\myMailQueue");
9 myQueue.Formatter = new XmlMessageFormatter(new Type[] { typeof(MailInfo) });
10 try
11 {
12 if (myQueue.Transactional)
13 {
14 MessageQueueTransaction myTransaction = new MessageQueueTransaction();
15 //启动事务
16 myTransaction.Begin();
17 //从队列中接收消息
18 Message myMessage = myQueue.Receive(myTransaction);
19 info = myMessage.Body as MailInfo; //获取消息的内容
20 myTransaction.Commit();
21 return info;
22 }
23
24 }
25 catch (MessageQueueException e)
26 {
27 this.tdError.InnerText = e.Message;
28 }
29 return info;
30}
该方法(ReceiveMessage)返回的是从队列里读取到的邮件信息,本示例中只是做了读一条信息的实现,如果要把队列里的全部信息读出并发送到目的邮箱,可以参考我前面所介绍的相关知识点来实现。得到了邮件的详细信息,我们就可以使用相应的技术将这信息发送到目标邮箱去,本示例中我采用的是.NET Framework里提供的SmtpClient类来完成的邮件发送,关于SmtpClient类的使用网上有相当丰富的资料介绍,这里我就不做详细的说明,核心代码如下:
1protected void Button2_Click(object sender, EventArgs e)
2{
3 if (info != null)
4 {
5 SmtpClient client = new SmtpClient();
6 client.Host = info.StmpServer;
7 client.UseDefaultCredentials = false;
8 client.Credentials = new NetworkCredential(info.Sender, info.SenderPwd);
9 client.DeliveryMethod = SmtpDeliveryMethod.Network;
10
11 MailMessage message = new MailMessage(info.Sender, info.ReceiveAddress);
12 message.Subject = info.Title;
13 message.Body = info.Content;
14 message.BodyEncoding = Encoding.UTF8;
15 message.IsBodyHtml = true;
16
17 try
18 {
19 //发送邮件到目标地址
20 client.Send(message);
21 this.tdSucces.InnerText = "邮件已成功发送到目标地址:" + info.ReceiveAddress;
22 }
23 catch (Exception ex)
24 {
25 this.tdError.InnerText = "发送失败,失败原因:" + ex.Message;
26 }
27 }
28}
运行后的效果图如下:

本文中的所有示例程序全部通过调试,能力有限,文中所介绍的不是很清楚,详细可直接下载源代码了解。本代码包里也包含有第一篇文章里的全部示例程序代码。
点击连接下载示例程序代码:示例程序代码下载
关注此文的读者还看过: