using System; using System.Text; using System.Net; using System.Net.Mail; using System.Net.Mime; using System.Threading; using System.Reflection; using System.IO; using System.Globalization; using DSWeb.Common.DB; using System.Linq; namespace DSWeb.MvcShipping.DAL.DsSendmail { /// /// 邮件发送类 /// public class SendEmail { private MailMessage mailMessage = new MailMessage(); //实例化一个邮件类 #region 构造函数 /// /// 构造函数 /// /// 收件人地址(多个以,号分开) /// 发件人地址 /// 主题 /// 正文 public SendEmail(string toAddresses, string fromAddress, string title, string body) : this(toAddresses, fromAddress, "", "", title, body, false) { } /// /// 构造函数 /// /// 收件人地址 /// 发件人地址 /// 收件人名字 /// 发件人姓名 /// 主题 /// 正文 /// 正文是否为html格式 public SendEmail(string toAddress, string fromAddress, string toName, string fromName, string title, string body, bool isBodyHtml) { var cdc = new CommonDataContext(); if(string.IsNullOrWhiteSpace(fromAddress) || fromAddress.IndexOf("@")==-1) fromAddress = cdc.sys_param_set.FirstOrDefault(x => x.PARAMNAME == "MAILTONAME").PARAMVALUE; mailMessage.From = new MailAddress(fromAddress, fromName, Encoding.GetEncoding(936)); if (toName.Equals("")) mailMessage.To.Add(toAddress); else mailMessage.To.Add(new MailAddress(toAddress, toName, Encoding.GetEncoding(936))); mailMessage.Subject = title; mailMessage.SubjectEncoding = Encoding.GetEncoding(936); mailMessage.Body = body; mailMessage.IsBodyHtml = isBodyHtml; mailMessage.BodyEncoding = Encoding.GetEncoding(936); } #endregion /// /// 设置SMTP,并且将邮件发送出去 /// 所有参数都设置完成后再调用该方法 /// /// 发件人密码 /// SMTP服务器地址 public void SetSmtp(string password, string smtpHost) { SetSmtp(mailMessage.From.Address, password, smtpHost, 25, false, MailPriority.Normal); } /// /// 设置SMTP,并且将邮件发送出去 /// 所有参数都设置完成后再调用该方法 /// /// 发件人地址(必须为真实有效的email地址) /// 发件人密码 /// SMTP服务器地址 /// SMTP服务器的端口 /// SMTP服务器是否启用SSL加密 /// 邮件的优先级 public void SetSmtp(string address, string password, string smtpHost, int smtpPort, bool isEnableSsl, MailPriority priority) { SmtpClient smtp = new SmtpClient(smtpHost,smtpPort); // smtp.DeliveryMethod = SmtpDeliveryMethod.Network; smtp.DeliveryMethod = SmtpDeliveryMethod.Network; // smtp.UseDefaultCredentials = true; //if (isEnableSsl) //{ // smtp.UseDefaultCredentials = true; // System.Net.NetworkCredential nc = new System.Net.NetworkCredential(address, password); // smtp.Credentials = nc.GetCredential(smtpHost, smtpPort, "NTLM"); //} //else System.Net.NetworkCredential nc = new System.Net.NetworkCredential(address, password); smtp.Credentials = nc; //smtp.Credentials = new NetworkCredential(address, password); //smtp.Host = smtpHost; //smtp.Port = smtpPort; smtp.EnableSsl = isEnableSsl; // smtp.UseDefaultCredentials = true; // mailMessage.Priority = priority; try { smtp.Send(mailMessage); //发送邮件 } catch (Exception e) { smtp.Dispose(); } finally { smtp.Dispose(); } smtp.Dispose(); } public void SetSmtp() { var cdc = new CommonDataContext(); var address = cdc.sys_param_set.FirstOrDefault(x => x.PARAMNAME == "MAILTONAME").PARAMVALUE; var password = cdc.sys_param_set.FirstOrDefault(x => x.PARAMNAME == "MAILTOPASSWORD").PARAMVALUE; var smtpHost = cdc.sys_param_set.FirstOrDefault(x => x.PARAMNAME == "MAILTOSERVER").PARAMVALUE; var smtpPort = Convert.ToInt32(cdc.sys_param_set.FirstOrDefault(x => x.PARAMNAME == "MAILTOPORT").PARAMVALUE); var ISSSL_value = cdc.sys_param_set.FirstOrDefault(x => x.PARAMNAME == "MAILISSSL").PARAMVALUE.ToString() ; var ISSSL = false; if(ISSSL_value=="1") ISSSL=true; //se.SetSmtp("admin@dongshengsoft.com", "ds!@#)(*", "smtpcom.263xmail.com", 465, false, System.Net.Mail.MailPriority.Normal); //必须在所有参数设置完后调用此方法 SetSmtp(address, password, smtpHost, smtpPort, ISSSL, System.Net.Mail.MailPriority.Normal); } class Mailinfo { public SendEmail se { get; set; } public string address { get; set; } public string password { get; set; } public string smtpHost { get; set; } public int smtpPort { get; set; } public bool isEnableSsl { get; set; } public MailPriority priority { get; set; } public Mailinfo(SendEmail se, string address, string password, string smtpHost, int smtpPort, bool isEnableSsl, MailPriority priority) { this.se = se; this.address = address; this.password = password; this.smtpHost = smtpHost; this.smtpPort = smtpPort; this.isEnableSsl = isEnableSsl; this.priority = priority; } } class ThreadMail { public void FuncSend(object o) { Mailinfo Mailinfo = o as Mailinfo; Mailinfo.se.SetSmtp(Mailinfo.address, Mailinfo.password, Mailinfo.smtpHost, Mailinfo.smtpPort, Mailinfo.isEnableSsl, Mailinfo.priority); } } public void SetSmtp_thread( string address, string password, string smtpHost, int smtpPort, bool isEnableSsl, MailPriority priority) { ThreadMail tmail = new ThreadMail(); //有参调用实例方法,ParameterizedThreadStart是一个委托,input为object,返回值为void Thread thread1 = new Thread(new ParameterizedThreadStart(tmail.FuncSend)); Mailinfo mi = new Mailinfo(this, address, password, smtpHost, smtpPort, isEnableSsl, priority); thread1.Start(mi); } #region //设置邮件地址 /// /// 设置更多收件人 /// /// 收件人地址 public void SetMoreToAddress(string toAddresses) { mailMessage.To.Add(toAddresses); } /// /// 设置更多收件人 /// /// 收件人地址 /// 收件人名字 public void SetMoreToAddress(string toAddress, string toName) { mailMessage.To.Add(new MailAddress(toAddress, toName, Encoding.GetEncoding(936))); } /// /// 设置抄送者(多个以,号分开) /// /// 抄送者地址 public void SetCarbonCopyFor(string ccAddresses) { mailMessage.CC.Add(ccAddresses); } /// /// 设置抄送者 /// /// 抄送者地址 /// 抄送者名字 public void SetCarbonCopyFor(string ccAddress, string ccName) { mailMessage.Bcc.Add(new MailAddress(ccAddress, ccName, Encoding.GetEncoding(936))); } /// /// 设置密送者(多个以,号分开) /// /// 密送者 public void SetBlindCarbonCopyFor(string bccAddresses) { mailMessage.Bcc.Add(bccAddresses); } /// /// 设置密送者 /// /// 密送者 /// 密送者名字 public void SetBlindCarbonCopyFor(string bccAddress, string bccName) { mailMessage.Bcc.Add(new MailAddress(bccAddress, bccName, Encoding.GetEncoding(936))); } #endregion #region 添加附件 /// /// 添加附件(自动识别文件类型) /// /// 单个文件的路径 public void Attachments(string fileName) { mailMessage.Attachments.Add(new Attachment(fileName)); } /// /// 添加附件(默认为富文本RTF格式) /// /// 单个文件的路径 public void AttachmentsForRTF(string fileName) { mailMessage.Attachments.Add(new Attachment(fileName, MediaTypeNames.Application.Rtf)); } //public void SaveToEml(string emlFileAbsolutePath) //{ // const BindingFlags flags = BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.FlattenHierarchy; // using (MemoryStream ms = new MemoryStream()) // { //     Assembly assembly = typeof(System.Net.Mail.SmtpClient).Assembly; //     Type tMailWriter = assembly.GetType("System.Net.Mail.MailWriter"); //     object mailWriter = Activator.CreateInstance(tMailWriter, flags, null, new object[] { ms }, CultureInfo.InvariantCulture); // mailMessage.GetType().GetMethod("Send", flags).Invoke(mailMessage, new object[] { mailWriter, true }); //     File.WriteAllText(emlFileAbsolutePath, System.Text.Encoding.Default.GetString(ms.ToArray()), System.Text.Encoding.Default); // } //} public struct MailBillType { public const string 舱单 = "EDI"; public const string VGM = "VGM"; } public struct MailInfo { public const string 舱单_系统参数路径名 = "DSFTP_EDI_FTP_EDIPATH"; public const string VGM_系统参数路径名 = "DSFTP_EDI_FTP_VGMPATH"; public const string 舱单_标题头部_旧可解析 = "申请发送 "; public const string 舱单_标题头部_新 = "舱单发送-"; public const string VGM_标题头部_旧可解析 = "申请发送VGM-"; public const string VGM_标题头部_新 = "VGM发送-"; } public void SaveToEml(string emlFileAbsolutePath, string billtype) { var assembly = typeof(SmtpClient).Assembly; var mailWriterType = assembly.GetType("System.Net.Mail.MailWriter"); using (var memoryStream = new MemoryStream()) { // Get reflection info for MailWriter contructor var mailWriterContructor = mailWriterType.GetConstructor(BindingFlags.Instance | BindingFlags.NonPublic, null, new[] { typeof(Stream) }, null); // Construct MailWriter object with our FileStream var mailWriter = mailWriterContructor.Invoke(new object[] { memoryStream }); // Get reflection info for Send() method on MailMessage var sendMethod = typeof(MailMessage).GetMethod("Send", BindingFlags.Instance | BindingFlags.NonPublic); //20210622 标题 按GB2312转base64 var mailhead = ""; var ftphead = ""; if(billtype== MailBillType.舱单) { mailhead = MailInfo.舱单_标题头部_新; ftphead = MailInfo.舱单_标题头部_旧可解析; } if (billtype == MailBillType.VGM) { mailhead = MailInfo.VGM_标题头部_新; ftphead = MailInfo.VGM_标题头部_旧可解析; } string title = Convert.ToBase64String(System.Text.Encoding.GetEncoding(936).GetBytes(mailMessage.Subject.Replace(mailhead, ftphead))); var codedtitle= "=?GB2312?B?"+title+"?="; // Call method passing in MailWriter sendMethod.Invoke(mailMessage, BindingFlags.Instance | BindingFlags.NonPublic, null, new[] { mailWriter, true, true }, null); // Finally get reflection info for Close() method on our MailWriter var closeMethod = mailWriter.GetType().GetMethod("Close", BindingFlags.Instance | BindingFlags.NonPublic); // Call close method closeMethod.Invoke(mailWriter, BindingFlags.Instance | BindingFlags.NonPublic, null, new object[] { }, null); var _str = System.Text.Encoding.UTF8.GetString(memoryStream.ToArray()).Replace(mailMessage.Subject, codedtitle); File.WriteAllText(emlFileAbsolutePath, _str, System.Text.Encoding.Default); //return Encoding.ASCII.GetString(memoryStream.ToArray()); } } public MailMessage getMailMessage() { return mailMessage; } #endregion /// /// 将MailMessage保存为eml文件 /// /// 待保存的具有内容的MailMessage /// 保存后的eml文件的路径 public void SaveToEml(string emlFileAbsolutePath) { const BindingFlags flags = BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.FlattenHierarchy; using (MemoryStream ms = new MemoryStream()) { Assembly assembly = typeof(System.Net.Mail.SmtpClient).Assembly; Type tMailWriter = assembly.GetType("System.Net.Mail.MailWriter"); object mailWriter = Activator.CreateInstance(tMailWriter, flags, null, new object[] { ms }, CultureInfo.InvariantCulture); mailMessage.GetType().GetMethod("Send", flags).Invoke(mailMessage, new object[] { mailWriter, true }); File.WriteAllText(emlFileAbsolutePath, System.Text.Encoding.Default.GetString(ms.ToArray()), System.Text.Encoding.Default); } } } }