首 页 网络编程
网页制作 图形图象 操作系统 冲浪宝典
软件教学 认证考试

网络安全 网络办公 行业资讯 评测对比
您当前位置:站长天空 -> 冲浪宝典-> 网页浏览
.net 1.1 下不使用 system.web.mail.smtpmail 发送邮件的其它选择_asp.net技巧
作者:网友供稿 点击:0
推荐
西部数码-全国虚拟主机10强!20余项虚拟主机管理功能,全国领先!第6代双线路虚拟主机,南北访问畅通无阻!可在线rar解压,自动数据恢复设置虚拟目录等.免费赠送访问统计,企业邮局.Cn域名注册10元/年,自助建站480元起,免费试用7天,满意再付款!P4主机租用799元/月.月付免压金
站内搜索
文章页数:[1] 

    最近工作原因需要维护 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
    }
}


实现方案三:

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


文章整理:站长天空 网址:http://www.z6688.com/
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

文章页数:[1] 


放大字体显示 缩小字体显示 打印文章 推荐给朋友
热门文章
·OFFICE编程思路(VBA)-.NET教程,数据库应用
·目前最好的JSP分页技术-JSP教程,Jsp/Servlet
·在JAVA中使用文档对象模型DOM经验小结-JSP教程,Java技巧及代码
·J2EE平台WEB组件开发中如何使用定制标签-JSP教程,J2EE/EJB/服务器
·防止Access数据库被下载-ASP教程,数据库相关
·XMLHTTP 对象及其方法简介-.NET教程,XML应用
·在ASP.NET应用中插入flash动画-.NET教程,Asp.Net开发
·Java学习笔记(一)--熟悉开发环境-JSP教程,Java基础
·怎样在C#中调用Delphi6写的DLL-.NET教程,C#语言
·ASP.NET 2.0 中的母版页详解-.NET教程,Asp.Net开发
最新文章
·关于seo最佳的实践方法_seo网站优化
·photoshop cs3新增黑白转换命令原理剖析_photoshop教程
·抛弃acdsee windows live照片库体验_windows vista
·给网络赚钱新手的一些建议_网赚技巧
·google adsense巡讲大会[日期已更新]_网赚技巧
·“口碑营销”的关键问题是在效率_站长心得
·本地分类信息网站线下推广招数_站长心得
·如何提高网站的“友好指数”?_站长心得
·个人网站站长:商业化还是非商业化?_站长心得
·网站排名对网站推广的价值_站长心得
相关主题
  • .net 2.0(c#)下简单的ftp应用程序_asp.net实例
  • .net 后台的小偷程序_asp.net技巧
  • .net 2.0中新增的nullable类型_asp.net技巧
  • .net 2.0 sqldependency快速上手指南_数据库技巧
  • .net framework与.net framework sdk有什么不同?_asp.net技巧
  • 西部数码虚拟主机

    友情链接
    CNNIC 西部数码
    万网 自助建站
    虚拟主机 asp空间
    域名注册 域名
    域名申请 主页空间
    论坛空间 网站空间
    国际域名 虚拟空间
    空间租用 DDOS防火墙
    成都主机托管 四川主机托管
    主机租用 服务器租用
    网站目录 自助建站
    虚拟主机 网址大全
    软件下载
    自助链接
    虚拟主机资讯 特价虚拟主机
    版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!
    关于我们:站长天空:专业提供最新的站长资讯、在线教程、虚拟主机权威评测、虚拟主机性能对比、网站制作教程,开发教程,站长工具。包括网页制作教程、冲浪宝典、编程参考、操作系统、软件教学、行业动态等。
    特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。
    发表评论 打印  刷新     关闭