从发送邮件所想到的

写在文章之前:好久都没写过东西了,因为有的时候好多东西baidu一下,大把大把的,所以不想写;有的时候那,看着别人写的东西,写的很NB,都是技术大N,自己不敢乱写。但是好多文章那,又是站在更高的层次,注重解决问题的结果,没有把解决问题的过程说清楚......

大纲:1. 简简单单的实现发送邮件的功能

            2. 利用web.config配置文件并对密码进行加密

            3. 在web.config配置文件中添加自定义节点. 

 一、功能实现篇

 private  string MySendMail(string MailFrom, string Pwd, string Host, string MailTo, string Subjedct, string Body, string[] Attachments)
    {
        string result = null;
        SmtpClient smtp = new SmtpClient();
        smtp.DeliveryMethod = SmtpDeliveryMethod.Network; 	//发送方式
        int index = MailFrom.IndexOf('@');
        string UserName = MailFrom.Substring(0, index);         //用户名 形如:123456
        if (!string.IsNullOrEmpty(Host))                        //邮件服务器
        {
            smtp.Host = Host;
        }
        else
        {
            string HostServer = MailFrom.Substring(index + 1, MailFrom.Length - index - 1); //126.com
            smtp.Host = "smtp." + HostServer;
        }
        smtp.UseDefaultCredentials = false;                                                              //凭证不一起发送
        smtp.Credentials = new NetworkCredential(UserName, Pwd);
        /*-------------- 邮件信息  --------------*/
        MailMessage mail = new MailMessage();
        mail.From = new MailAddress(MailFrom);                                                          //发件人地址
        mail.To.Add(MailTo);                                                                            //收件人地址
        mail.Subject = Subjedct;                                                                        //主题
        mail.Body = Body;                                                                               //内容
        mail.BodyEncoding = Encoding.UTF8;                                                              //编码方式
        mail.IsBodyHtml = true;                                                                         //设置body为html格式
        mail.Priority = MailPriority.High;                                                              //优先级
        if (Attachments != null)                                                                        //附件
        {
            foreach (string att in Attachments)
            {
                mail.Attachments.Add(new Attachment   (att,   System.Net.Mime.MediaTypeNames.Application.Octet));
            }
        }
        try
        {
            smtp.Send(mail);
            result = "发送成功!";
        }
        catch (Exception e)
        {
            result = e.Message;
        }
        return result;
    }

 【当然,上面的代码baidu一下,大把大把的,以上代码完全可以实现功能,但是不想仅仅停留在实现功能的层次上..】

然后在webconfig中添加节点如下(方便根据项目的移植可自行修改邮件的发送者)

 <appSettings>
    <add key="mialFrom" value="123456@126.com"/>
    <add key="passWord" value="123456"/>
 </appSettings>

需要的时候调用即可,形如:

 MySendMail(ConfigurationManager.AppSettings["mailFrom"].ToString(), ConfigurationManager.AppSettings["passWord"].ToString(), null, liu554218450@126.com, "主题", “内容”, null) 

   【 当然上面的代码很容易就实现了发邮件的功能,当时细心的你会发现,这个passWord直接就写在这里是不是太不好了,密码嘛,密文比较好吧,就是加密的一下吧】

 


二、密码加密篇

 

  当然了,加密,解密,需要一个加解密方法吧,那就新建个类吧,DESEncrypt(该类主要实现加解密算法...)

   public class DESEncrypt
    {
        public DESEncrypt()
        {
        }
         public static string Encrypt(string Text, string sKey) //加密
         {
             // 加密代码略...
          }
           public static string Decrypt(string Text, string sKey) //解密
           {
                // 揭秘代码略...
           }
    
    }

实现加解密,肯定需要开关了(就是bool类型了)

那就在webconfig中加个在加一个key吧,修改webconfig如下。 (encrypt --加密的意思)

 <appSettings>
    <add key="mialFrom" value="123456@126.com"/>
    <add key="passWord" value="576672F92FB5DD33"/>

    <add key="encrypt" value="true"/> 
 </appSettings>

那就获得密码吧,如何获得密码呀,“获得”-----这个东西不就是get嘛,自然我们就想到了属性...

添加类Myclass (该类目前暂时是为了得到密码)

public class MyClass 
{
        /// <summary>
        /// 得到密码
        /// </summary>
        public static string PassWord 
        {           
            get 
            {
                string _encrypt= ConfigurationManager.AppSettings["passWord"];       
                string encrypt= ConfigurationManager.AppSettings["encrypt"];
                if (encrypt== "true")
                {
                    _encrypt= DESEncrypt.Decrypt(_encrypt); 
                }
                return _encrypt; 
            }
        }
}


修改之后,调用的时候如下:

 MySendMail(MyClass .PassWord,ConfigurationManager.AppSettings["passWord"].ToString(), null, liu554218450@126.com, "主题", “内容”, null) 

