分享
 
 
 

.NET 1.1 下不使用 System.Web.Mail.SmtpMail 发送邮件的其它选择

王朝c#·作者佚名  2008-05-31
窄屏简体版  字體: |||超大  

最近工作原因需要维护 ASP.NET 1.1 的程序,本来用着 C# 2.0 System.Net.Mail namespace 发送邮件用得好好得,但 ASP.NET 1.1 里面的 System.Web.Mail 死活问题就是多,于是选择其它策略,封装了邮件发送的接口,再以其它方式来实现邮件发送,于是就有了下面这些文字。

定义抽象接口以封装所有实现:

using System;

using System.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 this._defaultCharset; }

}

protected int DefaultSmtpPort

{

get { return this._defaultSmtpPort;}

}

#endregion

Methods#region Methods

/**//// <summary>

/// 获取默认实例

/// </summary>

/// <returns></returns>

public static MySmtpMail GetDefaultInstance()

{

// 此处可通过外部配置文件定义具体实现类型,再

// 通过 Activator.CreateInstance() 获取类型实例

}

/**//// <summary>

/// 做一些初始化的工作

/// </summary>

public abstract void Open();

/**//// <summary>

/// 销毁对象

/// </summary>

public abstract void Close();

/**//// <summary>

/// 发送邮件

/// </summary>

/// <param name="message"></param>

/// <param name="smtpServer"></param>

/// <param name="serverUsername"></param>

/// <param name="serverPassword"></param>

/// <returns></returns>

public bool Send(MailMessage message, string smtpServer, string serverUsername, string serverPassword)

{

return Send(message, smtpServer, serverUsername, serverPassword, this._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 (Globals.IsNullorEmpty(message.To))

return null;

return message.To.Split(';');

}

public static string[] GetCc(MailMessage message)

{

if (message == null)

throw new ArgumentNullException("message");

if (Globals.IsNullorEmpty(message.Cc))

return null;

return message.Cc.Split(';');

}

public static string[] GetBcc(MailMessage message)

{

if (message == null)

throw new ArgumentNullException("message");

if (Globals.IsNullorEmpty(message.Bcc))

return null;

return message.Bcc.Split(';');

}

#endregion

}

}

注: 按照常理,使用前先 Open() 一下,使用后也别忘了 Close()

实现方案一(Jmail 组件):

在 .NET 中使用 Jmail 需要如下设置:

1、安装jmail;

2、找到jmail.dll;

3、注册该组件Jmail.dll,作法是将jmail.dll文件拷贝到system32目录下,再运行命令“regsvr32 jmail.dll”(不包括引号),卸载可运行“regsvr32 /u jmail.dll”;

4、执行Program Files\Microsoft Visual Studio .NET\FrameworkSDK\Bin\ildasm.exe(可使用Visual Studio .Net 2003 命令提示),

格式如下:tlbimp c:\Program Files\Dimac\w3JMail4\jmail.dll /out:MyJmail.dll /namespace:MyJmail

生成MyJmail.dll后,将它引用至项目中。

下载组件

接下来就是实现类的编写了:

using System;

using System.Web.Mail;

namespace YywMail

