写在文章之前:好久都没写过东西了,因为有的时候好多东西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的人用,防止他人走更多的弯.然后慢慢积累,开发个控件什么的,供大家使用,也不枉做起程序员这个职业。看过别人写的东西,条例清楚,逻辑严谨,分析透彻,自己望尘莫及.......只有点滴积累