【当然到这里,密码加密也实现了,但是总感觉这样不太好,在 <appSettings> </appSettings>这个里面加了这么多东西,如果我项目中,需要上传附件了,需要限制大小格式,岂不是这个里面就像下面这样了...

 <appSettings>
    <add key="MaxAllowUploadFileSize" value="256000"/>
    <add key="AllowUploadFileType" value="doc|docx|rar|xls|xlsx|txt"/>  
    <add key="mialFrom" value="123456@126.com"/> 
    <add key="passWord" value="576672F92FB5DD33"/>
    <add key="encrypt" value="true"/> 
 </appSettings>

更何况我这个encrypt仅仅是对passWord进行加密的,能不能把他们写在一起,放在webconfig单独的节点那,可不可以在webconfig中添加自己的节点那?


三、添加自定义节点篇

 学过xml的都知道,如果我们需要限定格式时,我们会用到DTD或者schema就行格式的限制,当然了ms的web.config东西,能让我们随便加节点,但是面向对象嘛,可定能扩展吗,继承吧,呵呵,如果自行添加节点那就实现IConfigurationSectionHandler接口 或者 继承 ConfigurationSection 类

(实现IConfigurationSectionHandler接口添加自定义节点,baidu一下大把大把的,这里就不再累赘了......)

添加自定义节点类:ConfigSection (该类中包含两个类,MyWebSection-- MyWebj配置节类,MailElement---Mail元素类)

 

 public class MyWebSection : ConfigurationSection //MyWeb配置节
    {
        [ConfigurationProperty("mail", IsRequired = true)]
        public MailElement Mail //属性
        {
            get { return (MailElement)base["mail"]; }
        }
    }
    public class MailElement : ConfigurationElement  //Mail元素
    {
        [ConfigurationProperty("mailFrom", IsRequired = true)]
        public string MailFrom
        {
            get { return (string)base["mailFrom"]; }
            set { base["mailFrom"] = value; }
        }
        [ConfigurationProperty("passWord", IsRequired = true)]
        public string PassWord
        {
            get { return (string)base["passWord"]; }
            set { base["passWord"] = value; }
        }
        [ConfigurationProperty("host")]
        public string Host
        {
            get { return (string)base["host"]; }
            set { base["host"] = value; }
        }
        [ConfigurationProperty("encrypt",IsRequired=true)]  
        public bool Encrypt
        {
            get { return (bool)base["encrypt"]; }
            set { base["encrypt"] = value; }
        }
    }

对于上面的代码,可能一下不是很适应,对应于webconfig 中如下:

 <myWeb>   <!-- 这个就是上面的MyWebSection类 -->
      <mail mailFrom="liu554218450@163.com" passWord="6135DF01C6D012B1246936CCBF9D25E1"   encrypt="true"/> <!-- 这个就是MailElement -->
    </myWeb>

这样就方便理解了吧 (注意里面的base关键字,我想这个地方也是个应该思考的地方吧,比如它基类中为什么要这样设计,为什么需要这个base,它这个类与类之间为什么是这种关系,它又具体是那种设计模式的实现.....太多太多了,呵呵,偏离主题了,继续说添加配置节的问题)

那就需要对Myclass 类进行修改了,修改后如下:

public class MyClass
{
    private readonly  static  MyWebSection Section = (MyWebSection)WebConfigurationManager.GetSection("myWeb");
    private  string mailFrom = Section.Mail.MailFrom;
    private string  passWord = Section.Mail.Encrypt ? DESEncrypt.Decrypt(Section.Mail.PassWord) : Section.Mail.PassWord;
    string _mailTo;
    string _subject;
    string _body;
    string[] _attachments;

    public MyClass(string MailTo, string Subjedct, string Body, string[] Attachments)
    {       
        this._mailTo = MailTo;
        this._subject = Subjedct;
        this._body = Body;
        this._attachments = Attachments;
    }
    public string MysendMail()
    {
        return MySendMail(_mailFrom, _passWord, null, _mailTo, _subject, _body, _attachments);
    }
     private  string MySendMail(string MailFrom, string Pwd, string Host, string MailTo, string Subjedct, string Body, string[] Attachments)
    {
       //代码已在上面进行实现....
    }
}


发送邮件的地方调用如下:

   protected void BtnSend_Click(object sender, EventArgs e)  //发送邮件
    {
        //下面的这个地方感觉设计的有点乱,败笔之处(自己的OOA和OOD及OOP还是不行...,汗颜!!)
        MyClass my = new MyClass(this.TxtMailTo.Text, this.TxtSubject.Text, this.TxtBody.Text + "<br/>" + this.TxtName.Text, null);
        string msg = my.MysendMail();
        ClientScript.RegisterStartupScript(this.GetType(), "msg", "<script>alert('"+msg +"')</script>");        
    }

【结束语】

这是写的第一篇技术贴,本来想由浅入深,步步解释,可发现自己天资太差,欠缺之处太多,怕误导别人.....

曾想把自己的点点滴滴积累下来,然后给以后接触asp.net的人用,防止他人走更多的弯.然后慢慢积累,开发个控件什么的,供大家使用,也不枉做起程序员这个职业。看过别人写的东西,条例清楚,逻辑严谨,分析透彻,自己望尘莫及.......只有点滴积累

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值