{

public class JMailSmtpMail : MySmtpMail

{

Fields#region Fields

MyJmail.Message jmail = null;

#endregion

Methods#region Methods

public override void Open()

{

jmail = new MyJmail.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 = DateTime.Now;

//Silent属性:如果设置为true,JMail不会抛出例外错误. JMail. Send( () 会根据操作结果返回true或false

jmail.Silent = false;

//jmail创建的日志,前提loging属性设置为true

jmail.Logging = true;

//字符集,缺省为"US-ASCII"

jmail.Charset = base.DefaultCharset;

//信件的contentype. 缺省是"text/plain") : 字符串如果你以HTML格式发送邮件, 改为"text/html"即可。

if (message.BodyFormat == MailFormat.Html)

jmail.ContentType = "text/html";

jmail.Priority = GetJmailPriority(message.Priority);

//添加收件人

string[] toArray = MySmtpMail.GetTo(message);

if (toArray != null && toArray.Length > 0)

{

bool isAddedRecipient = false;

for (int i = 0; i < toArray.Length; i++)

{

if (Globals.IsNullorEmpty(toArray[i]))

continue;

if (!isAddedRecipient)

{

jmail.AddRecipient(toArray[i], String.Empty, String.Empty);

isAddedRecipient = true;

}

else

{

jmail.AddRecipientCC(toArray[i], String.Empty, String.Empty);

}

}

}

string[] ccArray = MySmtpMail.GetCc(message);

if (ccArray != null)

{

foreach (string cc in ccArray)

{

if (!Globals.IsNullorEmpty(cc))

jmail.AddRecipientCC(cc, String.Empty, String.Empty);

}

}

string[] bccArray = MySmtpMail.GetBcc(message);

if (ccArray != null)

{

foreach (string bcc in bccArray)

{

if (!Globals.IsNullorEmpty(bcc))

jmail.AddRecipientBCC(bcc, String.Empty);

}

}

jmail.From = message.From;

//发件人邮件用户名

jmail.MailServerUserName = serverUsername;

//发件人邮件密码

jmail.MailServerPassWord = serverPassword;

//设置邮件标题

jmail.Subject = message.Subject;

//邮件添加附件,(多附件的话,可以再加一条jmail.AddAttachment( "c:\\test.jpg",true,null);)就可以搞定了。[注]:加了附件,讲把上面的jmail.ContentType="text/html";删掉。否则会在邮件里出现乱码。

//jmail.AddAttachment("c:\\test.jpg", true, null);

//邮件内容

jmail.Body = message.Body;

if (message.BodyFormat == MailFormat.Html)

jmail.Body += "<br><br>";

else

jmail.Body += "\r\n\r\n";

jmail.Body += DateTime.Now.ToString();

smtpServer = String.Format("{0}:{1}", smtpServer, smtpPort);

//jmail发送的方法

bool result = jmail.Send(smtpServer, false);

return result;

}

public override void Close()

{

jmail.Close();

}

private static byte GetJmailPriority( System.Web.Mail.MailPriority priority)

{

// 邮件等级,1为加急,3为普通,5为低级

if (priority == System.Web.Mail.MailPriority.High)

return 1;

if (priority == System.Web.Mail.MailPriority.Low)

return 5;

return 3;

}

#endregion

}

}

实现方案二(OpenSmtp.Net 组件):

对于还没有接触过 OpenSmtp.Net 的朋友可以先 Google 下,这里不再做概念介绍,同时它还有一个孪生兄弟 OpenPop.Net,至于 OpenSmtp.Net 我们可以在 http://sourceforge.net/projects/opensmtp-net/ 下载到,目前最新版本是 1.11。

接下来开始进入主题:

using System;

using System.Web.Mail;

using OpenSmtp.Mail;

namespace YywMail

{

public class OpenSmtpMail : MySmtpMail

{

Files#region Files

OpenSmtp.Mail.MailMessage msg = null;

Smtp smtp = null;

#endregion

Methods#region Methods

public override void Open()

{

msg = new OpenSmtp.Mail.MailMessage();

smtp = new Smtp();

}

public override bool Send(System.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");

SmtpConfig.VerifyAddresses = false;

EmailAddress from = new EmailAddress(message.From, message.From);

msg.Charset = base.DefaultCharset;

msg.From = from;

msg.Priority = GetOpenSmtpPriority(message.Priority);

//添加收件人

string[] toArray = MySmtpMail.GetTo(message);

if (toArray != null)

{

foreach (string to in toArray)

{

if (!Globals.IsNullorEmpty(to))

msg.AddRecipient(to, AddressType.To);

}

}

string[] ccArray = MySmtpMail.GetCc(message);

if (ccArray != null)

{

foreach (string cc in ccArray)

{

if (!Globals.IsNullorEmpty(cc))

msg.AddRecipient(cc, AddressType.Cc);

}

}

string[] bccArray = MySmtpMail.GetBcc(message);

if (ccArray != null)

{

foreach (string bcc in bccArray)

{

if (!Globals.IsNullorEmpty(bcc))

msg.AddRecipient(bcc, AddressType.Bcc);

}

}

msg.Subject = message.Subject;

if (message.BodyFormat == System.Web.Mail.MailFormat.Html)

{

msg.HtmlBody = message.Body + "<br><br>" + DateTime.Now.ToString();

}

else

{

msg.Body = message.Body + "\r\n\r\n" + DateTime.Now.ToString();;

}

string str1 = msg.HtmlBody;

string str2 = msg.Body;

smtp.Host = smtpServer;

smtp.Username = serverUsername;

smtp.Password = serverPassword;

smtp.Port = smtpPort;

smtp.SendMail(msg);

return true;

}

public override void Close()

{

msg = null;

smtp = null;

}

private static string GetOpenSmtpPriority( System.Web.Mail.MailPriority priority)

{

// 邮件等级,1为加急,3为普通,5为低级

if (priority == System.Web.Mail.MailPriority.High)

return OpenSmtp.Mail.MailPriority.High;

if (priority == System.Web.Mail.MailPriority.Low)

return OpenSmtp.Mail.MailPriority.Low;

return OpenSmtp.Mail.MailPriority.Normal;

}

#endregion

}

}

实现方案三:

(上面两种实现方案已经足够满足目前的需求,有必要的话再继续扩展)

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有