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);
}
}
}
}