1.新建一個抽象類FTMailBase.cs,代碼如下:
/* ========================================================
* Module Name: JuCheap.Service.SendEmail
* Class Name: FTMailBase
* Description: 所有郵件Sender的基類
* Company : JuCheap
* Author : JuCheap
* Create Date: 2014-11-03
===========================================================*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Mail;
using System.Configuration;
using JuCheap.Common.Extention;
namespace JuCheap.Service.SendEmail
{
/// <summary>
/// 所有郵件Sender的基類
/// </summary>
public abstract class FTMailBase
{
/// <summary>
/// 發件人
/// </summary>
public string From { get; set; }
/// <summary>
/// 收件人
/// </summary>
public string To { get; set; }
/// <summary>
/// 主題
/// </summary>
public string Subject { get; set; }
//正文
public string Body { get; set; }
/// <summary>
/// 抄送
/// </summary>
public string CC { get; set; }
/// <summary>
/// 顯示名稱
/// </summary>
public string DisplayName { get; set; }
/// <summary>
/// 發送郵件
/// </summary>
/// <param name="smtpServer">郵件服務器地址</param>
/// <param name="port">端口</param>
/// <param name="userName">帳號</param>
/// <param name="password">密碼</param>
/// <param name="enableSSL">是否啓用SSL</param>
/// <returns></returns>
public abstract bool Send(string smtpServer = null
, int? port = default(int?)
, string userName = null
, string password = null
, bool? enableSSL = default(bool?));
/// <summary>
/// 工廠方法,獲取郵件SENDER實例
/// </summary>
public static FTMailBase Instance
{
get
{
return new SMTPMailer();
}
}
}
}
2.實現抽象類;新建郵件發送類:SMTPMailer.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Mail;
using System.Configuration;
using JuCheap.Common.Extention;
namespace JuCheap.Service.SendEmail
{
internal class SMTPMailer : FTMailBase
{
/// <summary>
/// SMTP郵件Sender的類的封裝
/// </summary>
/// <param name="smtpServer">smtp服務地址</param>
/// <param name="port">端口號</param>
/// <param name="userName">用戶名</param>
/// <param name="password">密碼</param>
/// <param name="enableSSL">是否採用ssl的方式</param>
public override bool Send(string smtpServer = null, int? port = default(int?), string userName = null, string password = null,bool? enableSSL=default(bool?))
{
bool isSended = false;
try
{
smtpServer = smtpServer.IsBlank() ? ConfigurationManager.AppSettings["SMTPServer_Address"] : smtpServer;
port = !port.HasValue ? Convert.ToInt32(ConfigurationManager.AppSettings["SMTPServer_Port"]) : port.Value;
userName = userName.IsBlank() ? ConfigurationManager.AppSettings["SMTPServer_UserName"] : userName;
password = password.IsBlank() ? ConfigurationManager.AppSettings["SMTPServer_UserPwd"] : password;
if (!enableSSL.HasValue)
{
bool temp = false;
bool.TryParse(ConfigurationManager.AppSettings["SMTPServer_EnableSSL"], out temp);
enableSSL = temp;
}
System.Net.Mail.MailMessage message = new System.Net.Mail.MailMessage();
message.To.Add(this.To);
message.Sender = new MailAddress(userName, userName);
if (!this.CC.IsBlank())
message.CC.Add(this.CC);
message.Subject = System.Text.UTF8Encoding.Default.GetString(System.Text.UTF8Encoding.Default.GetBytes(this.Subject));
if (DisplayName.IsBlank())
message.From = new System.Net.Mail.MailAddress(this.From);
else
message.From = new System.Net.Mail.MailAddress(this.From, System.Text.UTF8Encoding.Default.GetString(System.Text.UTF8Encoding.Default.GetBytes(this.DisplayName)));
message.Body = System.Text.UTF8Encoding.Default.GetString(System.Text.UTF8Encoding.Default.GetBytes(this.Body));
message.BodyEncoding = Encoding.GetEncoding("GBK") ;
message.HeadersEncoding = Encoding.UTF8;
message.SubjectEncoding = Encoding.UTF8;
message.IsBodyHtml = true;
message.DeliveryNotificationOptions = DeliveryNotificationOptions.OnFailure;
message.ReplyToList.Add(new MailAddress(this.From));
System.Net.Mail.SmtpClient smtp = new System.Net.Mail.SmtpClient(smtpServer, port.Value);
smtp.DeliveryMethod = SmtpDeliveryMethod.Network;
smtp.UseDefaultCredentials = false;
smtp.Credentials = new NetworkCredential(userName, password);
smtp.Timeout = 30000;
smtp.EnableSsl = enableSSL.Value;
smtp.SendCompleted += new SendCompletedEventHandler(smtp_SendCompleted);
smtp.Send(message);
isSended = true;
}
catch (Exception ex)
{
Log.Write(ex);
throw ex;
}
return isSended;
}
/// <summary>
/// 編碼成64位
/// </summary>
/// <param name="s">需要編碼的內容</param>
/// <returns>返回被編碼的內容</returns>
private string encodebase64(string s)
{
string encode = "";
byte[] bytes = Encoding.UTF8.GetBytes(s);
try
{
encode = Convert.ToBase64String(bytes);
}
catch
{
encode = s;
}
return encode;
}
/// <summary>
/// 發送完成後,如果有錯誤,記錄日誌
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void smtp_SendCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
{
if (e.Error != null)
{
Log.Write(e.Error);
}
}
}
}