ASP源码
PHP源码
.NET源码
JSP源码
最近工作原因需要维护 ASP.NET 1.1 的程序,本来用着 C# 2.0 Sy***m.Net.Mail namespace 发送邮件用得好好得,但 ASP.NET 1.1 里面的 Sy***m.Web.Mail 死活问题就是多,于是选择其它策略,封装了邮件发送的接口,再以其它方式来实现邮件发送,于是就有了下面这些文字。
定义抽象接口以封装所有实现:
using System;
using Sy***m.Web.Mail;
namespace YywMail
{
public abstract class MySmtpMail
{
Fields#region Fields
private string _defaultCharset = "GB2312";
private int _defaultSmtpPort = 25;
#endregion
Properties#region Properties
protected string DefaultCharset
{
get { return th***_defaultCharset; }
}
protected int DefaultSmtpPort
{
get { return th***_defaultSmtpPort;}
}
#endregion
Methods#region Methods
/**////
/// 获取默认实例
///
///
public static MySmtpMail GetDefaultInstance()
{
// 此处可通过外部配置文件定义具体实现类型,再
// 通过 Ac***ator.CreateInstance() 获取类型实例
}
/**////
/// 做一些初始化的工作
///
public abstract void Open();
/**////
/// 销毁对象
///
public abstract void Close();
/**////
/// 发送邮件
///
///
///
///
///
///
public bool Send(MailMessage message, string smtpServer, string serverUsername, string serverPassword)
{
return Send(message, smtpServer, serverUsername, serverPassword, th***_defaultSmtpPort);
}
public abstract bool Send(MailMessage message, string smtpServer, string serverUsername, string serverPassword, int smtpPort);
public static string[] GetTo(MailMessage message)
{
if (message == null)
throw new ArgumentNullException("message");
if (Gl***ls.IsNullorEmpty(me***ge.To))
return null;
return me***ge.To.Split(';');
}
public static string[] GetCc(MailMessage message)
{
if (message == null)
throw new ArgumentNullException("message");
if (Gl***ls.IsNullorEmpty(me***ge.Cc))
return null;
return me***ge.Cc.Split(';');
}
public static string[] GetBcc(MailMessage message)
{
if (message == null)
throw new ArgumentNullException("message");
if (Gl***ls.IsNullorEmpty(me***ge.Bcc))
return null;
return me***ge.Bcc.Split(';');
}
#endregion
}
}
注: 按照常理,使用前先 Open() 一下,使用后也别忘了 Close()
实现方案一(Jmail 组件):
在 .NET 中使用 Jmail 需要如下设置:
1、安装jmail;
2、找到jm***.dll;
3、注册该组件Jm***.dll,作法是将jm***.dll文件拷贝到system32目录下,再运行命令“regsvr32 jm***.dll”(不包括引号),卸载可运行“regsvr32 /u jm***.dll”;
4、执行Program FilesMicrosoft Visual Studio .NETFrameworkSDKBinil***m.exe(可使用Visual Studio .Net 2003 命令提示),
格式如下:tlbimp c:Program FilesDimacw3JMail4jm***.dll /out:MyJm***.dll /namespace:MyJmail
生成MyJm***.dll后,将它引用至项目中。
下载组件
接下来就是实现类的编写了:
using System;
using Sy***m.Web.Mail;
namespace YywMail
{
public class JMailSmtpMail : MySmtpMail
{
Fields#region Fields
My***il.Message jmail = null;
#endregion
Methods#region Methods
public override void Open()
{
jmail = new My***il.Message();
}
public override bool Send(MailMessage message, string smtpServer, string serverUsername, string serverPassword, int smtpPort)
{
if (jmail == null)
throw new Exception("smtp is Closed!");
if (message == null)
throw new ArgumentNullException("message");
DateTime t = Da***ime.Now;
//Silent属性:如果设置为true,JMail不会抛出例外错误. JMail. Send( () 会根据操作结果返回true或false
jm***.Silent = false;
//jmail创建的日志,前提loging属性设置为true
jm***.Logging = true;
//字符集,缺省为"US-ASCII"
jm***.Charset = ba***DefaultCharset;
//信件的contentype. 缺省是"text/plain") : 字符串如果你以HTML格式发送邮件, 改为"text/html"即可。
if (me***ge.BodyFormat == Ma***ormat.Html)
jm***.ContentType = "text/html";
jm***.Priority = GetJmailPriority(me***ge.Priority);
//添加收件人
string[] toArray = My***pMail.GetTo(message);
if (toArray != null && to***ay.Length > 0)
{
bool isAddedRecipient = false;
for (int i = 0; i < to***ay.Length; i++)
{
if (Gl***ls.IsNullorEmpty(toArray[i]))
continue;
if (!isAddedRecipient)
{
jm***.AddRecipient(toArray[i], St***g.Empty, St***g.Empty);
isAddedRecipient = true;
}
else
{
jm***.AddRecipientCC(toArray[i], St***g.Empty, St***g.Empty);
}
}
}
string[] ccArray = My***pMail.GetCc(message);
if (ccArray != null)
{
foreach (string cc in ccArray)
{
if (!Gl***ls.IsNullorEmpty(cc))
jm***.AddRecipientCC(cc, St***g.Empty, St***g.Empty);
}
}
string[] bccArray = My***pMail.GetBcc(message);
if (ccArray != null)
{
foreach (string bcc in bccArray)
{
if (!Gl***ls.IsNullorEmpty(bcc))
jm***.AddRecipientBCC(bcc, St***g.Empty);
}
}
jm***.From = me***ge.From;
//发件人邮件用户名
jm***.MailServerUserName = serverUsername;
//发件人邮件密码
jm***.MailServerPassWord = serverPassword;
//设置邮件标题
jm***.Subject = me***ge.Subject;
//邮件添加附件,(多附件的话,可以再加一条jm***.AddAttachment( "c:\test.jpg",true,null);)就可以搞定了。[注]:加了附件,讲把上面的jm***.ContentType="text/html";删掉。否则会在邮件里出现乱码。
//jm***.AddAttachment("c:\test.jpg", true, null);
//邮件内容
jm***.Body = me***ge.Body;
if (me***ge.BodyFormat == Ma***ormat.Html)
jm***.Body += "
";
else
jm***.Body += "rnrn";
jm***.Body += Da***ime.Now.ToString();
smtpServer = St***g.Format("{0}:{1}", smtpServer, smtpPort);
//jmail发送的方法
bool result = jm***.Send(smtpServer, false);
return result;
}
public override void Close()
{
jm***.Close();
}
private static byte GetJmailPriority( Sy***m.Web.Mail.MailPriority priority)
{
// 邮件等级,1为加急,3为普通,5为低级
if (priority == Sy***m.Web.Mail.MailPriority.High)
return 1;
if (priority == Sy***m.Web.Mail.MailPriority.Low)
return 5;
return 3;
}
#endregion
}
}
实现方案二(Op***mtp.Net 组件):
对于还没有接触过 Op***mtp.Net 的朋友可以先 Google 下,这里不再做概念介绍,同时它还有一个孪生兄弟 Op***op.Net,至于 Op***mtp.Net 我们可以在 http://sourceforge.net/projects/opensmtp-net/ 下载到,目前最新版本是 1.11。
接下来开始进入主题:
using System;
using Sy***m.Web.Mail;
using Op***mtp.Mail;
namespace YywMail
{
public class OpenSmtpMail : MySmtpMail
{
Files#region Files
Op***mtp.Mail.MailMessage msg = null;
Smtp smtp = null;
#endregion
Methods#region Methods
public override void Open()
{
msg = new Op***mtp.Mail.MailMessage();
smtp = new Smtp();
}
public override bool Send(Sy***m.Web.Mail.MailMessage message, string smtpServer, string serverUsername, string serverPassword, int smtpPort)
{
if (msg == null || smtp == null)
throw new Exception("smtp is Closed!");
if (message == null)
throw new ArgumentNullException("message");
Sm***onfig.VerifyAddresses = false;
EmailAddress from = new EmailAddress(me***ge.From, me***ge.From);
ms***harset = ba***DefaultCharset;
msg.From = from;
ms***riority = GetOpenSmtpPriority(me***ge.Priority);
//添加收件人
string[] toArray = My***pMail.GetTo(message);
if (toArray != null)
{
foreach (string to in toArray)
{
if (!Gl***ls.IsNullorEmpty(to))
ms***ddRecipient(to, Ad***ssType.To);
}
}
string[] ccArray = My***pMail.GetCc(message);
if (ccArray != null)
{
foreach (string cc in ccArray)
{
if (!Gl***ls.IsNullorEmpty(cc))
ms***ddRecipient(cc, Ad***ssType.Cc);
}
}
string[] bccArray = My***pMail.GetBcc(message);
if (ccArray != null)
{
foreach (string bcc in bccArray)
{
if (!Gl***ls.IsNullorEmpty(bcc))
ms***ddRecipient(bcc, Ad***ssType.Bcc);
}
}
ms***ubject = me***ge.Subject;
if (me***ge.BodyFormat == Sy***m.Web.Mail.Ma***ormat.Html)
{
ms***tmlBody = me***ge.Body + "
" + Da***ime.Now.ToString();
}
else
{
msg.Body = me***ge.Body + "rnrn" + Da***ime.Now.ToString();;
}
string str1 = ms***tmlBody;
string str2 = msg.Body;
sm***Host = smtpServer;
sm***Username = serverUsername;
sm***Password = serverPassword;
sm***Port = smtpPort;
sm***SendMail(msg);
return true;
}
public override void Close()
{
msg = null;
smtp = null;
}
private static string GetOpenSmtpPriority( Sy***m.Web.Mail.MailPriority priority)
{
// 邮件等级,1为加急,3为普通,5为低级
if (priority == Sy***m.Web.Mail.MailPriority.High)
return Op***mtp.Mail.MailPriority.High;
if (priority == Sy***m.Web.Mail.MailPriority.Low)
return Op***mtp.Mail.MailPriority.Low;
return Op***mtp.Mail.MailPriority.Normal;
}
#endregion
}
}
实现方案三:
(上面两种实现方案已经足够满足目前的需求,有必要的话再继续扩展)