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

胜男Wendyguo

胜男Wendyguo

2016-02-19 21:52

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

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

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

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

              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 + "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);

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

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

  
  实现方案三:

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

展开更多 50%)
分享

猜你喜欢

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

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

通过System.Web.Mail程序发邮件

Web开发
通过System.Web.Mail程序发邮件

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

使用JMail组件代替Sql Mail发送Email

SQLServer
使用JMail组件代替Sql Mail发送Email

使用SQL Mail收发和自动处理邮件

SQLServer
使用SQL Mail收发和自动处理邮件

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

ASP发送E-MAIL

ASP
ASP发送E-MAIL

使用JMail组件代替Sql Mail发送Email 遇到的问题

Web开发
使用JMail组件代替Sql Mail发送Email 遇到的问题

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

虚拟光驱有什么妙用

虚拟光驱有什么妙用

开启小键盘的方法

开启小键盘的方法
下拉加载更多内容 ↓