`
mmdev
  • 浏览: 12890474 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

ASP.NET自动发送邮件功能的实现

 
阅读更多

实现发送邮件功能

首先说一下在.Net下如何发送邮件。.Net已经为我们准备好了与发送邮件相关的类,只要直接调用即可,非常方便。下面是我自己写的一个邮件通知类:

///<summary>

///邮件通知服务类。

///</summary>

publicclassEmailNotificationService{

///<summary>

///构造一个邮件通知服务类的实例。

///</summary>

///<param name="smtpService">SMTP服务器的IP地址</param>

///<param name="enableSSL">是否使用SSL连接SMTP服务器器</param>

///<param name="port">SMTP服务器端口</param>

///<param name="loginName">用于登录SMTP服务器的用户名</param>

///<param name="password">登录密码</param>

publicEmailNotificationService(

stringsmtpService,

boolenableSSL,

intport,

stringloginName,

stringpassword) {

this.m_smtpService = smtpService;

this.m_loginName = loginName;

this.m_password = password;

this.m_enableSSL = enableSSL;

this.m_port = port;

}

privatereadonlystringm_smtpService;

privatereadonlystringm_loginName;

privatereadonlystringm_password;

privatereadonlyboolm_enableSSL;

privatereadonlyintm_port;

///<summary>

///发送邮件通知到指定的EMAIL地址。

///</summary>

///<param name="senderName">显示在发件人一栏上的名称</param>

///<param name="address">目的EMAIL地址</param>

///<param name="title">邮件标题</param>

///<param name="content">邮件内容</param>

publicvoidSendTo(stringsenderName,stringaddress,stringtitle,stringcontent) {

MailMessagemail =newMailMessage();

mail.To.Add(address);

mail.From =newMailAddress(this.m_loginName, senderName,Encoding.UTF8);

mail.Subject = title;

mail.Body = content;

mail.BodyEncoding =Encoding.UTF8;

mail.IsBodyHtml =false;

mail.Priority =MailPriority.Normal;

SmtpClientsmtp =newSmtpClient();

smtp.Credentials =newNetworkCredential(this.m_loginName,this.m_password);

smtp.Host =this.m_smtpService;

smtp.EnableSsl =this.m_enableSSL;

smtp.Port =this.m_port;

smtp.Send(mail);

}

}

在使用时,首先构造一个EmailNotificationService类,再调用SendTo方法即可。例如:

EmailNotificationService mailNotificationService = new EmailNotificationService("smtp.gmail.com", true, 587, "LoginName@gmail.com", "LoginPassword");

mailNotificationService.SendTo("SenderName", "TargetAddress@qq.com", "Title", "Content");

发送邮件实现方案

上面创建好了一个负责发送邮件的类,接下来的问题是应该在什么时候调用这个类。发送电子邮件需要进行网络通信,耗时比较多,而且SmtpClientSend方法是会阻塞调用线程的,一旦调用了该方法,就要等到邮件发送完毕或出错才能结束方法调用,所以不能将对EmailNotificationService的调用放在ASP.NET页面的代码中。如果这么做,客户端就要等待很长时间才能获得响应,用户体验是比较差的。

SmtpClient还有一个SendAsync方法,该方法与Send方法的区别是,SendAsync是异步的,调用该方法之后会产生一个新的线程来负责发送邮件,之后调用线程立即返回,不会再等待邮件发送结束。那么我们是不是可以用SendAsync代替Send,并在页面代码中调用呢?答案是否定的,虽然客户端可以很快获得相应,但邮件根本没有发送出去。这是由ASP.NET页面生命周期的特性决定的,客户端向服务器的每一次请求,页面都会经历一个由产生到销毁的过程,当页面销毁的时候,负责发送邮件的线程还没有完成发送邮件的工作就被强制结束了。

由于ASP.NET页面生命周期的特性,我们不能将调用代码放在页面的代码中。我们需要一个与页面无关的线程,一个在网站运行时始终存在的线程。我的方案是使用一个全局对象来管理一个发送邮件线程,同时维护一个待发送邮件链表。当全局对象创建的时候,链表中没有任何内容,发送邮件线程处于挂起状态。当某个页面中的处理需要发送电子邮件时,就将与发送邮件相关的信息添加到待发送邮件链表中。此时链表不为空,发送邮件线程开始工作,逐个取出链表中的邮件信息并发送,一直到链表为空,再次进入挂起状态。如此循环反复。

实现发送邮件功能

基本的构思已经确定好了,接下来就是写代码实现了。首先定义一个类来封装待发送邮件的相关信息,本文开头已经说过要以一个网上投稿系统作为例子,所以这里所用的信息与该应用有关。

///<summary>

///封装发送邮件时所需信息的类。

///</summary>

publicclassMailNotifyInfo{

///<summary>

///获取或设置稿件的标题。

///</summary>

publicstringTitle {

get;

set;

}

///<summary>

///获取或设置稿件的作者名称。

///</summary>

publicstringAuthor {

get;

set;

}

///<summary>

///获取或设置作者的电子邮件地址。

///</summary>

publicstringEmailAddress {

get;

set;

}

///<summary>

///获取或设置稿件的状态。

///</summary>

publicArticleStatusArticleStatus {

get;

set;

}

}

然后是全局对象类的定义,我使用了单件模式来实现其全局性。

///<summary>

///处理邮件发送功能的类。

///</summary>

publicclassNotificationHandler{

///<summary>

///该类的静态实例。

///</summary>

privatestaticreadonlyNotificationHandlerg_instance =newNotificationHandler();

///<summary>

///获取该类的唯一实例。

///</summary>

publicstaticNotificationHandlerInstance {

get{

returng_instance;

}

}

///<summary>

///默认构造方法。

///</summary>

privateNotificationHandler() {

this.m_lockObject =newobject();

this.m_mailNotifyInfos =newLinkedList<MailNotifyInfo>();

this.m_threadEvent =newManualResetEvent(false);

this.m_workThread =newThread(this.ThreadStart);

this.m_workThread.Start();

}

privatereadonlyLinkedList<MailNotifyInfo> m_mailNotifyInfos;

privatereadonlyThreadm_workThread;

privatereadonlyManualResetEventm_threadEvent;

privatereadonlyObjectm_lockObject;

///<summary>

///添加待发送邮件的相关信息。

///</summary>

publicvoidAppendNotification(MailNotifyInfomailNotifyInfo) {

lock(this.m_lockObject) {

this.m_mailNotifyInfos.AddLast(mailNotifyInfo);

if(this.m_mailNotifyInfos.Count != 0) {

this.m_threadEvent.Set();

}

}

}

///<summary>

///发送邮件线程的执行方法。

///</summary>

privatevoidThreadStart() {

while(true) {

this.m_threadEvent.WaitOne();

MailNotifyInfomailNotifyInfo =this.m_mailNotifyInfos.First.Value;

EmailNotificationServicemailNotificationService =newEmailNotificationService("smtp.gmail.com",true, 587,"LoginName@gmail.com","LoginPassword");

mailNotificationService.SendTo("稿件中心",

mailNotifyInfo.EmailAddress,

"稿件状态变更通知",

String.Format("{0}你的稿件{1}状态已变更为{2}", mailNotifyInfo.Author, mailNotifyInfo.Title, mailNotifyInfo.ArticleStatus));

lock(this.m_lockObject) {

this.m_mailNotifyInfos.Remove(mailNotifyInfo);

if(this.m_mailNotifyInfos.Count == 0) {

this.m_threadEvent.Reset();

}

}

}

}

该类比较简单,首先在构造函数中初始化成员变量,然后启动发送邮件线程,此时该线程是挂起的。

当外部调用AppendNotification方法时,会在链表中添加一个MailNotifyInfo对象,然后唤醒发送邮件线程。由于在生产环境下可能会出现同时调用AppendNotification方法的情形,所以这里要进行同步。

发送邮件线程唤醒后进入一个死循环,等待事件对象触发。当事件对象出发之后就开始发送邮件了。邮件发送完毕后从链表中删除已发送的邮件,然后检查链表是否为空,如果是则重置事件对象,重新进入挂起状态。同样地,在对链表进行操作时也要进行同步。

至此,发送邮件的功能实现完毕。需要发送邮件的时候只要像这样调用即可:

MailNotifyInfo mailNotifyInfo = new MailNotifyInfo();

.....

NotificationHandler.Instance.AppendNotification(mailNotifyInfo);

这只是一个很粗陋的框架,而且还不完善。例如,这里假设网站是不间断运行的系统,没有考虑当网站关闭时发送邮件线程的处理。大家可以在这个基础上添砖加瓦,使其更加完善。另外,自动发送邮件也是常见的功能,例如定时检查某个条件,如果成立则发送邮件。要实现自动发送邮件的话,只要对本文的方案稍加修改即可:在NotificationHandler中添加一个Timer,定时执行某个方法,在这个方法中进行条件检查并触发事件即可。

分享到:
评论

相关推荐

    Asp.net自动发送邮件

    Asp.net自动发送邮件 System.Web.Mail和System.Net.Mail下的发送邮件

    asp.net自动发送邮件

    asp.net自动发送邮件,使用.NET中封装好的类来实现,希望对大家有所启发!

    Asp.net实现自动发送邮件的方法

    里面介绍了Asp.net实现自动发送邮件的方法,做项目时可能用到。

    asp[1].net邮件自动发送

    asp[1].net邮件自动发送,asp[1].net邮件自动发送

    邮件发送示例ASP.net源码

    51aspx邮件发送示例ASP.net源码 可以发送邮件,选择是否html格式等

    C# asp.net 开发的发送邮箱代码

    C# asp.net 开发的发送邮箱代码 asp.net web自动发送邮件

    asp.net(C#)定时发送邮件

    asp.net(C#)定时发送邮件 实时发送邮件。

    asp.net 注册后自动发送邮件,通过链接进行验证

    用户注册后,通过自动发送邮件到注册的邮箱中,通过邮箱中的链接进行验证,确定用户注册成功!用户可以成功登录。

    asp.net+注册后自动发送邮件,通过链接进行验证

    实现用户注册之后,自动给邮箱发送邮件,用户通过邮件的链接进行身份验证

    asp.net 电子邮件

    asp.net 自动发送到指定的邮箱 支持群发 网页邮箱代码

    asp.net邮件自动发送模块

    大家在做注册功能时,需要把发送一个注册激活链接到用户的邮箱中,这样用户要进入自己的邮箱点击链接从而最终激活用户.或者用在其它方面 里面提供详细解决思路!SMTP

    asp.net基于windows服务实现定时发送邮件的方法

    主要介绍了asp.net基于windows服务实现定时发送邮件的方法,结合实例形式较为详细的分析了asp.net调用Windows系统服务的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下

    asp.net专家疑难解答200问

    如何使用ASP.NET中的类库实现邮件的发送 189.如何生成图片的缩略图 190.如何在ASP.NET中动态的创建柱状和饼状统计图 192.如何判断上传图片的高度和宽度 193.如何使用DESCryptoServiceProvider类对...

    asp.net仪器设备管理与实现.zip

    ASP.NET中小企业OA系统的设计与实现.zip: 这个项目是一个ASP.NET编写的中小企业OA系统,用于帮助企业进行办公自动化和流程管理。系统具有员工管理、日程安排、公告通知、审批流程等功能。员工可以在系统中管理个人...

    ASP.NET第一团购网源码(自动部署,有说明)- ASP.NET 团购网源码

    ASP.NET第一团购源码(自动部署,有说明) - ASP.NET 团购源码 数据库:Asp.net/MSSQL 第一团购系统是基于Web应用的B/S架构的团购网站,本程序采用目前软件开发IT业界较为流行的ASP.NET和SQLSERVER2000数据库开发...

    C# ASP.NET 模块 - 电子邮件发送与接收模块

    ☆ 功能如下:☆ 使用JMail组件实现了: “发送电子邮件” “发送带附件的电子邮件” “自动回复邮件” “群发电子邮件” “接收电子邮件” “接收电子邮件的福建并下载” (PS:压缩包内包含 JMail 多版本DLL文件及 ...

    asp.net知识库

    HttpModule 实现 ASP.Net (*.aspx) 中文简繁体的自动转换,不用修改原有的任何代码,直接部署即可! 服务器自定义开发二之客户端脚本回发 Web开发: 使用URL重写WEB主题切换 如何在Asp.Net1.1中实现页面模板(所谓的...

    ASP.NET邮件收发程序的设计与开发.zip

    ASP.NET中小企业OA系统的设计与实现.zip: 这个项目是一个ASP.NET编写的中小企业OA系统,用于帮助企业进行办公自动化和流程管理。系统具有员工管理、日程安排、公告通知、审批流程等功能。员工可以在系统中管理个人...

    ASP.NET在线毕业提交系统的设计与实现.zip

    ASP.NET中小企业OA系统的设计与实现.zip: 这个项目是一个ASP.NET编写的中小企业OA系统,用于帮助企业进行办公自动化和流程管理。系统具有员工管理、日程安排、公告通知、审批流程等功能。员工可以在系统中管理个人...

    ASP.NET在线二手交易系统的设计与实现.zip

    ASP.NET中小企业OA系统的设计与实现.zip: 这个项目是一个ASP.NET编写的中小企业OA系统,用于帮助企业进行办公自动化和流程管理。系统具有员工管理、日程安排、公告通知、审批流程等功能。员工可以在系统中管理个人...

Global site tag (gtag.js) - Google Analytics