当前位置:编程学习 > asp >>

ASP.NET发送邮件

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

/// <summary>

/// 邮件通知服务类。

/// </summary>

public class EmailNotificationService {

    /// <summary>

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

    /// </summary>

    /// <param>SMTP服务器的IP地址</param>

    /// <param>是否使用SSL连接SMTP服务器器</param>

    /// <param>SMTP服务器端口</param>

    /// <param>用于登录SMTP服务器的用户名</param>

    /// <param>登录密码</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>显示在“发件人”一栏上的名称</param>

    /// <param>目的EMAIL地址</param>

    /// <param>邮件标题</param>

    /// <param>邮件内容</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.UTF8);

       mail.Subject = title;

       mail.Body = content;

       mail.BodyEncoding = Encoding.UTF8;

       mail.IsBodyHtml = false;

       mail.Priority = MailPriority.Normal;

       SmtpClient smtp = new SmtpClient();

       smtp.Credentials = new NetworkCredential(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>

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;

   &nbs

补充:Web开发 , ASP.Net ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,