|
|
using EasyBL.WebApi.Message; using Entity.Sugar; using HtmlAgilityPack; using SqlSugar; using SqlSugar.Base; using System; using System.Collections.Generic; using System.Configuration; using System.Linq; using System.Net.Mail; using System.Text; using System.Text.RegularExpressions; using System.Web; using System.Web.Services.Protocols;
namespace EasyBL { public class MailService : ServiceBase { #region Declare Region
private string _sErrorMessages = string.Empty;
#endregion Declare Region
#region Property Region
/// <summary>
/// 組織ID
/// </summary>
public string OrgID { get; set; } = string.Empty;
/// <summary>
/// 組織ID
/// </summary>
public bool IsConfig { get; set; } = false;
/// <summary>
/// 錯誤信息
/// </summary>
public string ErrorMessages { set { _sErrorMessages += value + ";"; } get { return _sErrorMessages; } }
#endregion Property Region
public readonly EasyNet.Common.Map mailSetting = new EasyNet.Common.Map();
public MailService(string orgid, bool isconfig = false) { OrgID = orgid; IsConfig = isconfig; var array = new string[] { @"MailEncoding", "FromName", "FromEmail", "FromUserId", "FromPassword", "Server", "ServerPort", "Timeout", "SSL" }; mailSetting = Common.GetSystemSettings(OrgID, array); }
#region 郵件寄送
/// <summary>
/// 郵件寄送
/// </summary>
/// <param name="i_crm">todo: describe i_crm parameter on SendMail</param>
/// <returns></returns>
public ResponseMessage SendMail(RequestMessage i_crm) { ResponseMessage rm = null; string sMsg = null; try { do { //string sParams = _fetchString(i_crm, "Params");
var bSend = SendMail(i_crm.DATA["Params"], out sMsg);
if (sMsg != null) { break; } } while (false); rm = new SuccessResponseMessage(null, i_crm); } catch (Exception ex) { sMsg = Util.GetLastExceptionMsg(ex); LogAndSendEmail(sMsg + "Param:" + JsonToString(i_crm), ex, i_crm.ORIGID, i_crm.USERID, nameof(MailService), nameof(MailService), "SendMail(郵件寄送)", "", "", ""); } finally { if (null != sMsg) { rm = new ErrorResponseMessage(sMsg, i_crm); } } return rm; }
#endregion 郵件寄送
public bool SendMail(Object Params, out string o_sError) { var bSend = false; string sError = null; try { do { var db = SugarBase.GetIntance(); var mail = new Emails(); var dic = Params as Dictionary<string, object>;
if (!dic.ContainsKey(BLWording.EMAILTO)) { sError = "缺少必要的參數:‘" + BLWording.EMAILTO + "’"; break; }
if (!dic.ContainsKey(BLWording.MAILTEMPID) && !dic.ContainsKey(BLWording.EMAILBODY)) { sError = "缺少必要的參數:‘" + BLWording.MAILTEMPID + "’ 或 ‘" + BLWording.EMAILBODY + "’"; break; }
if (dic.ContainsKey(BLWording.EMAILBODY) && !dic.ContainsKey(BLWording.TITLE)) { sError = "如果不是配置郵件模板,‘" + BLWording.TITLE + "’是必要的參數."; break; }
if (dic.ContainsKey(BLWording.FROMUSERID) && !dic.ContainsKey(BLWording.FROMEMAIL)) { //抓取當前使用者資料
var sFromUserId = dic[BLWording.FROMUSERID].ToString(); var saUserFrom = db.UnionAll( db.Queryable<OTB_SYS_Members>().Where(it => it.Effective == "Y").Select(x => new AllUsers { OrgID = x.OrgID, MemberID = x.MemberID, MemberName = x.MemberName, Email = x.Email }), db.Queryable<OTB_CRM_Customers>().Where(it => it.Effective == "Y").Select(x => new AllUsers { OrgID = x.OrgID, MemberID = x.guid, MemberName = SqlFunc.IIF(SqlFunc.HasValue(x.CustomerCName), x.CustomerCName, x.CustomerEName), Email = x.Email })) .Where(it => it.MemberID == sFromUserId && it.OrgID == OrgID).ToList() .ToList(); if (saUserFrom.Count == 0) { sError = "發件人信息有誤"; break; } var oUserFrom = saUserFrom.First(); mail.FromUserID = oUserFrom.MemberID; mail.FromUserName = oUserFrom.MemberName; mail.FromEmail = oUserFrom.Email; }
if (dic.ContainsKey(BLWording.FROMUSERNAME) && string.IsNullOrWhiteSpace(mail.FromUserName)) { mail.FromUserName = dic[BLWording.FROMUSERNAME].ToString(); }
if (dic.ContainsKey(BLWording.FROMEMAIL) && string.IsNullOrWhiteSpace(mail.FromEmail)) { mail.FromEmail = dic[BLWording.FROMEMAIL].ToString(); }
var Tos = new List<EmailTo>(); var listTo = dic[BLWording.EMAILTO] as Object[]; var sToUserName = ""; var builder = new StringBuilder(); builder.Append(sToUserName); foreach (Object mailto in listTo) { var dicto = mailto as Dictionary<string, object>; var to = new EmailTo();
if (dicto.Keys.Contains("ToEmail")) { to.ToUserName = dicto["ToUserName"].ToString(); to.ToEmail = dicto["ToEmail"].ToString(); } else { //抓取當前使用者資料
var sToUserId = dic[BLWording.TOUSERID].ToString(); var saUserTo = db.UnionAll( db.Queryable<OTB_SYS_Members>().Where(it => it.Effective == "Y").Select(x => new AllUsers { OrgID = x.OrgID, MemberID = x.MemberID, MemberName = x.MemberName, Email = x.Email }), db.Queryable<OTB_CRM_Customers>().Where(it => it.Effective == "Y").Select(x => new AllUsers { OrgID = x.OrgID, MemberID = x.guid, MemberName = SqlFunc.IIF(SqlFunc.HasValue(x.CustomerCName), x.CustomerCName, x.CustomerEName), Email = x.Email })) .Where(it => it.MemberID == sToUserId && it.OrgID == OrgID).ToList() .ToList(); if (saUserTo.Count == 0) { break; } var oUserTo = saUserTo.First(); to.ToUserID = oUserTo.MemberID; to.ToUserName = oUserTo.MemberName; to.ToEmail = oUserTo.Email; } to.Type = (dicto["Type"] != null && dicto["Type"].ToString() != "") ? dicto["Type"].ToString() : nameof(to); builder.Append(to.ToUserName + ","); Tos.Add(to); } sToUserName = builder.ToString(); sToUserName = (sToUserName + ",").Replace(",,", ""); if (Tos.Count == 0) { sError = "收件人信息有誤"; break; } mail.EmailTo = Tos;
if (dic.ContainsKey(BLWording.EMAILBODY)) { mail.EmailBody = dic[BLWording.EMAILBODY].ToString(); } else { //獲取Email郵件格式
var sEmailTemplId = dic[BLWording.MAILTEMPID].ToString(); var oEmailTempl = new OTB_SYS_Email(); var saEmailTempl = db.Queryable<OTB_SYS_Email>() .Where(it => it.EmailID == sEmailTemplId && it.OrgID == OrgID).ToList(); if (saEmailTempl.Count == 0) { sError = "找不到對應的模板"; break; } oEmailTempl = saEmailTempl.First();
mail.EmailBody = oEmailTempl.BodyHtml; mail.Title = oEmailTempl.EmailSubject; }
if (dic.ContainsKey(BLWording.TITLE)) { mail.Title = dic[BLWording.TITLE].ToString(); }
if (dic.ContainsKey(BLWording.ATTACHMENTS)) { mail.Attachments = dic[BLWording.ATTACHMENTS] as Object[]; }
var sBaseUrl = HttpContext.Current.Request.Url.ToString().Replace(HttpContext.Current.Request.RawUrl, "");
mail.EmailBody = mail.EmailBody.Replace("{{:Url}}", sBaseUrl).Replace("{{:FromUserName}}", mail.FromUserName);
if (dic.ContainsKey(BLWording.MAILDATA)) { var dicData = dic[BLWording.MAILDATA] as Dictionary<string, object>; foreach (var key in dicData.Keys) { mail.EmailBody = mail.EmailBody.Replace("{{:" + key + "}}", dicData[key].ToString()); } mail.EmailBody = mail.EmailBody.Replace("{{:ToUserName}}", sToUserName); }
//處理需要隱藏的tr標籤
var doc = new HtmlDocument(); doc.LoadHtml(mail.EmailBody); foreach (HtmlNode NodeTb in doc.DocumentNode.SelectNodes("//tr")) { if (NodeTb.Attributes["style"] != null && NodeTb.Attributes["style"].Value.IndexOf("display:none") > -1) { NodeTb.Remove(); } } mail.EmailBody = doc.DocumentNode.OuterHtml; //總模版
bSend = MailFactory(mail, out sError); } while (false); return bSend; } catch (Exception ex) { sError = ex.Message; Logger.Error("MailService.SendMail Error:" + sError + " Params:" + JsonToString(Params), ex); return bSend; } finally { o_sError = sError; } }
public bool MailFactory(Emails i_oEmail, out string o_sError) { var bSend = false; string sError = null; try { do { var objEmail = new MailMessage(); //**寄件者信箱**
var sFromName = mailSetting["FromName"] != null ? mailSetting["FromName"].ToString() : Common.GetAppSettings("FromName").Trim(); //顯示發件人的名字代替Mail地址
var sMailFrom = mailSetting["FromEmail"] != null ? mailSetting["FromEmail"].ToString() : Common.GetAppSettings("FromEmail").Trim(); //發件人地址
sMailFrom = i_oEmail.FromEmail ?? sMailFrom; //發件人地址
sFromName = i_oEmail.FromUserName ?? sFromName; //系統郵件[請勿回覆]
var o_MailFrom = new MailAddress(sMailFrom, sFromName, Encoding.Default); objEmail.From = o_MailFrom;
//**收件者信箱**//
objEmail.To.Clear(); objEmail.CC.Clear(); objEmail.Bcc.Clear(); MailAddress o_MailTo; foreach (EmailTo _EmailTo in i_oEmail.EmailTo) { if (_EmailTo.ToEmail != "") { o_MailTo = new MailAddress(_EmailTo.ToEmail, _EmailTo.ToUserName); switch (_EmailTo.Type) { case "to": objEmail.To.Add(o_MailTo); break;
case "cc": objEmail.CC.Add(o_MailTo); break;
case "bcc": objEmail.Bcc.Add(o_MailTo); break;
default: break; } } } if (i_oEmail.Attachments != null && i_oEmail.Attachments.Length > 0) { foreach (string Attachment in i_oEmail.Attachments) { var sPath = Regex.Replace(Attachment, @"//|/", @"\"); var attachment = new Attachment(sPath);//<-這是附件部分~先用附件的物件把路徑指定進去~
objEmail.Attachments.Add(attachment); //<-郵件訊息中加入附件
} } //**信件標題**//
objEmail.Subject = i_oEmail.Title; //**信件主旨**//
objEmail.Body = i_oEmail.EmailBody;
//objEmail.Body = HttpContext.Current.Server.HtmlDecode(objEmail.Body);
objEmail.IsBodyHtml = true; //'**设置正文的编码形式.这里的设置为取系统默认编码
//objEmail.BodyEncoding = System.Text.Encoding.Default;
objEmail.BodyEncoding = Encoding.UTF8; //'**设置主题的编码形式.这里的设置为取系统默认编码
//objEmail.SubjectEncoding = System.Text.Encoding.Default;
objEmail.SubjectEncoding = Encoding.UTF8; objEmail.DeliveryNotificationOptions = DeliveryNotificationOptions.OnFailure; //**信件送出**
if (i_oEmail.IsCCSelf && i_oEmail.FromEmail != null && i_oEmail.FromEmail != "") { bSend = this.SendMailNET(objEmail); } else { bSend = this.SendMailNET_NoSelf(objEmail); } } while (false); return bSend; } catch (Exception ex) { sError = ex.Message; Logger.Error("MailService.MailFactory Error:" + sError + " Params:" + JsonToString(i_oEmail), ex); return bSend; } finally { o_sError = sError; } }
#region Definition Public Methods
#region SendMail
/// <summary>
/// 同步發送電子郵件
/// </summary>
/// <param name="o_myMessage">電子郵件</param>
[SoapRpcMethod(OneWay = true)] public void SendMail(MailMessage o_myMessage) { #region "重構在 GetEmailConfig()"
var o_myMailServer = GetEmailConfig(); //new SmtpClient(sServer);//寄件服務器地址,端口
#endregion "重構在 GetEmailConfig()"
try { object userState = o_myMailServer;
//o_myMailServer.SendCompleted += new SendCompletedEventHandler(SendCompletedCallback);
o_myMailServer.SendAsync(o_myMessage, userState); } catch (SmtpException ex) { ErrorMessages = ex.Message; Logger.Error(ex); } }
/// <summary>
/// 同步發送電子郵件組
/// </summary>
/// <param name="o_myMessage">電子郵件組</param>
[SoapRpcMethod(OneWay = true)] public void SendMail(MailMessage[] o_myMessage) { try { for (int i = 0; i <= o_myMessage.Length - 1; i++) { //Add by Alina 20131216 170 146 信件通知超連結 Star
o_myMessage[i].Body = o_myMessage[i].Body; //Add by Alina 20131216 170 146 信件通知超連結 End
SendMail(o_myMessage[i]);//發送
} } catch (SmtpException ex) { ErrorMessages = ex.Message; Logger.Error(ex); } }
#endregion SendMail
#region SendMailNET
/// <summary>
/// 同步發送電子郵件
/// </summary>
/// <param name="o_myMessage">電子郵件</param>
/// <returns></returns>
public bool SendMailNET_NoSelf(MailMessage o_myMessage) { try { Logger.Debug("發送郵件開始"); var o_myMailServer = GetEmailConfig(); //new SmtpClient(sServer);//寄件服務器地址,端口
//發送Mail
o_myMailServer.Send(o_myMessage); Logger.Debug("FormName:" + o_myMessage.From.DisplayName + ";FormMail:" + o_myMessage.From.Address); Logger.Debug("發送郵件結束"); return true; } catch (SmtpException ex) { ErrorMessages = ex.Message; Logger.Error(ex); return false; } }
/// <summary>
/// 同步發送電子郵件
/// </summary>
/// <param name="o_myMessage">電子郵件</param>
/// <returns></returns>
public bool SendMailNET(MailMessage o_myMessage) { try { Logger.Debug("發送郵件開始"); var o_myMailServer = GetEmailConfig(); //new SmtpClient(sServer);//寄件服務器地址,端口
//Add by Alina 需要把發件者的信息添加到抄送人中
var reg = new Regex(@"(\w*)(\()*"); var strFromName = o_myMessage.From.DisplayName;//人員名稱
var strFromMail = o_myMessage.From.Address;//人員Mail
var m = reg.Match(strFromName); strFromName = m.Groups[1].Value; var o_MailTo = new MailAddress(strFromMail, strFromName); o_myMessage.From = o_MailTo;//發件者的信息
o_myMessage.CC.Add(o_myMessage.From);//把發件者的信息添加到抄送人中
//發送Mail
Logger.Debug("FormName:" + o_myMessage.From.DisplayName + ";FormMail:" + o_myMessage.From.Address); o_myMailServer.Send(o_myMessage); return true; } catch (SmtpException ex) { ErrorMessages = ex.Message; Logger.Error(ex); return false; } }
/// <summary>
/// 同步發送電子郵件組
/// </summary>
/// <param name="o_myMessage">電子郵件組</param>
/// <returns></returns>
public bool SendMailNET(MailMessage[] o_myMessage) { var blOK = true; try { for (int i = 0; i <= o_myMessage.Length - 1; i++) { var blThisOK = SendMailNET(o_myMessage[i]);//發送
if (blThisOK == false) { //只記錄發送失敗的
blOK = false; } } } catch (SmtpException ex) { ErrorMessages = ex.Message; Logger.Error(ex); } return blOK; }
#endregion SendMailNET
#endregion Definition Public Methods
#region Definition Private Methods
#region "GetEmailConfig"
/// <summary>
/// 提供本類中其它公有郵件功能,取得基本smtp設定.
/// </summary>
/// <returns></returns>
private SmtpClient GetEmailConfig() { var sMailEncoding = IsConfig || mailSetting["MailEncoding"] == null ? ConfigurationManager.AppSettings["MailEncoding"].ToString().Trim() : mailSetting["MailEncoding"].ToString().Trim(); //設置字集防止亂碼
var sFromUserid = IsConfig || mailSetting["FromUserId"] == null ? ConfigurationManager.AppSettings["FromUserId"].ToString().Trim() : mailSetting["FromUserId"].ToString().Trim(); //發件人的帳號
var sFromPassword = IsConfig || mailSetting["FromPassword"] == null ? ConfigurationManager.AppSettings["FromPassword"].Trim() : mailSetting["FromPassword"].ToString(); //發件人的密碼
var sServer = IsConfig || mailSetting["Server"] == null ? ConfigurationManager.AppSettings["Server"].ToString().Trim() : mailSetting["Server"].ToString().Trim(); //發送郵件服務器的IP地址
int i32ServerPort; int.TryParse(IsConfig || mailSetting["ServerPort"] == null ? ConfigurationManager.AppSettings["ServerPort"].ToString().Trim() : mailSetting["ServerPort"].ToString().Trim(), out i32ServerPort); //發送郵件服務器的端口
int iTimeout; int.TryParse(IsConfig || mailSetting["Timeout"] == null ? ConfigurationManager.AppSettings["Timeout"].ToString().Trim() : mailSetting["Timeout"].ToString(), out iTimeout); //發送郵件超時時間
var blSSLYES = (IsConfig || mailSetting["SSL"] == null ? ConfigurationManager.AppSettings["SSL"].ToString().Trim() : mailSetting["SSL"].ToString().Trim()).Equals("true") ? true : false;//是否開啟SSL驗證
var o_myMailServer = new SmtpClient(sServer) { Host = sServer };//寄件服務器地址,端口
if (i32ServerPort != 0) { o_myMailServer.Port = i32ServerPort; } o_myMailServer.EnableSsl = blSSLYES;//是否開啟SSL驗證
//o_myMailServer.DeliveryMethod = SmtpDeliveryMethod.Network;
if (iTimeout != 0) { o_myMailServer.Timeout = iTimeout * 1000; //若郵件過大,請手動加長時間, 1000約等於1秒
} if (!sFromPassword.Equals("")) { o_myMailServer.UseDefaultCredentials = false; o_myMailServer.Credentials = new System.Net.NetworkCredential(sFromUserid, sFromPassword);//登錄會員名和密碼
} return o_myMailServer; }
#endregion "GetEmailConfig"
#endregion Definition Private Methods
#region Page Control Event
//#region SendMail
//private void test()
//{
// System.Net.Mail.MailMessage objEmail = new System.Net.Mail.MailMessage();
// //**寄件者信箱** string strMailFrom = ""; string FromName = ""; if (strMailFrom.Equals("") ==
// false) { System.Net.Mail.MailAddress o_MailFrom = new
// System.Net.Mail.MailAddress(strMailFrom, FromName, Encoding.Default); objEmail.From =
// o_MailFrom; }
// //**收件者信箱** string strMailTo = ""; if (strMailTo.Equals("") == false) {
// System.Net.Mail.MailAddress o_MailTo = new System.Net.Mail.MailAddress(strMailTo);
// objEmail.To.Add(o_MailTo); }
// //**副本收件者信箱** string strMailCC = ""; if (strMailCC.Equals("") == false) { //隱藏副本收件者信箱不為空
// objEmail.CC.Add(strMailCC); }
// //**隱藏副本收件者信箱** string strMailbcc = ""; if (strMailbcc.Equals("") == false) {
// //隱藏副本收件者信箱不為空 objEmail.Bcc.Add(strMailbcc); }
// //**信件主旨** objEmail.Subject = "信件主旨";
// //**信件主體(HTML模式)** //objEmail.HTMLbody = ""
// //**信件主體(文字模式)** objEmail.Body = "信件主體";
// //'**设置正文的编码形式.这里的设置为取系统默认编码 objEmail.BodyEncoding = System.Text.Encoding.Default;
// //'**设置主题的编码形式.这里的设置为取系统默认编码 objEmail.SubjectEncoding = System.Text.Encoding.Default;
// //'**描述Mail傳遞告知選項 // Delay:通知传送是否延迟。 // Never:从不通知。 // None:没有通知。 // OnFailure:通知传送是否失败。
// // OnSuccess:通知传送是否成功。 objEmail.DeliveryNotificationOptions = System.Net.Mail.DeliveryNotificationOptions.OnFailure;
// //**信件送出** SendMailNET(objEmail); SendMailAsync(objEmail);
//}
//#endregion
#endregion Page Control Event
}
public class Emails { public string FromOrgID { get; set; } public string FromUserID { get; set; } public string FromUserName { get; set; } public string FromEmail { get; set; } public string Title { get; set; } public string EmailBody { get; set; } public bool IsCCSelf { get; set; } public List<EmailTo> EmailTo { get; set; } public object[] Attachments { get; set; } }
public class EmailTo { public string ToUserID { get; set; } public string ToUserName { get; set; } public string ToEmail { get; set; } public string Type { get; set; } }
public class AllUsers { public string OrgID { get; set; } public string MemberID { get; set; } public string MemberName { get; set; } public string Email { get; set; } }
public class OutlookDotComMail { //string mailUser = "dd24166@outlook.com";
//string mailUserPwd = "654321zzz";
//var sender = new OutlookDotComMail(mailUser, mailUserPwd);
//sender.SendMail("john.yuan@origtek.com.cn", "Test Mail", "Hello!");
//string mailUser = "info@eurotran.com";
//string mailUserPwd = "@in27856000!";
//var sender = new OutlookDotComMail(mailUser, mailUserPwd);
//sender.SendMail("john.yuan@origtek.com.cn", "Test Mail!", "Hello!!!!");
private string _sender = ""; private string _password = "";
public OutlookDotComMail(string sender, string password) { _sender = sender; _password = password; }
public void SendMail(string recipient, string subject, string message) { //SmtpClient client = new SmtpClient("smtp-mail.outlook.com");
using (var client = new SmtpClient("smtp.office365.com") { Port = 587, DeliveryMethod = SmtpDeliveryMethod.Network, UseDefaultCredentials = false }) { var credentials = new System.Net.NetworkCredential(_sender, _password); client.EnableSsl = true; client.Credentials = credentials;
try { var mail = new MailMessage(_sender.Trim(), recipient.Trim()) { Subject = subject, Body = message }; client.Send(mail); } catch (Exception ex) { Console.WriteLine(ex.Message); throw; } } } } }
|