C#通用邮件发送类分享
此类的功能包括发送邮件,邮箱格式是否正确,和在不发送邮件的情况下判断邮箱用户名和密码是否正确,鉴于POP检查邮箱用户名和密码出现错误情况返回结果的延迟,用异步线程解决此问题,见代码:
usingSystem; usingSystem.Collections.Generic; usingSystem.Linq; usingSystem.Text; usingSystem.Net.Mail; usingSystem.Web; usingSystem.Net; usingSystem.Text.RegularExpressions; usingSystem.Net.Sockets; usingSystem.IO; usingSystem.Collections; usingSystem.Threading; namespaceCom.Web { ///<summary> ///邮箱类 ///</summary> publicclassCheckEmailInfo { publicstringserver{get;set;}//服务器 publicstringuser{get;set;}//用户名 publicstringpwd{get;set;}//密码 } ///<summary> ///SendEmail通用类,通过smtp服务器发送邮件 ///</summary> publicclassSendEmail { publicDictionary<string,string>smtpServer; publicDictionary<string,string>popServer; publicSendEmail() { IniSmtpServer(); IniPopServer(); } ///<summary> ///初始化常用smtpServer,用于绑定下拉选择菜单 ///</summary> privatevoidIniSmtpServer() { smtpServer=newDictionary<string,string>(); smtpServer.Add("网易163邮箱","smtp.163.com"); smtpServer.Add("网易vip.163邮箱","smtp.vip.163.com"); smtpServer.Add("网易126邮箱","smtp.126.com"); smtpServer.Add("网易188邮箱","smtp.188.com"); smtpServer.Add("新浪邮箱","smtp.sina.com"); smtpServer.Add("雅虎邮箱","smtp.mail.yahoo.com"); smtpServer.Add("搜狐邮箱","smtp.sohu.com"); smtpServer.Add("TOM邮箱","smtp.tom.com"); smtpServer.Add("Gmail邮箱","smtp.gmail.com"); smtpServer.Add("QQ邮箱","smtp.qq.com"); smtpServer.Add("QQ企业邮箱","smtp.biz.mail.qq.com"); smtpServer.Add("139邮箱","smtp.139.com"); smtpServer.Add("263邮箱","smtp.263.com"); } ///<summary> ///初始化常用popServer,用于绑定下拉选择菜单 ///</summary> privatevoidIniPopServer() { popServer=newDictionary<string,string>(); popServer.Add("网易163邮箱","pop3.163.com"); popServer.Add("网易vip.163邮箱","pop3.vip.163.com"); popServer.Add("网易126邮箱","pop3.126.com"); popServer.Add("网易188邮箱","pop3.188.com"); popServer.Add("新浪邮箱","pop3.sina.com"); popServer.Add("雅虎邮箱","pop3.mail.yahoo.com"); popServer.Add("搜狐邮箱","pop3.sohu.com"); popServer.Add("TOM邮箱","pop.tom.com"); popServer.Add("Gmail邮箱","pop.gmail.com"); popServer.Add("QQ邮箱","pop.qq.com"); popServer.Add("QQ企业邮箱","pop.biz.mail.qq.com"); popServer.Add("139邮箱","pop.139.com"); popServer.Add("263邮箱","pop.263.com"); } ///<summary> ///发送邮件功能 ///</summary> ///<paramname="fromEmail">登录邮箱</param> ///<paramname="password">登录密码</param> ///<paramname="user">邮件昵称</param> ///<paramname="title">邮件标题</param> ///<paramname="toEmail">邮件地址</param> ///<paramname="email">邮件内容</param> ///<paramname="smtpServer">smtp服务器</param> publicboolSendMessage(stringfromEmail,stringpassword,stringuser,stringtitle,stringtoEmail,stringemail,stringsmtpServer) { try { SmtpClientsmtp=newSmtpClient();//实例化一个SmtpClient smtp.DeliveryMethod=SmtpDeliveryMethod.Network;//将smtp的出站方式设为Network smtp.EnableSsl=false;//smtp服务器是否启用SSL加密 smtp.Host=smtpServer;//指定smtp服务器 smtp.Credentials=newNetworkCredential(fromEmail,password); MailMessagemm=newMailMessage();//实例化一个邮件类 mm.Priority=MailPriority.High;//邮件的优先级,分为Low,Normal,High,通常用Normal即可 mm.From=newMailAddress(fromEmail,user,Encoding.GetEncoding(936)); mm.CC.Add(newMailAddress(toEmail,"",Encoding.GetEncoding(936))); mm.Subject=title;//邮件标题 mm.SubjectEncoding=Encoding.GetEncoding(936); mm.IsBodyHtml=true;//邮件正文是否是HTML格式mm.BodyEncoding=Encoding.GetEncoding(936); mm.Body=email; smtp.Send(mm); returntrue; } catch { returnfalse; } } ///<summary> ///检查邮箱是否正确的委托 ///</summary> delegateboolMyDelegate(objectcheckEmailInfo); ///<summary> ///利用异步方式检查邮箱账号和密码是否正确 ///</summary> publicboolCheckUser(stringserver,stringuser,stringpwd) { MyDelegatemyDelegate=newMyDelegate(CheckUser); CheckEmailInfocheckEmailInfo=newCheckEmailInfo(); checkEmailInfo.server=server; checkEmailInfo.user=user; checkEmailInfo.pwd=pwd; IAsyncResultresult=myDelegate.BeginInvoke(checkEmailInfo,null,null); Thread.Sleep(1000);//主线程1秒后检查异步线程是否运行完毕 if(result.IsCompleted) {returnmyDelegate.EndInvoke(result);}//如果错误的邮箱和密码,函数将会运行很慢 else {returnfalse;} } ///<summary> ///判断用户邮箱账号和密码是否正确 ///</summary> ///<paramname="server">PopServer地址</param> ///<paramname="user">用户名</param> ///<paramname="pwd">密码</param> privateboolCheckUser(objectcheckEmailInfo) { CheckEmailInfocheckInfo=(CheckEmailInfo)checkEmailInfo; TcpClientsender=newTcpClient(checkInfo.server,110);//pop协议使用TCP的110端口 Byte[]outbytes; NetworkStreamns; StreamReadersr; stringinput; stringreaduser=string.Empty; stringreadpwd=string.Empty; try { ns=sender.GetStream(); sr=newStreamReader(ns); sr.ReadLine(); //检查用户名和密码 input="user"+checkInfo.user+"\r\n"; outbytes=Encoding.ASCII.GetBytes(input.ToCharArray()); ns.Write(outbytes,0,outbytes.Length); readuser=sr.ReadLine(); input="pass"+checkInfo.pwd+"\r\n"; outbytes=Encoding.ASCII.GetBytes(input.ToCharArray()); ns.Write(outbytes,0,outbytes.Length); readpwd=sr.ReadLine(); if(readuser.Substring(0,3)=="+OK"&&readpwd.Substring(0,3)=="+OK") {returntrue;} else {returnfalse;} } catch { returnfalse; } } ///<summary> ///判断邮箱格式是否正确 ///</summary> ///<paramname="email">邮箱地址</param> publicboolIsEmail(stringemail) { stringpaterner=@"\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*"; if(!Regex.IsMatch(email,paterner)) {returnfalse;} else {returntrue;} } } }