知识大全 ASP.NET自动发送邮件功能的实现
Posted 知
篇首语:树木在森林中相依偎而生长, 星辰在银河中因辉映而璀璨。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 ASP.NET自动发送邮件功能的实现相关的知识,希望对你有一定的参考价值。
ASP.NET自动发送邮件功能的实现 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
有时我们需要在网站中加入发送邮件的功能 例如一个网上投稿系统 当稿件被采用的时候发送邮件通知作者 下面就以这个功能为例说明如何实现自动发送邮件
实现发送邮件功能
首先说一下在 Net下如何发送邮件 Net已经为我们准备好了与发送邮件相关的类 只要直接调用即可 非常方便 下面是我自己写的一个邮件通知类
/// <summary>
/// 邮件通知服务类
/// </summary>
public class EmailNotificationService
/// <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>
public EmailNotificationService(
string smtpService
bool enableSSL
int port
string loginName
string password)
this m_smtpService = smtpService;
this m_loginName = loginName;
this m_password = password;
this m_enableSSL = enableSSL;
this m_port = port;
private readonly string m_smtpService;
private readonly string m_loginName;
private readonly string m_password;
private readonly bool m_enableSSL;
private readonly int m_port;
/// <summary>
/// 发送邮件通知到指定的EMAIL地址
/// </summary>
/// <param name= senderName >显示在 发件人 一栏上的名称</param>
/// <param name= address >目的EMAIL地址</param>
/// <param name= title >邮件标题</param>
/// <param name= content >邮件内容</param>
public void SendTo(string senderName string address string title string content)
MailMessage mail = new MailMessage();
mail To Add(address);
mail From = new MailAddress(this m_loginName senderName Encoding UTF );
mail Subject = title;
mail Body = content;
mail BodyEncoding = Encoding UTF ;
mail IsBodyHtml = false;
mail Priority = MailPriority Normal;
SmtpClient smtp = new SmtpClient();
smtp Credentials = new NeorkCredential(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( true LoginPassword );
mailNotificationService SendTo( SenderName Title Content );
发送邮件实现方案
上面创建好了一个负责发送邮件的类 接下来的问题是应该在什么时候调用这个类 发送电子邮件需要进行网络通信 耗时比较多 而且SmtpClient的Send方法是会阻塞调用线程的 一旦调用了该方法 就要等到邮件发送完毕或出错才能结束方法调用 所以不能将对EmailNotificationService的调用放在ASP NET页面的代码中 如果这么做 客户端就要等待很长时间才能获得响应 用户体验是比较差的
SmtpClient还有一个SendAsync方法 该方法与Send方法的区别是 SendAsync是异步的 调用该方法之后会产生一个新的线程来负责发送邮件 之后调用线程立即返回 不会再等待邮件发送结束 那么我们是不是可以用SendAsync代替Send 并在页面代码中调用呢?答案是否定的 虽然客户端可以很快获得相应 但邮件根本没有发送出去 这是由ASP NET页面生命周期的特性决定的 客户端向服务器的每一次请求 页面都会经历一个由产生到销毁的过程 当页面销毁的时候 负责发送邮件的线程还没有完成发送邮件的工作就被强制结束了
由于ASP NET页面生命周期的特性 我们不能将调用代码放在页面的代码中 我们需要一个与页面无关的线程 一个在网站运行时始终存在的线程 我的方案是使用一个全局对象来管理一个发送邮件线程 同时维护一个待发送邮件链表 当全局对象创建的时候 链表中没有任何内容 发送邮件线程处于挂起状态 当某个页面中的处理需要发送电子邮件时 就将与发送邮件相关的信息添加到待发送邮件链表中 此时链表不为空 发送邮件线程开始工作 逐个取出链表中的邮件信息并发送 一直到链表为空 再次进入挂起状态 如此循环反复
实现发送邮件功能
基本的构思已经确定好了 接下来就是写代码实现了 首先定义一个类来封装待发送邮件的相关信息 本文开头已经说过要以一个网上投稿系统作为例子 所以这里所用的信息与该应用有关
/// <summary>
/// 封装发送邮件时所需信息的类
/// </summary>
public class MailNotifyInfo
/// <summary>
/// 获取或设置稿件的标题
/// </summary>
public string Title
get;
set;
/// <summary>
/// 获取或设置稿件的作者名称
/// </summary>
public string Author
get;
set;
/// <summary>
/// 获取或设置作者的电子邮件地址
/// </summary>
public string EmailAddress
get;
set;
/// <summary>
/// 获取或设置稿件的状态
/// </summary>
public ArticleStatus ArticleStatus
get;
set;
然后是全局对象类的定义 我使用了单件模式来实现其全局性
/// <summary>
/// 处理邮件发送功能的类
/// </summary>
public class NotificationHandler
/// <summary>
/// 该类的静态实例
/// </summary>
private static readonly NotificationHandler g_instance = new NotificationHandler();
/// <summary>
/// 获取该类的唯一实例
/// </summary>
public static NotificationHandler Instance
get
return g_instance;
/// <summary>
/// 默认构造方法
/// </summary>
private NotificationHandler()
this m_lockObject = new object();
this m_mailNotifyInfos = new LinkedList<MailNotifyInfo>();
this m_threadEvent = new ManualResetEvent(false);
this m_workThread = new Thread(this ThreadStart);
this m_workThread Start();
private readonly LinkedList<MailNotifyInfo> m_mailNotifyInfos;
private readonly Thread m_workThread;
private readonly ManualResetEvent m_threadEvent;
private readonly Object m_lockObject;
/// <summary>
/// 添加待发送邮件的相关信息
/// </summary>
public void AppendNotification(MailNotifyInfo mailNotifyInfo)
lock (this m_lockObject)
this m_mailNotifyInfos AddLast(mailNotifyInfo);
if (this m_mailNotifyInfos Count != )
this m_threadEvent Set();
/// <summary>
/// 发送邮件线程的执行方法
/// </summary>
private void ThreadStart()
while (true)
this m_threadEvent WaitOne();
MailNotifyInfo mailNotifyInfo = this m_mailNotifyInfos First Value;
EmailNotificationService mailNotificationService = new EmailNotificationService( true LoginPassword );
mailNotificationService SendTo( 稿件中心
mailNotifyInfo EmailAddress
稿件状态变更通知
String Format( 你的稿件 状态已变更为 mailNotifyInfo Author mailNotifyInfo Title mailNotifyInfo ArticleStatus));
lock (this m_lockObject)
this m_mailNotifyInfos Remove(mailNotifyInfo);
if (this m_mailNotifyInfos Count == )
this m_threadEvent Reset();
该类比较简单 首先在构造函数中初始化成员变量 然后启动发送邮件线程 此时该线程是挂起的
当外部调用AppendNotification方法时 会在链表中添加一个MailNotifyInfo对象 然后唤醒发送邮件线程 由于在生产环境下可能会出现同时调用AppendNotification方法的情形 所以这里要进行同步
发送邮件线程唤醒后进入一个死循环 等待事件对象触发 当事件对象出发之后就开始发送邮件了 邮件发送完毕后从链表中删除已发送的邮件 然后检查链表是否为空 如果是则重置事件对象 重新进入挂起状态 同样地 在对链表进行操作时也要进行同步
至此 发送邮件的功能实现完毕 需要发送邮件的时候只要像这样调用即可
MailNotifyInfo mailNotifyInfo = new MailNotifyInfo();
NotificationHandler Instance AppendNotification(mailNotifyInfo);
cha138/Article/program/net/201311/11381相关参考
我们经常看到在一些博客页面里可以发表评论通过电子邮件通知版主(例如咱们的博客园)那么如何用发送电子邮件呢?我们可以借助NET提供的强大的类库达到目的 首先我们要引入SystemWebMail命名
ASP.Net2.0发送邮件的代码 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! &nb
在ASP.NET中使用SmtpMail发送邮件 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 在
使用ASP.NET两种发送邮件的方法 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 如果你的AS
ASP.NET发送内嵌图片邮件的正确方法 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 很多企业
ASP.NET2.0发送电子邮件中存在的问题 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!在新发行
Asp.net中的mail的发送 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 现在的邮件发送大
用ASP.NET设计高效邮件列表 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 一个吸引人的功能
ASP.NET发邮件 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! usingSystemusi
创建基于ASP.NET的SMTP邮件服务 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!在Syste