实现发送邮件功能
首先说一下在.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");
发送邮件实现方案
上面创建好了一个负责发送邮件的类,接下来的问题是应该在什么时候调用这个类。发送电子邮件需要进行网络通信,耗时比较多,而且SmtpClient的Send方法是会阻塞调用线程的,一旦调用了该方法,就要等到邮件发送完毕或出错才能结束方法调用,所以不能将对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`和`...
在ASP.NET中,自动发送邮件是一项常见的功能,用于发送通知、确认信息或客户服务等。这里我们看到一个示例代码,它使用.NET Framework提供的类库来实现这个功能。下面将详细解释这段代码的工作原理和涉及的知识点。 ...
在ASP.NET中,网页发送邮件是一项常见的功能,用于与用户进行互动或提供自动化服务。本文将深入探讨如何利用ASP.NET技术来实现这一功能,以及相关的知识点。 首先,我们需要理解ASP.NET的基本架构。ASP.NET是微软...
本文将详细介绍如何使用ASP.NET实现自动发送邮件的功能,并通过示例代码进行说明。 #### 一、配置SMTP服务器 首先,我们需要在项目的`web.config`文件中配置SMTP服务器的信息。以下是一个简单的配置示例: ```xml...
总的来说,ASP.NET邮件自动发送功能强大且灵活,适用于各种应用场景。正确理解和使用这些概念和技术,可以帮助开发者构建高效、可靠的邮件系统。在实际开发中,还需要根据具体的SMTP服务器配置和邮件需求进行适当的...
在.NET框架中,实现邮件发送功能是常见的需求,特别是在ASP.NET web应用开发中。这篇文章将深入探讨如何使用C#语言和.NET库来构建一个简单的邮件发送功能,包括单发和群发邮件。首先,我们需要了解.NET中的System...
【邮件发送示例ASP.net源码】是一个ASP.NET应用程序,用于演示如何在.NET环境中实现电子邮件的发送功能。这个示例代码包含了一个完整的解决方案(51aspxMail.sln),一个项目源码,以及相关的帮助文档和链接。通过这...
ASP.NET AJAX发送邮件是一个在Web应用中常见的功能,它允许用户在不刷新整个页面的情况下发送邮件,提供更好的用户体验。在本文中,我们将深入探讨如何利用ASP.NET和AJAX技术实现这个功能,以及涉及的关键知识点。 ...
在这个场景中,我们讨论的是如何使用C#在ASP.NET环境下实现邮件发送功能。邮件发送在许多应用中都很常见,例如发送确认邮件、通知、客户服务通信等。 标题中的“C# (ASP.NET)邮件发送的简单例子”意味着我们将探讨...
这个系统可以按照预设的时间间隔自动发送邮件,无需人工干预,极大地提高了工作效率并降低了人为错误的可能性。在实际应用中,可以根据需求调整邮件内容的生成逻辑,支持个性化模板,以及多邮件接收者等功能。
ASP.NET邮件自动发送模块是开发Web应用程序时常用的一个功能组件,尤其在用户注册、密码找回、订阅确认等场景中起到关键作用。通过该模块,开发者可以实现程序自动生成并发送电子邮件,以完成与用户的交互。下面我们...
在ASP.NET中,发送邮件是一项常见的功能,通常用于通知、验证或客户服务等场景。邮件发送功能的实现主要依赖于System.Net.Mail命名空间中的类。 标题"asp.net 邮件发送源码,测试可用"表明我们要讨论的是一个ASP...
在Asp.net中发送邮件是一项常见且实用的功能,它能够帮助开发者实现自动化通知、用户注册确认、密码重置等操作。下面将详细解析如何利用Asp.net中的`System.Net.Mail`命名空间来发送邮件。 ### 核心概念 在Asp.net...
8. "验证码实现":防止自动化脚本攻击,可以使用ASP.NET的验证码控件生成图像验证码。 9. "SEO优化":包括URL重写、元标签管理和响应式设计,以提高搜索引擎排名。 10. "日志记录":记录应用程序的运行情况,便于...
在ASP.NET中,实现用户注册...总之,ASP.NET的注册后自动发送邮件验证机制是构建安全用户系统的关键环节,涉及到网络通信、数据存储、加密算法等多个方面。理解并掌握这些知识点对于开发高效、安全的Web应用至关重要。
ASP.NET邮件发送是Web开发中常见的一项功能,用于在应用程序中实现邮件的自动化发送。这个简单易用的程序示例适合初学者和菜鸟级开发者学习,通过它,你可以理解并掌握如何在ASP.NET环境中构建一个邮件发送系统。...
### ASP.NET 发送邮件知识点详解 ...综上所述,通过ASP.NET发送邮件是一项实用的功能,它能够帮助企业或个人轻松地完成自动化的邮件发送任务。正确配置SMTP服务器并设置邮件的各项属性是实现这一功能的关键。
通过以上分析,我们可以看到,在ASP.NET(C#)中实现定时发送邮件涉及到了多个层面的技术:使用`System.Timers.Timer`进行定时任务管理,利用`MailMessage`和`SmtpClient`进行邮件构建和发送,以及处理异常和日志...
在"asp.net+注册后自动发送邮件,通过链接进行验证"的场景中,我们主要涉及以下知识点: 1. **用户注册系统**:用户注册是任何Web应用的基本功能,它通常包括收集用户信息(如用户名、密码、电子邮件等)并存储在...