邮件发送类

来源:互联网 发布:影院售票软件 编辑:程序博客网 时间:2024/05/17 01:59

 

/*-------------------------------------------------------
 * Copyright (C) 2006 江苏微软技术中心
 * 版权所有。
 * 
 * 文件名:SMTP.cs
 * 文件功能描述:邮件发送类,包含同步和异步发送2种方式,
 * 其中每种发送方式都可以选择邮件非必选项(如抄送,附件等)。
 * 
 * 创建标识:韩进宾 20070424
 * 
 * 修改标识:
 * 修改描述:
 * 
 * --------------------------------------------------------
*/
using System;
using System.Collections.Generic;
using System.Text;

using System.Net.Mail;
using System.Net.Configuration;
using System.Configuration;
using System.Net;

using System.Web.Configuration;

namespace TVasahiBLL
{
    
public class SMTP
    {
        
#region 邮件发送类

        
#region Fields

        
private string _mailFrom;
        
private string _displayName;
        
private SmtpClient smtpMail;

        
#endregion

        
#region Properties

        
//出发地油箱设置
        public string MailFrom
        {
            
get
            {
                
return _mailFrom;
            }
            
set
            {
                _mailFrom 
= value;
            }
        }

        
//出发地邮件显示的名字
        public string DisplayName
        {
            
get
            {
                
return _displayName;
            }
            
set
            {
                _displayName 
= value;
            }
        }

        
#endregion

        
#region Constructors

        
public SMTP()
        {
            
//app.config中读取smtp服务器信息
            
//如果此处出现命名空间“System.Configuration”中不存在类型或命名空间名称“Configuration”(是缺少程序集引用吗?)错误请添加System.Configuration即可
            Configuration config = WebConfigurationManager.OpenWebConfiguration("~/");
            MailSettingsSectionGroup mailSettings 
= (MailSettingsSectionGroup)config.GetSectionGroup("system.net/mailSettings");
            
string mailFrom = mailSettings.Smtp.From;
            
string smtpServer = mailSettings.Smtp.Network.Host;
            
int smtpPort = mailSettings.Smtp.Network.Port;
            
string smtpUsername = mailSettings.Smtp.Network.UserName;
            
string password = mailSettings.Smtp.Network.Password;

            
//此处用户让用户手动输入smtp帐号 
            
//string mailFrom = "";
            
//string smtpServer = "emailcarrier.vicp.net";
            
//int smtpPort = 25;
            
//string smtpUsername = "";
            
//string password = "";

            smtpMail 
= new SmtpClient(smtpServer, smtpPort);
            smtpMail.Credentials 
= new NetworkCredential(smtpUsername, password);
            
this._mailFrom = mailFrom;
            
this._displayName = smtpUsername;
        }

        
public SMTP(string smtpServer, string userName, string password)
            : 
this(null, smtpServer, userName, password)
        {

        }

        
/// <summary>
        
/// 邮件发送类
        
/// </summary>
        
/// <param name="mailFrom">发信人</param>
        
/// <param name="smtpServer">SMTP服务器</param>
        
/// <param name="userName">用户名</param>
        
/// <param name="password">密码</param>
        public SMTP(string mailFrom, string smtpServer, string userName, string password)
            : 
this(mailFrom, mailFrom, smtpServer, userName, password)
        {

        }

        
/// <summary>
        
/// 邮件发送类
        
/// </summary>
        
/// <param name="maiFrom">发信人</param>
        
/// <param name="displayName">显示名称</param>
        
/// <param name="smtpServer">SMTP服务器</param>
        
/// <param name="smtpPort">端口</param>
        
/// <param name="userName">用户名</param>
        
/// <param name="password">密码</param>
        public SMTP(string maiFrom, string displayName, string smtpServer, string userName, string password)
            : 
this(maiFrom, displayName, smtpServer, 25, userName, password, false)
        {
        }

        
public SMTP(string mailFrom, string displayName, string smtpServer, int smtpPort, string userName, string password, bool smtpSsl)
        {
            
this._mailFrom = mailFrom;
            
this._displayName = displayName;
            smtpMail 
= new SmtpClient(smtpServer, smtpPort);
            smtpMail.Credentials 
= new NetworkCredential(userName, password);
            smtpMail.EnableSsl 
= smtpSsl;
        }

        
#endregion

        
#region Methods

        
#region Public
        
/// <summary>
        
/// 邮件类
        
/// </summary>
        
/// <param name="mailTo">收信人</param>
        
/// <param name="mailSubject">题目</param>
        
/// <param name="mailBody">内容</param>
        
/// <param name="priority">邮件优先权</param>
        
/// <param name="isBodyHtml">是否以html格式发送</param>
        
/// <returns></returns>
        public Boolean Send(string mailTo, string mailSubject, string mailBody, MailPriority priority, bool isBodyHtml)
        {
            
string[] mailTos = new string[] { mailTo };
            
string[] attachments = null;
            System.Text.Encoding bodyEncoding 
= System.Text.Encoding.Default;
            
return Send(mailTos, nullnull, mailSubject, mailBody, attachments, priority, isBodyHtml, bodyEncoding);
        }

        
public Boolean Send(string mailTo, string mailSubject, string mailBody, string[] attachments, MailPriority priority, bool isBodyHtml, System.Text.Encoding bodyEncoding)
        {
            
string[] mailTos = new string[] { mailTo };
            
return Send(mailTos, nullnull, mailSubject, mailBody, attachments, priority, isBodyHtml, bodyEncoding);
        }

        
public Boolean Send(string[] mailTos, string[] mailCcs, string[] mailBccs, string mailSubject, string mailBody, string[] attachments,
            MailPriority priority, 
bool isBodyHtml, System.Text.Encoding bodyEncoding)
        {
            
return Send(this._mailFrom, this._displayName, mailTos, mailCcs, mailBccs, mailSubject, mailBody, attachments, priority, isBodyHtml, bodyEncoding);
        }

        
/// <summary>同步发送邮件
        
/// 同步发送邮件
        
/// </summary>
        
/// <param name="mailFrom">发件地址</param>
        
/// <param name="displayName">显示名字</param>
        
/// <param name="mailTos">对方邮件地址</param>
        
/// <param name="mailCcs">抄送</param>
        
/// <param name="mailBccs">秘件抄送</param>
        
/// <param name="mailSubject">主题</param>
        
/// <param name="mailBody">内容</param>
        
/// <param name="attachments">附件 </param>
        
/// <param name="priority">电子邮件的优先权</param>
        
/// <param name="isBodyHtml">是否以html格式发送</param>
        
/// <param name="bodyEncoding">字元编码</param>
        
/// <returns></returns>
        public Boolean Send(string mailFrom, string displayName, string[] mailTos, string[] mailCcs, string[] mailBccs, string mailSubject, string mailBody, string[] attachments, MailPriority priority, bool isBodyHtml, System.Text.Encoding bodyEncoding)
        {
            
return SendMail(falsenull, mailFrom, displayName, mailTos, mailCcs, mailBccs, mailSubject, mailBody, attachments, priority, isBodyHtml, bodyEncoding);
        }

        
public void SendAsync(object userState, string mailTo, string mailSubject, string mailBody, MailPriority priority, bool isBodyHtml)
        {
            
string[] mailTos = new string[] { mailTo };
            
string[] attachments = null;
            System.Text.Encoding bodyEncoding 
= System.Text.Encoding.Default;
            SendAsync(userState, mailTos, 
nullnull, mailSubject, mailBody, attachments, priority, isBodyHtml, bodyEncoding);
        }

        
public void SendAsync(object userState, string mailTo, string mailSubject, string mailBody, string[] attachments, MailPriority priority, bool isBodyHtml, System.Text.Encoding bodyEncoding)
        {
            
string[] mailTos = new string[] { mailTo };
            SendAsync(userState, 
this._mailFrom, this._displayName, mailTos, nullnull, mailSubject, mailBody, attachments, priority, isBodyHtml, bodyEncoding);
        }

        
public void SendAsync(object userState, string mailFrom, string displayName, string[] mailTos, string[] mailCcs, string[] mailBccs, string mailSubject, string mailBody, string[] attachments, MailPriority priority, bool isBodyHtml, System.Text.Encoding bodyEncoding)
        {
            SendMail(
true, userState, MailFrom, displayName, mailTos, mailCcs, mailBccs, mailSubject, mailBody, attachments, priority, isBodyHtml, bodyEncoding);
        }

        
/// <summary>异步发送邮件
        
/// 异步发送邮件
        
/// </summary>
        
/// <param name="userState"></param>
        
/// <param name="mailTos">对方邮件地址</param>
        
/// <param name="mailCcs">抄送</param>
        
/// <param name="mailBccs">秘件抄送</param>
        
/// <param name="mailSubject">主题</param>
        
/// <param name="mailBody">内容</param>
        
/// <param name="attachments">附件 </param>
        
/// <param name="priority">电子邮件的优先权</param>
        
/// <param name="isBodyHtml">是否以html格式发送</param>
        
/// <param name="bodyEncoding">字元编码</param>
        public void SendAsync(object userState, string[] mailTos, string[] mailCcs, string[] mailBccs, string mailSubject, string mailBody, string[] attachments, MailPriority priority, bool isBodyHtml, System.Text.Encoding bodyEncoding)
        {
            SendMail(
true, userState, nullnull, mailTos, mailCcs, mailBccs, mailSubject, mailBody, attachments, priority, isBodyHtml, bodyEncoding);
        }

        
/// <summary>
        
/// 发送邮件
        
/// </summary>
        
/// <param name="isAsync">是否是同步发送</param>
        
/// <param name="userState">异步任务的唯一标识符,当 isAsync 为 True 时必须设置该属性, 当 isAsync 为 False 时可设置为 null</param>
        
/// <param name="mailFrom">发件地址</param>
        
/// <param name="displayName">显示名字</param>
        
/// <param name="mailTos">对方邮件地址</param>
        
/// <param name="mailCcs">抄送</param>
        
/// <param name="mailBccs">秘件抄送</param>
        
/// <param name="mailSubject">主题</param>
        
/// <param name="mailBody">内容</param>
        
/// <param name="attachments">附件 </param>
        
/// <param name="priority">电子邮件的优先权</param>
        
/// <param name="isBodyHtml">是否以html格式发送</param>
        
/// <param name="bodyEncoding">字元编码</param>
        
/// <returns></returns>
        private Boolean SendMail(bool isAsync, object userState, string mailFrom, string displayName, string[] mailTos, string[] mailCcs, string[] mailBccs, string mailSubject,
            
string mailBody, string[] attachments, MailPriority priority, bool isBodyHtml, System.Text.Encoding bodyEncoding)
        {
            
bool mailSent = false;

            
if (string.IsNullOrEmpty(mailFrom))
            {
                mailFrom 
= this._mailFrom;
            }
            
if (string.IsNullOrEmpty(displayName))
            {
                displayName 
= this._displayName;
            }

            MailMessage Email 
= GetMailMessage(MailFrom, displayName, mailTos, mailCcs, mailBccs, mailSubject, mailBody, attachments, priority, isBodyHtml, bodyEncoding);
            smtpMail.SendCompleted 
+= new SendCompletedEventHandler(SendCompletedCallback);

            
try
            {
                
if (!isAsync)
                {
                    smtpMail.Send(Email);
                    mailSent 
= true;
                }
                
else
                {
                    userState 
= (userState == null? Guid.NewGuid() : userState;
                    smtpMail.SendAsync(Email, userState);
                }
            }
            
catch (SmtpFailedRecipientException ex)
            {
                
throw ex;
                mailSent 
= false;
            }
            
catch (Exception ex)
            {
                
throw ex;
                mailSent 
= false;
            }

            
return mailSent;
        }

        
/// <summary>
        
/// 邮件信息设置
        
/// </summary>
        
/// <param name="mailFrom">发件地址</param>
        
/// <param name="displayName">显示名字</param>
        
/// <param name="mailTos">对方邮件地址</param>
        
/// <param name="mailCcs">抄送</param>
        
/// <param name="mailBccs">秘件抄送</param>
        
/// <param name="mailSubject">主题</param>
        
/// <param name="mailBody">内容</param>
        
/// <param name="attachments">附件 </param>
        
/// <param name="priority">电子邮件的优先权</param>
        
/// <param name="isBodyHtml">是否以html格式发送</param>
        
/// <param name="bodyEncoding">字元编码</param>
        
/// <returns></returns>
        private MailMessage GetMailMessage(string mailFrom, string displayName, string[] mailTos, string[] mailCcs, string[] mailBccs, string mailSubject, string mailBody, string[] attachments, MailPriority priority, bool isBodyHtml, System.Text.Encoding bodyEncoding)
        {
            MailMessage emailMessage 
= new MailMessage();

            
if (string.IsNullOrEmpty(mailFrom))//此处还需验证
            {
                mailFrom 
= this._mailFrom;
            }
            
if (string.IsNullOrEmpty(displayName))
            {
                displayName 
= this._displayName;
            }

            MailAddress mailFromObject 
= new MailAddress(mailFrom, displayName);

            emailMessage.From 
= mailFromObject;

            
//判断邮件数组是否为空,不为空则加入列表
            if (mailTos != null)
            {
                
foreach (string mailto in mailTos)
                {
                    
if (!string.IsNullOrEmpty(mailto))
                    {
                        emailMessage.To.Add(mailto);
                    }
                }
            }

            
//判断抄送
            if (mailCcs != null)
            {
                
foreach (string cc in mailCcs)
                {
                    
if (!string.IsNullOrEmpty(cc))
                    {
                        emailMessage.CC.Add(cc);
                    }
                }
            }

            
//秘件抄送
            if (mailBccs != null)
            {
                
foreach (string bcc in mailBccs)
                {
                    
if (!string.IsNullOrEmpty(bcc))
                    {
                        emailMessage.Bcc.Add(bcc);
                    }
                }
            }

            
//添加附件
            if (attachments != null)
            {
                
foreach (string file in attachments)
                {
                    
if (!string.IsNullOrEmpty(file))
                    {
                        Attachment att 
= new Attachment(file);
                        emailMessage.Attachments.Add(att);
                    }
                }
            }

            emailMessage.Subject 
= mailSubject;
            emailMessage.Body 
= mailBody;
            emailMessage.Priority 
= priority;
            emailMessage.IsBodyHtml 
= isBodyHtml;
            emailMessage.BodyEncoding 
= bodyEncoding;

            
return emailMessage;
        }

        
private void SendCompletedCallback(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
        {
            
bool mailSent = false;

            
//获得是否异步发送的表识
            String token = e.UserState.ToString();

            
if (e.Cancelled)
            {
                mailSent 
= false;
            }
            
if (e.Error != null)
            {
                mailSent 
= false;
            }
            
else
            {
                mailSent 
= false;
            }

            mailSent 
= true;
        }

        
#endregion

        
#endregion

        
#endregion
    }
}
原创粉丝点击