分享一個異步發送郵件的C#類代碼

jopen 12年前發布 | 1K 次閱讀

   首先要定義一個郵件信息的基類,如下所示:

/// <summary> /// Base message class used for emails /// </summary> public class Message {

    #region Constructor
    /// <summary>
    /// Constructor
    /// </summary>
    public Message()
    {
    }
    #endregion

    #region Properties
    /// <summary>
    /// Whom the message is to
    /// </summary>
    public virtual string To { get; set; }

    /// <summary>
    /// The subject of the email
    /// </summary>
    public virtual string Subject { get; set; }

    /// <summary>
    /// Whom the message is from
    /// </summary>
    public virtual string From { get; set; }

    /// <summary>
    /// Body of the text
    /// </summary>
    public virtual string Body { get; set; }

    #endregion
}

然后定義一個郵件的發送類,使用Netmail的方式發送郵件,發送郵件時采用了.net中自帶的線程池,

通過多線程來實現異步的發送,代碼如下:

/// <summary> /// Utility for sending an email /// </summary> public class EmailSender : Message {

    #region Constructors

    /// <summary>
    /// Default Constructor
    /// </summary>
    public EmailSender()
    {
        Attachments = new List<Attachment>();
        EmbeddedResources = new List<LinkedResource>();
        Priority = MailPriority.Normal;
    }

    #endregion

    #region Public Functions

    /// <summary>
    /// Sends an email
    /// </summary>
    /// <param name="Message">The body of the message</param>
    public void SendMail(string Message)
    {
        Body = Message;
        SendMail();
    }

    /// <summary>
    /// Sends a piece of mail asynchronous
    /// </summary>
    /// <param name="Message">Message to be sent</param>
    public void SendMailAsync(string Message)
    {
        Body = Message;
        ThreadPool.QueueUserWorkItem(delegate { SendMail(); });
    }

    /// <summary>
    /// Sends an email
    /// </summary>
    public void SendMail()
    {
        using (System.Net.Mail.MailMessage message = new System.Net.Mail.MailMessage())
        {
            char[] Splitter = { ',', ';' };
            string[] AddressCollection = To.Split(Splitter);
            for (int x = 0; x < AddressCollection.Length; ++x)
            {
                if(!string.IsNullOrEmpty(AddressCollection[x].Trim()))
                    message.To.Add(AddressCollection[x]);
            }
            if (!string.IsNullOrEmpty(CC))
            {
                AddressCollection = CC.Split(Splitter);
                for (int x = 0; x < AddressCollection.Length; ++x)
                {
                    if (!string.IsNullOrEmpty(AddressCollection[x].Trim()))
                        message.CC.Add(AddressCollection[x]);
                }
            }
            if (!string.IsNullOrEmpty(Bcc))
            {
                AddressCollection = Bcc.Split(Splitter);
                for (int x = 0; x < AddressCollection.Length; ++x)
                {
                    if (!string.IsNullOrEmpty(AddressCollection[x].Trim()))
                        message.Bcc.Add(AddressCollection[x]);
                }
            }
            message.Subject = Subject;
            message.From = new System.Net.Mail.MailAddress((From));
            AlternateView BodyView = AlternateView.CreateAlternateViewFromString(Body, null, MediaTypeNames.Text.Html);
            foreach (LinkedResource Resource in EmbeddedResources)
            {
                BodyView.LinkedResources.Add(Resource);
            }
            message.AlternateViews.Add(BodyView);
            //message.Body = Body;
            message.Priority = Priority;
            message.SubjectEncoding = System.Text.Encoding.GetEncoding("ISO-8859-1");
            message.BodyEncoding = System.Text.Encoding.GetEncoding("ISO-8859-1");
            message.IsBodyHtml = true;
            foreach (Attachment TempAttachment in Attachments)
            {
                message.Attachments.Add(TempAttachment);
            }
            System.Net.Mail.SmtpClient smtp = new System.Net.Mail.SmtpClient(Server, Port);
            if (!string.IsNullOrEmpty(UserName) && !string.IsNullOrEmpty(Password))
            {
                smtp.Credentials = new System.Net.NetworkCredential(UserName, Password);
            }
            if (UseSSL)
                smtp.EnableSsl = true;
            else
                smtp.EnableSsl = false;
            smtp.Send(message);
        }
    }

    /// <summary>
    /// Sends a piece of mail asynchronous
    /// </summary>
    public void SendMailAsync()
    {
        ThreadPool.QueueUserWorkItem(delegate { SendMail(); });
    }

    #endregion

    #region Properties

    /// <summary>
    /// Any attachments that are included with this
    /// message.
    /// </summary>
    public List<Attachment> Attachments { get; set; }

    /// <summary>
    /// Any attachment (usually images) that need to be embedded in the message
    /// </summary>
    public List<LinkedResource> EmbeddedResources { get; set; }

    /// <summary>
    /// The priority of this message
    /// </summary>
    public MailPriority Priority { get; set; }

    /// <summary>
    /// Server Location
    /// </summary>
    public string Server { get; set; }

    /// <summary>
    /// User Name for the server
    /// </summary>
    public string UserName { get; set; }

    /// <summary>
    /// Password for the server
    /// </summary>
    public string Password { get; set; }

    /// <summary>
    /// Port to send the information on
    /// </summary>
    public int Port { get; set; }

    /// <summary>
    /// Decides whether we are using STARTTLS (SSL) or not
    /// </summary>
    public bool UseSSL { get; set; }

    /// <summary>
    /// Carbon copy send (seperate email addresses with a comma)
    /// </summary>
    public string CC { get; set; }

    /// <summary>
    /// Blind carbon copy send (seperate email addresses with a comma)
    /// </summary>
    public string Bcc { get; set; }

    #endregion
}</pre><br />
 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!