#region --------------------发送邮件-----------------------
#region --------------------发送邮件,测试成功过-----------------------
/// <summary>
/// 发送邮件
/// </summary>
///<param name="to">收件人邮件地址</param>
/// <param name="from">发件人邮件地址</param>
/// <param name="subject">邮件主题</param>
/// <param name="body">邮件内容</param>
/// <param name="username">登录smtp主机时用到的用户名,注意是邮件地址'@'以前的部分</param>
/// <param name="password">登录smtp主机时用到的用户密码</param>
/// <param name="server">发送邮件用到的smtp主机</param>
public void Send(string from, string[] to, string subject, string body, string server, string username, string pwd)
{
try
{
foreach (string var in to)
{
MailAddress mailform = new MailAddress(from);
MailAddress mailto = new MailAddress(var);
MailMessage mail = new MailMessage(mailform, mailto);
mail.IsBodyHtml = true;
mail.Body = body;
mail.Subject = subject;
SmtpClient sclient = new SmtpClient(server);
sclient.Credentials = new NetworkCredential(username, pwd);
sclient.Send(mail);
}
}
catch (Exception ex)
{
throw ex;
}
}
#endregion
/// <summary>
/// smtp方式发邮件
/// </summary>
/// <param name="m_from">发件人</param>
/// <param name="m_to">收件人多个以,分开</param>
/// <param name="m_cc_to">抄送人</param>
/// <param name="m_subject">邮件标题</param>
/// <param name="m_body">邮件内容</param>
public void SendMail(string m_from, string m_to, string m_cc_to, string m_subject, string m_body)
{
SmtpClient _smtpClient = new SmtpClient();
_smtpClient.Host = host;
_smtpClient.Credentials = new NetworkCredential(userName, password);
MailMessage message = new MailMessage();
message.From = new MailAddress(m_from);
try
{
string[] m_tos = m_to.Split(',');
for (int i = 0; i < m_tos.Length; i++)
{
message.To.Add(new MailAddress(m_tos[i])); // the email you want to send email to
}
if (!string.IsNullOrEmpty(m_cc_to))
{
string[] m_ccs = m_cc_to.Split(',');
for (int i = 0; i < m_ccs.Length; i++)
{
message.CC.Add(new MailAddress(m_ccs[i])); // the email you want to CC email to
}
}
message.Subject = m_subject;
message.IsBodyHtml = true;
message.BodyEncoding = System.Text.Encoding.UTF8;
message.Body = m_body;
message.Priority = MailPriority.High;
//object userState = message;
_smtpClient.Send(message);
}
catch
{
}
}
/// <summary>
/// 发邮件
/// </summary>
/// <param name="m_from">来自</param>
/// <param name="m_to">发送到</param>
/// <param name="m_title">标题</param>
/// <param name="m_body">内容</param>
/// <returns></returns>
public static void SendMail(string m_from, string m_to, string m_title, string m_body)
{
string[] sIpList = DnsRecord.GetMXRecords(m_to.Substring(m_to.IndexOf("@") + 1));
if (sIpList.Length < 1)
{
throw new Exception("找不到邮箱的mx记录");
}
string MxHost = System.Net.Dns.GetHostAddresses(sIpList[new Random().Next(0, sIpList.Length)])[0].ToString();
MailContent EMail = new MailContent();
EMail.toAddress = m_to;
EMail.toNickname = m_to;
EMail.fromAddress = m_from;
EMail.fromNickname = m_from;
EMail.title = m_title;
EMail.body = m_body;
EMail.attachmentList = new string[0];
#region 邮件格式化为标准的内容行
string splitline = "======NoSmtpSender_7Aurora_lizhiping======";
string MailHeader = string.Format("charset: utf-8;\r\nDate: {0}\r\n", DateTime.Now.ToString("R", System.Globalization.DateTimeFormatInfo.InvariantInfo))
+ string.Format("From: \"{0}\" <{1}>\r\n", EMail.fromAddress, EMail.fromAddress)
+ string.Format("To: \"{0}\" <{1}>\r\n", EMail.toAddress, EMail.toAddress)
+ string.Format("Subject: {0}\r\n", EMail.title)
+ string.Format("X-mailer: NoSmtpSender 1,0,0,0 [{0}]\r\n", "7Aurora")
+ string.Format("MIME-Version: 1.0\r\n")
+ string.Format("Content-Type: multipart/alternative;\r\n\tBoundary=\"{0}\"\r\n", splitline)
+ string.Format("Content-Transfer-Encoding: 8Bit\r\n")
+ string.Format("\r\nThis is a multi-part message in MIME format.\r\n");
string MailContent = string.Format("\r\n--{0}\r\n", splitline)
+ string.Format("Content-Type: {0};\r\n\tCharset={1}\r\n", "text/html", "gb2312")
+ string.Format("Content-Transfer-Encoding: {0}\r\n", "base64")
+ string.Format("\r\n{0}\r\n", Convert.ToBase64String(Encoding.Default.GetBytes(EMail.body)));
string MailAttachment = "";
for (int i = 0; i < EMail.attachmentList.Length; i++)
{
MailAttachment += string.Format("\r\n--{0}\r\n", splitline)
+ string.Format("Content-Type:application/octet-stream;\r\n\tName=\"{0}\"\r\n", Path.GetFileName(EMail.attachmentList[i]))
+ string.Format("Content-Transfer-Encoding: {0}\r\n", "base64")
+ string.Format("Content-Disposition: attachment;\r\n\tfilename=\"{0}\"\r\n", Path.GetFileName(EMail.attachmentList[i]))
+ string.Format("\r\n{0}\r\n", Convert.ToBase64String(File.ReadAllBytes(EMail.attachmentList[i])));
}
string MailFooter = string.Format("\r\n--{0}--\r\n", splitline)
+ "\r\n.\r\n";
#endregion
TcpClient sock = new TcpClient();
NetworkStream netStream;
sock.NoDelay = true; //不使用延时算法,以加快小数据包的发送。
sock.ReceiveTimeout = 10000; //接收超时为10秒。
sock.Connect(MxHost, 25);
netStream = sock.GetStream();
string recvString = dataReceive(netStream);
#region 发送邮件过程
if (!recvString.StartsWith("220"))
{
throw new Exception("连接邮箱服务器失败");
}
//欢迎命令
string cmd = string.Format("HELO {0}\r\n", EMail.toAddress);//mailto NickName
dataSend(netStream, cmd);
recvString = dataReceive(netStream);
if (!recvString.StartsWith("250"))
{
throw new Exception("发送欢迎命令失败");
}
//指定邮件来源命令
cmd = string.Format("MAIL FROM: <{0}>\r\n", EMail.fromAddress);
dataSend(netStream, cmd);
recvString = dataReceive(netStream);
if (!recvString.StartsWith("250"))
{
throw new Exception("指定邮件来源命令失败");
}
//指定邮件接收者命令
string[] mailList = EMail.toAddress.Split(',');
for (int i = 0; i < mailList.Length; i++)
{
cmd = string.Format("RCPT TO: <{0}>\r\n", mailList[i]);
dataSend(netStream, cmd);
recvString = dataReceive(netStream);
if (!recvString.StartsWith("250"))
{
throw new Exception("指定邮件接收者" + mailList[i] + "命令失败");
}
}
//发送邮件内容命令,返回354表示开始接受邮件内容
cmd = "Data\r\n";
dataSend(netStream, cmd);
recvString = dataReceive(netStream);
if (!recvString.StartsWith("354"))
{
throw new Exception("发送邮件内容命令失败");
}
//发送邮件内容数据
cmd = MailHeader + MailContent + MailAttachment + MailFooter;
dataSend(netStream, cmd);
recvString = dataReceive(netStream);
if (!recvString.StartsWith("250"))
{
throw new Exception("发送邮件内容数据失败");
}
//端口与邮件服务器的连接命令
cmd = "Quit\r\n";
dataSend(netStream, cmd);
recvString = dataReceive(netStream);
if (!recvString.StartsWith("221"))
{
throw new Exception("端口与邮件服务器的连接命令失败");
}
#endregion
netStream.Close();
sock.Close();
}
#region --------------------发送邮件,测试成功过-----------------------
/// <summary>
/// 发送邮件
/// </summary>
///<param name="to">收件人邮件地址</param>
/// <param name="from">发件人邮件地址</param>
/// <param name="subject">邮件主题</param>
/// <param name="body">邮件内容</param>
/// <param name="username">登录smtp主机时用到的用户名,注意是邮件地址'@'以前的部分</param>
/// <param name="password">登录smtp主机时用到的用户密码</param>
/// <param name="server">发送邮件用到的smtp主机</param>
public void Send(string from, string[] to, string subject, string body, string server, string username, string pwd)
{
try
{
foreach (string var in to)
{
MailAddress mailform = new MailAddress(from);
MailAddress mailto = new MailAddress(var);
MailMessage mail = new MailMessage(mailform, mailto);
mail.IsBodyHtml = true;
mail.Body = body;
mail.Subject = subject;
SmtpClient sclient = new SmtpClient(server);
sclient.Credentials = new NetworkCredential(username, pwd);
sclient.Send(mail);
}
}
catch (Exception ex)
{
throw ex;
}
}
#endregion
/// <summary>
/// smtp方式发邮件
/// </summary>
/// <param name="m_from">发件人</param>
/// <param name="m_to">收件人多个以,分开</param>
/// <param name="m_cc_to">抄送人</param>
/// <param name="m_subject">邮件标题</param>
/// <param name="m_body">邮件内容</param>
public void SendMail(string m_from, string m_to, string m_cc_to, string m_subject, string m_body)
{
SmtpClient _smtpClient = new SmtpClient();
_smtpClient.Host = host;
_smtpClient.Credentials = new NetworkCredential(userName, password);
MailMessage message = new MailMessage();
message.From = new MailAddress(m_from);
try
{
string[] m_tos = m_to.Split(',');
for (int i = 0; i < m_tos.Length; i++)
{
message.To.Add(new MailAddress(m_tos[i])); // the email you want to send email to
}
if (!string.IsNullOrEmpty(m_cc_to))
{
string[] m_ccs = m_cc_to.Split(',');
for (int i = 0; i < m_ccs.Length; i++)
{
message.CC.Add(new MailAddress(m_ccs[i])); // the email you want to CC email to
}
}
message.Subject = m_subject;
message.IsBodyHtml = true;
message.BodyEncoding = System.Text.Encoding.UTF8;
message.Body = m_body;
message.Priority = MailPriority.High;
//object userState = message;
_smtpClient.Send(message);
}
catch
{
}
}
/// <summary>
/// 发邮件
/// </summary>
/// <param name="m_from">来自</param>
/// <param name="m_to">发送到</param>
/// <param name="m_title">标题</param>
/// <param name="m_body">内容</param>
/// <returns></returns>
public static void SendMail(string m_from, string m_to, string m_title, string m_body)
{
string[] sIpList = DnsRecord.GetMXRecords(m_to.Substring(m_to.IndexOf("@") + 1));
if (sIpList.Length < 1)
{
throw new Exception("找不到邮箱的mx记录");
}
string MxHost = System.Net.Dns.GetHostAddresses(sIpList[new Random().Next(0, sIpList.Length)])[0].ToString();
MailContent EMail = new MailContent();
EMail.toAddress = m_to;
EMail.toNickname = m_to;
EMail.fromAddress = m_from;
EMail.fromNickname = m_from;
EMail.title = m_title;
EMail.body = m_body;
EMail.attachmentList = new string[0];
#region 邮件格式化为标准的内容行
string splitline = "======NoSmtpSender_7Aurora_lizhiping======";
string MailHeader = string.Format("charset: utf-8;\r\nDate: {0}\r\n", DateTime.Now.ToString("R", System.Globalization.DateTimeFormatInfo.InvariantInfo))
+ string.Format("From: \"{0}\" <{1}>\r\n", EMail.fromAddress, EMail.fromAddress)
+ string.Format("To: \"{0}\" <{1}>\r\n", EMail.toAddress, EMail.toAddress)
+ string.Format("Subject: {0}\r\n", EMail.title)
+ string.Format("X-mailer: NoSmtpSender 1,0,0,0 [{0}]\r\n", "7Aurora")
+ string.Format("MIME-Version: 1.0\r\n")
+ string.Format("Content-Type: multipart/alternative;\r\n\tBoundary=\"{0}\"\r\n", splitline)
+ string.Format("Content-Transfer-Encoding: 8Bit\r\n")
+ string.Format("\r\nThis is a multi-part message in MIME format.\r\n");
string MailContent = string.Format("\r\n--{0}\r\n", splitline)
+ string.Format("Content-Type: {0};\r\n\tCharset={1}\r\n", "text/html", "gb2312")
+ string.Format("Content-Transfer-Encoding: {0}\r\n", "base64")
+ string.Format("\r\n{0}\r\n", Convert.ToBase64String(Encoding.Default.GetBytes(EMail.body)));
string MailAttachment = "";
for (int i = 0; i < EMail.attachmentList.Length; i++)
{
MailAttachment += string.Format("\r\n--{0}\r\n", splitline)
+ string.Format("Content-Type:application/octet-stream;\r\n\tName=\"{0}\"\r\n", Path.GetFileName(EMail.attachmentList[i]))
+ string.Format("Content-Transfer-Encoding: {0}\r\n", "base64")
+ string.Format("Content-Disposition: attachment;\r\n\tfilename=\"{0}\"\r\n", Path.GetFileName(EMail.attachmentList[i]))
+ string.Format("\r\n{0}\r\n", Convert.ToBase64String(File.ReadAllBytes(EMail.attachmentList[i])));
}
string MailFooter = string.Format("\r\n--{0}--\r\n", splitline)
+ "\r\n.\r\n";
#endregion
TcpClient sock = new TcpClient();
NetworkStream netStream;
sock.NoDelay = true; //不使用延时算法,以加快小数据包的发送。
sock.ReceiveTimeout = 10000; //接收超时为10秒。
sock.Connect(MxHost, 25);
netStream = sock.GetStream();
string recvString = dataReceive(netStream);
#region 发送邮件过程
if (!recvString.StartsWith("220"))
{
throw new Exception("连接邮箱服务器失败");
}
//欢迎命令
string cmd = string.Format("HELO {0}\r\n", EMail.toAddress);//mailto NickName
dataSend(netStream, cmd);
recvString = dataReceive(netStream);
if (!recvString.StartsWith("250"))
{
throw new Exception("发送欢迎命令失败");
}
//指定邮件来源命令
cmd = string.Format("MAIL FROM: <{0}>\r\n", EMail.fromAddress);
dataSend(netStream, cmd);
recvString = dataReceive(netStream);
if (!recvString.StartsWith("250"))
{
throw new Exception("指定邮件来源命令失败");
}
//指定邮件接收者命令
string[] mailList = EMail.toAddress.Split(',');
for (int i = 0; i < mailList.Length; i++)
{
cmd = string.Format("RCPT TO: <{0}>\r\n", mailList[i]);
dataSend(netStream, cmd);
recvString = dataReceive(netStream);
if (!recvString.StartsWith("250"))
{
throw new Exception("指定邮件接收者" + mailList[i] + "命令失败");
}
}
//发送邮件内容命令,返回354表示开始接受邮件内容
cmd = "Data\r\n";
dataSend(netStream, cmd);
recvString = dataReceive(netStream);
if (!recvString.StartsWith("354"))
{
throw new Exception("发送邮件内容命令失败");
}
//发送邮件内容数据
cmd = MailHeader + MailContent + MailAttachment + MailFooter;
dataSend(netStream, cmd);
recvString = dataReceive(netStream);
if (!recvString.StartsWith("250"))
{
throw new Exception("发送邮件内容数据失败");
}
//端口与邮件服务器的连接命令
cmd = "Quit\r\n";
dataSend(netStream, cmd);
recvString = dataReceive(netStream);
if (!recvString.StartsWith("221"))
{
throw new Exception("端口与邮件服务器的连接命令失败");
}
#endregion
netStream.Close();
sock.Close();
}
#endregion
看注释大家就知道,第一个方法是测试成功过。后面2个方法我不记得是否成功过了,有待大家去验证。