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

2016-02-19 21:52 62 1 收藏

下面图老师小编跟大家分享.NET 1.1 下不使用 System.Web.Mail.SmtpMail 发送邮件的其它选,一起来学习下过程究竟如何进行吧!喜欢就赶紧收藏起来哦~

【 tulaoshi.com - Web开发 】

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

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/webkaifa/)

  注: 按照常理,使用前先 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 FilesMicrosoft Visual Studio .NETFrameworkSDKBinildasm.exe(可使用Visual Studio .Net 2003 命令提示),
  格式如下:tlbimp c:Program FilesDimacw3JMail4jmail.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:est.jpg",true,null);)就可以搞定了。[注]:加了附件,讲把上面的jmail.ContentType="text/html";删掉。否则会在邮件里出现乱码。
              //jmail.AddAttachment("c:est.jpg", true, null);
              //邮件内容
              jmail.Body = message.Body;

              if (message.BodyFormat == MailFormat.Html)
                  jmail.Body += "brbr";
              else
                  jmail.Body += "";

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

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

              //jmail发送的方法
              bool result = jmail.Send(smtpServer, false);

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/webkaifa/)

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

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/webkaifa/)

  实现方案二(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 + "brbr" + DateTime.Now.ToString();
              }
              else
              {
                  msg.Body = message.Body + "" + 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
      }
  }

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/webkaifa/)

  
  实现方案三:

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

来源:https://www.tulaoshi.com/n/20160219/1627341.html

延伸阅读
标签: PHP
由于PHP没有提供现成的smtp函数,却提供了一个功能不甚灵活的mail()函数,这个函数需要服务器配置上的支持,并且不支持smtp验证,在很多场合无法正常的工作,因此不建议使用。本文的目的在于为新手指明方向,并没有涉及那些高级的内容,一来本身水平有限,二来也担心不能准确的讲述相关的概念,进而对各位造成误导,还请自行深入学习。 “...
标签: 电脑入门
MAC用户可以在 Mail 中便捷的查看邮件,不过如果用户们想知道邮件在电脑的位置,该怎么在做呢?今天图老师小编就和大家分享一个简单的方法吧。 解决方法: 在 Mail 中执行搜索会得到一个结果列表,如果想查看一封邮件的存储位置,可以将其选中,然后点击右上角的「在邮箱中显示」链接。 这样会打开所在邮箱,但是搜索结果也会随之消失...
标签: SQLServer
  使用SQL Mail收发和自动处理邮件中的扩展存储过程简介 SQL SERVER提供了通过EXCHANGE或OUTLOOK收发邮件的扩展存储过程,下面将这几个过程简单的介绍一下。 一、启动SQL Mail xp_startmail @user,@password @user和@password都是可选的 也可打开Enterprise Manager中的Support Services,在SQL Mail上单击右键打开右键菜单,然...
标签: Delphi
  接发E-mail是许多“网虫”必修的功课,E-mail工具软件也很多,国外 的有Microsoft的OutlookExpress、TheBat等,国内则有FoxMail这样的精品。 其实,利用可视化编程工具Delphi4.0也能够制作出自己的E-mail软件。 Delphi4.0有关E-mail的组件有两个:NmPOP3和NmSTMP,它们都位于Internet 选项卡上,其中,NmPOP3组件封装并实现P...
注意在VS2003下编译才可以通过. System.Web.Mail.MailMessage mail=new System.Web.Mail.MailMessage(); //定义邮件的发送地址 mail.From="aierong@126.com"; //定义邮件的接收地址 //设置以分号分隔的收件人电子邮件地址列表 mail.To="aierong@126.com"; //定义邮件的暗送地址 //设置以分号分隔的电子邮件地址列表 mail.Bcc="a@12...

经验教程

692

收藏

76
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部