using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Mail;
using System.Text;
using NC.Common;
using System.Web;
using System.Text.RegularExpressions;
using System.Net.Configuration;
using System.Net;
using System.Net.Cache;
using Xhome.Mail;
using System.Windows.Forms;
using System.Runtime.Remoting.Contexts;
namespace Xhome.Mail
{
public class MDL_EMail
{
/// <summary>
/// 发件者邮箱
/// </summary>
public string From { get; set; }
/// <summary>
/// 发件者名称
/// </summary>
public string Name { get; set; }
private List<string> _mailTo = new List<string>();
/// <summary>
/// 收件人
/// </summary>
public List<string> MailTo
{
get
{
return _mailTo;
}
set
{
_mailTo = value;
}
}
private List<string> _mailCC = new List<string>();
/// <summary>
/// 抄送人
/// </summary>
public List<string> MailCC
{
get
{
return _mailCC;
}
set
{
_mailCC = value;
}
}
private List<string> _mailBcc = new List<string>();
/// <summary>
/// 暗送人
/// </summary>
public List<string> MailBcc
{
get
{
return _mailBcc;
}
set
{
_mailBcc = value;
}
}
/// <summary>
/// 主题
/// </summary>
public string Subject { get; set; }
/// <summary>
/// 正文
/// </summary>
public string Body { get; set; }
private List<string> _attachments = new List<string>();
/// <summary>
/// 附件
/// </summary>
public List<string> Attachments
{
get
{
return _attachments;
}
set
{
_attachments = value;
}
}
private MailPriority _priority = MailPriority.Normal;
/// <summary>
/// 优先级 默认为:MailPriority.Normal
/// </summary>
public MailPriority Priority
{
get
{
return _priority;
}
set
{
_priority = value;
}
}
private bool _keepAttachment = false;
/// <summary>
/// 邮件发送后是否保留附件 默认为:false 删除
/// </summary>
public bool KeepAttachment
{
get
{
return _keepAttachment;
}
set
{
_keepAttachment = value;
}
}
}
public class EMailHelper
{
#region 获取Config中的Mail参数
/// <summary>
/// 获取Mail服务器地址
/// </summary>
private static string MailServer
{
get
{
string host = "smtp.exmail.qq.com";
try
{
host = System.Configuration.ConfigurationManager.AppSettings["MailServer"] ?? "smtp.exmail.qq.com";
}
catch
{
host = "smtp.exmail.qq.com";
}
return host;
}
}
/// <summary>
/// 获取Mail服务器端口
/// </summary>
private static int MailPort
{
get
{
int port = 25;
try
{
port = Convert.ToInt32(System.Configuration.ConfigurationManager.AppSettings["MailPort"] ?? "25");
}
catch
{
port = 25;
}
return port;
}
}
/// <summary>
/// 获取登录邮件服务器的账号
/// </summary>
private static string LoginUserName
{
get
{
string loginUserName = "邮箱账号";
try
{
loginUserName = System.Configuration.ConfigurationManager.AppSettings["SendUserName"] ?? "邮箱账号";
}
catch
{
loginUserName = "邮箱账号";
}
return loginUserName;
}
}
/// <summary>
/// 获取登录邮件服务器的密码
/// </summary>
private static string Password
{
get
{
string password = "账号密码";
try
{
password = System.Configuration.ConfigurationManager.AppSettings["SendPassword"] ?? "账号密码";
}
catch
{
password = "账号密码";
}
return password;
}
}
/// <summary>
/// 是否为调试状态
/// </summary>
//private static string IsTest
//{
// get
// {
// string isTest = "true";
// try
// {
// isTest = System.Configuration.ConfigurationManager.AppSettings["IsTest"] ?? "true";
// }
// catch
// {
// isTest = "true";
// }
// return isTest;
// }
//}
/// <summary>
/// 测试环境发送给特定Owner
/// </summary>
//private static string OwnerMail
//{
// get
// {
// string ownerMail = "邮箱地址";
// try
// {
// ownerMail = System.Configuration.ConfigurationManager.AppSettings["OwnerMail"] ?? "邮箱地址";
// }
// catch
// {
// ownerMail = "邮箱地址";
// }
// return ownerMail;
// }
//}
#endregion
/// <summary>
/// 发送邮件
/// </summary>
/// <param name="MailFrom">发送者邮箱</param>
/// <param name="FromName">发送者名称</param>
/// <param name="MailTo">收件人</param>
/// <param name="MailCC">抄送人</param>
/// <param name="MailBcc">暗送人</param>
/// <param name="Subject">主题</param>
/// <param name="Body">正文</param>
/// <param name="Attachments">附件</param>
/// <param name="bDelAttFile">发送完成后,是否删除附件</param>
/// <returns></returns>
public static bool SendMail(string MailFrom, string FromName, string MailTo, string MailCC, string MailBcc, string Subject, string Body, string Attachments, bool bDelAttFile = true)
{
try
{
MailAddress from = new MailAddress(MailFrom, FromName); //邮件的发件人
MailMessage mail = new MailMessage();
//设置邮件的标题
mail.Subject = Subject;
//设置邮件的发件人
//Pass:如果不想显示自己的邮箱地址,这里可以填符合mail格式的任意名称,真正发mail的用户不在这里设定,这个仅仅只做显示用
mail.From = from;
//设置邮件的收件人
//string address = "";
//string displayName = "";
/*
这里这样写是因为可能发给多个联系人,每个地址用 ; 号隔开
一般从地址簿中直接选择联系人的时候格式都会是 :用户名1 < mail1 >; 用户名2 < mail 2>;
因此就有了下面一段逻辑不太好的代码
如果永远都只需要发给一个收件人那么就简单了 mail.To.Add("收件人mail");*/
int at_index = 0;
string displayName = "";
string[] mailNames = MailTo.Split(';');
foreach (string address in mailNames)
{
if (address != string.Empty)
{
at_index = address.IndexOf("@");
displayName = address.Substring(0, at_index);
mail.To.Add(new MailAddress(address, displayName));
}
}
//设置邮件的抄送收件人
//这个就简单多了,如果不想快点下岗重要文件还是CC一份给领导比较好
//mail.CC.Add(new MailAddress("邮箱地址", "尊敬的领导"));
string[] MailCCNames = MailCC.Split(';');
foreach (string address in MailCCNames)
{
if (address != string.Empty)
{
at_index = address.IndexOf("@");
displayName = address.Substring(0, at_index);
mail.CC.Add(new MailAddress(address, displayName));
}
}
//密送
string[] MailBccNames = MailBcc.Split(';');
foreach (string address in MailBccNames)
{
if (address != string.Empty)
{
at_index = address.IndexOf("@");
displayName = address.Substring(0, at_index);
mail.Bcc.Add(new MailAddress(address, displayName));
}
}
//设置邮件的内容
mail.Body = Body;//txtBody.Text;
//设置邮件的格式
mail.BodyEncoding = System.Text.Encoding.UTF8;
mail.IsBodyHtml = true;
//设置邮件的发送级别
mail.Priority = MailPriority.Normal;
//设置邮件的附件,将在客户端选择的附件先上传到服务器保存一个,然后加入到mail中
/*
string fileName = txtUpFile.PostedFile.FileName.Trim();
fileName = "D:/UpFile/" + fileName.Substring(fileName.LastIndexOf("/") + 1);
txtUpFile.PostedFile.SaveAs(fileName); // 将文件保存至服务器
*/
string[] files = Attachments.Split(';');
foreach (string file in files)
{
if (file != string.Empty)
{
mail.Attachments.Add(new Attachment(file));
}
}
//mail.DeliveryNotificationOptions = DeliveryNotificationOptions.OnSuccess;
mail.DeliveryNotificationOptions = DeliveryNotificationOptions.OnFailure;
SmtpClient client = new SmtpClient();
//设置用于 SMTP 事务的主机的名称,填IP地址也可以了
client.Host = MailServer;// "10.3.3.42";
//设置用于 SMTP 事务的端口,默认的是 25
if (MailPort != 0)
{
client.Port = MailPort;
}
client.UseDefaultCredentials = false;
//这里才是真正的邮箱登陆名和密码,比如我的邮箱地址是 hbgx@hotmail, 我的用户名为 hbgx ,我的密码是 xgbh
client.Credentials = new System.Net.NetworkCredential(LoginUserName, Password);
client.DeliveryMethod = SmtpDeliveryMethod.Network;
//都定义完了,正式发送了,很是简单吧!
client.Send(mail);
mail.Dispose();
client.Dispose();
return true;
}
catch (Exception ex)
{
// throw new Exception("邮件发送失败:" + ex);
//NC.Components.Web.Response.OutResult(context, new MDL_MsgResult() { Success = true, Message = "删除成功" });
//Context.response.write("<script type='text/javascript'>alert('123')</script>");
return false;
}
finally
{
//邮件发完,删除附件
if (bDelAttFile && !string.IsNullOrWhiteSpace(Attachments))
{
string[] files = Attachments.Split(';');
foreach (string file in files)
{
if (string.IsNullOrWhiteSpace(file))
{
continue;
}
if (System.IO.File.Exists(file))
{
System.IO.File.Delete(file);
}
}
}
}
}
public static bool SendMail(MDL_EMail mEmail)
{
try
{
//MailAddress from = new MailAddress(MailFrom, FromName); //邮件的发件人
MailAddress from = new MailAddress(mEmail.From, mEmail.Name);
MailMessage mail = new MailMessage();
//设置邮件的标题
//mail.Subject = Subject;
mail.Subject = mEmail.Subject;
//设置邮件的发件人
//Pass:如果不想显示自己的邮箱地址,这里可以填符合mail格式的任意名称,真正发mail的用户不在这里设定,这个仅仅只做显示用
mail.From = from;
/*
这里这样写是因为可能发给多个联系人,每个地址用 ; 号隔开
一般从地址簿中直接选择联系人的时候格式都会是 :用户名1 < mail1 >; 用户名2 < mail 2>;
因此就有了下面一段逻辑不太好的代码
如果永远都只需要发给一个收件人那么就简单了 mail.To.Add("收件人mail");*/
//设置邮件的收件人
int at_index = 0;
string displayName = "";
mEmail.MailTo.ForEach(MailTo =>
{
string[] mailNames = MailTo.Split(';');
foreach (string address in mailNames)
{
if (address != string.Empty)
{
at_index = address.IndexOf("@");
displayName = address.Substring(0, at_index);
mail.To.Add(new MailAddress(address, displayName));
}
}
});
//设置邮件的抄送收件人
mEmail.MailCC.ForEach(MailCC =>
{
string[] MailCCNames = MailCC.Split(';');
foreach (string address in MailCCNames)
{
if (address != string.Empty)
{
at_index = address.IndexOf("@");
displayName = address.Substring(0, at_index);
mail.CC.Add(new MailAddress(address, displayName));
}
}
});
//密送
mEmail.MailBcc.ForEach(MailBcc =>
{
string[] MailBccNames = MailBcc.Split(';');
foreach (string address in MailBccNames)
{
if (address != string.Empty)
{
at_index = address.IndexOf("@");
displayName = address.Substring(0, at_index);
mail.Bcc.Add(new MailAddress(address, displayName));
}
}
});
//设置邮件的内容
//mail.Body = Body;
mail.Body = mEmail.Body;
//if (IsTest == "true")
//{//测试环境直接发给Owner
// string sToTmp = "";
// string sCCTmp = "";
// foreach (MailAddress mailTmp in mail.To)
// {
// sToTmp += ";" + mailTmp.Address;
// }
// foreach (MailAddress mailTmp in mail.CC)
// {
// sCCTmp += ";" + mailTmp.Address;
// }
// mail.To.Clear();
// mail.CC.Clear();
// mail.Bcc.Clear();
// string[] OwnerMailNames = OwnerMail.Split(';');
// foreach (string address in OwnerMailNames)
// {
// if (address != string.Empty)
// {
// at_index = address.IndexOf("@");
// displayName = address.Substring(0, at_index);
// mail.To.Add(new MailAddress(address, displayName));
// }
// }
// mail.Body += "<br/>TO:" + sToTmp;
// mail.Body += "<br/>CC:" + sCCTmp;
//}
//设置邮件的格式
mail.BodyEncoding = System.Text.Encoding.UTF8;
mail.IsBodyHtml = true;
//设置邮件的发送级别
//mail.Priority = MailPriority.Normal;
mail.Priority = mEmail.Priority;
//设置邮件的附件,将在客户端选择的附件先上传到服务器保存一个,然后加入到mail中
/*
string fileName = txtUpFile.PostedFile.FileName.Trim();
fileName = "D:/UpFile/" + fileName.Substring(fileName.LastIndexOf("/") + 1);
txtUpFile.PostedFile.SaveAs(fileName); // 将文件保存至服务器
*/
mEmail.Attachments.ForEach(Attachments =>
{
string[] files = Attachments.Split(';');
foreach (string file in files)
{
if (file != string.Empty)
{
mail.Attachments.Add(new Attachment(file));
}
}
});
//mail.DeliveryNotificationOptions = DeliveryNotificationOptions.OnSuccess;
mail.DeliveryNotificationOptions = DeliveryNotificationOptions.OnFailure;
SmtpClient client = new SmtpClient();
//设置用于 SMTP 事务的主机的名称,填IP地址也可以了
client.Host = MailServer;// "10.3.3.42";
//设置用于 SMTP 事务的端口,默认的是 25
if (MailPort != 0)
{
client.Port = MailPort;
}
client.UseDefaultCredentials = false;
//这里才是真正的邮箱登陆名和密码,比如我的邮箱地址是 hbgx@hotmail, 我的用户名为 hbgx ,我的密码是 xgbh
client.Credentials = new System.Net.NetworkCredential(LoginUserName, Password);
client.DeliveryMethod = SmtpDeliveryMethod.Network;
//都定义完了,正式发送了,很是简单吧!
client.Send(mail);
mail.Dispose();
client.Dispose();
return true;
}
catch (Exception ex)
{
throw ex;
//return false;
}
finally
{
//邮件发完,删除附件
if (!mEmail.KeepAttachment && mEmail.Attachments.Count > 0)
{
mEmail.Attachments.ForEach(Attachments =>
{
string[] files = Attachments.Split(';');
foreach (string file in files)
{
if (string.IsNullOrWhiteSpace(file))
{
continue;
}
if (System.IO.File.Exists(file))
{
System.IO.File.Delete(file);
}
}
});
}
}
}
public static bool SendMail(MDL_EMail mEmail, List<Attachment> listAtt)
{
try
{
//MailAddress from = new MailAddress(MailFrom, FromName); //邮件的发件人
MailAddress from = new MailAddress(mEmail.From, mEmail.Name);
MailMessage mail = new MailMessage();
//设置邮件的标题
//mail.Subject = Subject;
mail.Subject = mEmail.Subject;
//设置邮件的发件人
//Pass:如果不想显示自己的邮箱地址,这里可以填符合mail格式的任意名称,真正发mail的用户不在这里设定,这个仅仅只做显示用
mail.From = from;
/*
这里这样写是因为可能发给多个联系人,每个地址用 ; 号隔开
一般从地址簿中直接选择联系人的时候格式都会是 :用户名1 < mail1 >; 用户名2 < mail 2>;
因此就有了下面一段逻辑不太好的代码
如果永远都只需要发给一个收件人那么就简单了 mail.To.Add("收件人mail");*/
//设置邮件的收件人
int at_index = 0;
string displayName = "";
mEmail.MailTo.ForEach(MailTo =>
{
string[] mailNames = MailTo.Split(';');
foreach (string address in mailNames)
{
if (address != string.Empty)
{
at_index = address.IndexOf("@");
displayName = address.Substring(0, at_index);
mail.To.Add(new MailAddress(address, displayName));
}
}
});
//设置邮件的抄送收件人
mEmail.MailCC.ForEach(MailCC =>
{
string[] MailCCNames = MailCC.Split(';');
foreach (string address in MailCCNames)
{
if (address != string.Empty)
{
at_index = address.IndexOf("@");
displayName = address.Substring(0, at_index);
mail.CC.Add(new MailAddress(address, displayName));
}
}
});
//密送
mEmail.MailBcc.ForEach(MailBcc =>
{
string[] MailBccNames = MailBcc.Split(';');
foreach (string address in MailBccNames)
{
if (address != string.Empty)
{
at_index = address.IndexOf("@");
displayName = address.Substring(0, at_index);
mail.Bcc.Add(new MailAddress(address, displayName));
}
}
});
//设置邮件的内容
//mail.Body = Body;
mail.Body = mEmail.Body;
//if (IsTest == "true")
//{//测试环境直接发给Owner
// string sToTmp = "";
// string sCCTmp = "";
// foreach (MailAddress mailTmp in mail.To)
// {
// sToTmp += ";" + mailTmp.Address;
// }
// foreach (MailAddress mailTmp in mail.CC)
// {
// sCCTmp += ";" + mailTmp.Address;
// }
// mail.To.Clear();
// mail.CC.Clear();
// mail.Bcc.Clear();
// string[] OwnerMailNames = OwnerMail.Split(';');
// foreach (string address in OwnerMailNames)
// {
// if (address != string.Empty)
// {
// at_index = address.IndexOf("@");
// displayName = address.Substring(0, at_index);
// mail.To.Add(new MailAddress(address, displayName));
// }
// }
// mail.Body += "<br/>TO:" + sToTmp;
// mail.Body += "<br/>CC:" + sCCTmp;
//}
//设置邮件的格式
mail.BodyEncoding = System.Text.Encoding.UTF8;
mail.IsBodyHtml = true;
//设置邮件的发送级别
//mail.Priority = MailPriority.Normal;
mail.Priority = mEmail.Priority;
//设置邮件的附件,将在客户端选择的附件先上传到服务器保存一个,然后加入到mail中
/*
string fileName = txtUpFile.PostedFile.FileName.Trim();
fileName = "D:/UpFile/" + fileName.Substring(fileName.LastIndexOf("/") + 1);
txtUpFile.PostedFile.SaveAs(fileName); // 将文件保存至服务器
*/
mEmail.Attachments.ForEach(Attachments =>
{
string[] files = Attachments.Split(';');
foreach (string file in files)
{
if (file != string.Empty)
{
mail.Attachments.Add(new Attachment(file));
}
}
});
listAtt.ForEach(Attachments =>
{
mail.Attachments.Add(Attachments);
});
//mail.DeliveryNotificationOptions = DeliveryNotificationOptions.OnSuccess;
mail.DeliveryNotificationOptions = DeliveryNotificationOptions.OnFailure;
SmtpClient client = new SmtpClient();
//设置用于 SMTP 事务的主机的名称,填IP地址也可以了
client.Host = MailServer;// "10.3.3.42";
//设置用于 SMTP 事务的端口,默认的是 25
if (MailPort != 0)
{
client.Port = MailPort;
}
client.UseDefaultCredentials = false;
//这里才是真正的邮箱登陆名和密码,比如我的邮箱地址是 hbgx@hotmail, 我的用户名为 hbgx ,我的密码是 xgbh
client.Credentials = new System.Net.NetworkCredential(LoginUserName, Password);
client.DeliveryMethod = SmtpDeliveryMethod.Network;
//都定义完了,正式发送了,很是简单吧!
client.Send(mail);
mail.Dispose();
client.Dispose();
return true;
}
catch (Exception ex)
{
throw ex;
//return false;
}
finally
{
//邮件发完,删除附件
if (!mEmail.KeepAttachment && mEmail.Attachments.Count > 0)
{
mEmail.Attachments.ForEach(Attachments =>
{
string[] files = Attachments.Split(';');
foreach (string file in files)
{
if (string.IsNullOrWhiteSpace(file))
{
continue;
}
if (System.IO.File.Exists(file))
{
System.IO.File.Delete(file);
}
}
});
}
}
}
}
}
webconfig:
<!-- 邮件发送配置 -->
<add key="MailUrl" value="http://www.rigii.com/" />
<add key="SendUserName" value="邮箱地址" />
<add key="SendPassword" value="邮箱密码" />
<add key="MailServer" value="pop.exmail.qq.com" />
<add key="MailPort" value="25" />
<!-- 邮件发送配置 -->