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