SoftMail.cs 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Net.Mail;
  5. using System.Text;
  6. namespace HslCommunication.BasicFramework
  7. {
  8. /****************************************************************************
  9. *
  10. * 创建日期:2017-02-27 10:29:31
  11. * 功能:用来发送简单的邮件
  12. * 说明:使用代理的方式来实现发送邮件
  13. * 备注:静态对象直接提供了一个可供发送的163邮件和QQ邮件
  14. * 注意:网络正常时测试通过,但在中策集团内网测试,失败率非常高
  15. *
  16. ***************************************************************************/
  17. /// <summary>
  18. /// 软件的邮箱类,用于发送邮箱数据,连续发送10次失败则禁止发送
  19. /// </summary>
  20. public class SoftMail
  21. {
  22. /// <summary>
  23. /// 系统连续发送失败的次数,为了不影响系统,连续三次失败就禁止发送
  24. /// </summary>
  25. private static long SoftMailSendFailedCount { get; set; } = 0;
  26. /// <summary>
  27. /// 系统提供一个默认的163邮箱发送账号,只要更改接收地址即可发送服务,可能会被拦截
  28. /// </summary>
  29. public static SoftMail MailSystem163 = new SoftMail(
  30. mail =>
  31. {
  32. mail.Host = "smtp.163.com";//使用163的SMTP服务器发送邮件
  33. mail.UseDefaultCredentials = true;
  34. mail.EnableSsl = true;
  35. mail.Port = 25;
  36. mail.DeliveryMethod = SmtpDeliveryMethod.Network;
  37. mail.Credentials = new System.Net.NetworkCredential("softmailsendcenter", "zxcvbnm6789");//密码zxcvbnm1234
  38. },
  39. "softmailsendcenter@163.com",
  40. "hsl200909@163.com"
  41. );
  42. /// <summary>
  43. /// 系统提供一个默认的QQ邮箱发送账号,只要更改接收地址即可发送服务,发送成功概率比较高
  44. /// </summary>
  45. public static SoftMail MailSystemQQ = new SoftMail(
  46. mail =>
  47. {
  48. mail.Host = "smtp.qq.com";//使用QQ的SMTP服务器发送邮件
  49. mail.UseDefaultCredentials = true;
  50. mail.Port = 587;
  51. mail.EnableSsl = true;
  52. mail.DeliveryMethod = SmtpDeliveryMethod.Network;
  53. mail.Credentials = new System.Net.NetworkCredential("974856779", "tvnlczxdumutbbic");//密码ahvzdscexdstbdgh,tvnlczxdumutbbic
  54. },
  55. "974856779@qq.com",
  56. "hsl200909@163.com"
  57. );
  58. /// <summary>
  59. /// 实例化一个邮箱发送类,需要指定初始化信息
  60. /// </summary>
  61. /// <param name="mailIni">初始化的方法</param>
  62. /// <param name="addr_From">发送地址,应该和账户匹配</param>
  63. /// <param name="addr_to">邮件接收地址</param>
  64. public SoftMail(Action<SmtpClient> mailIni, string addr_From = "", string addr_to = "")
  65. {
  66. smtpClient = new SmtpClient();
  67. mailIni(smtpClient);
  68. MailFromAddress = addr_From;
  69. MailSendAddress = addr_to;
  70. }
  71. /// <summary>
  72. /// 系统的邮件发送客户端
  73. /// </summary>
  74. private SmtpClient smtpClient { get; set; }
  75. /// <summary>
  76. /// 发送邮件的地址
  77. /// </summary>
  78. private string MailFromAddress { get; set; } = "";
  79. /// <summary>
  80. /// 邮件发送的地址
  81. /// </summary>
  82. public string MailSendAddress { get; set; } = "";
  83. private string GetExceptionMail(Exception ex)
  84. {
  85. return $"时间:{DateTime.Now.ToString()}" +
  86. $"{Environment.NewLine}软件:{ex.Source}" +
  87. $"{Environment.NewLine}信息:{ex.Message}" +
  88. $"{Environment.NewLine}类型:{ex.GetType().ToString()}" +
  89. $"{Environment.NewLine}堆栈:{ex.StackTrace}" +
  90. $"{Environment.NewLine}方式:{ex.TargetSite.Name}";
  91. }
  92. /// <summary>
  93. /// 发生BUG至邮件地址,需要提前指定发送地址,否则失败
  94. /// </summary>
  95. /// <param name="ex">异常的BUG,同样试用兼容类型</param>
  96. /// <returns>是否发送成功,内容不正确会被视为垃圾邮件</returns>
  97. public bool SendMail(Exception ex)
  98. {
  99. return SendMail(ex, "");
  100. }
  101. /// <summary>
  102. /// 发送邮件至地址,需要提前指定发送地址,否则失败
  103. /// </summary>
  104. /// <param name="subject">邮件主题</param>
  105. /// <param name="body">邮件内容</param>
  106. /// <returns>是否发送成功,内容不正确会被视为垃圾邮件</returns>
  107. public bool SendMail(string subject, string body)
  108. {
  109. return SendMail(MailSendAddress, subject, body);
  110. }
  111. /// <summary>
  112. /// 发送邮件至地址,需要提前指定发送地址,否则失败
  113. /// </summary>
  114. /// <param name="subject">邮件主题</param>
  115. /// <param name="body">邮件内容</param>
  116. /// <param name="isHtml">是否是html格式化文本</param>
  117. /// <returns>是否发送成功,内容不正确会被视为垃圾邮件</returns>
  118. public bool SendMail(string subject, string body, bool isHtml)
  119. {
  120. return SendMail(MailSendAddress, subject, body, isHtml);
  121. }
  122. /// <summary>
  123. /// 发生BUG至邮件地址,需要提前指定发送地址,否则失败
  124. /// </summary>
  125. /// <param name="ex">异常的BUG,同样试用兼容类型</param>
  126. /// <param name="addtion">额外信息</param>
  127. /// <returns>是否发送成功,内容不正确会被视为垃圾邮件</returns>
  128. public bool SendMail(Exception ex, string addtion)
  129. {
  130. if (string.IsNullOrEmpty(MailSendAddress)) return false;
  131. return SendMail(MailSendAddress, "BUG提交", string.IsNullOrEmpty(addtion) ? GetExceptionMail(ex) :
  132. $"用户:{addtion}{Environment.NewLine}" + GetExceptionMail(ex));
  133. }
  134. /// <summary>
  135. /// 发送邮件的方法,需要指定接收地址,主题及内容
  136. /// </summary>
  137. /// <param name="addr_to">接收地址</param>
  138. /// <param name="subject">邮件主题</param>
  139. /// <param name="body">邮件内容</param>
  140. /// <returns>是否发送成功,内容不正确会被视为垃圾邮件</returns>
  141. public bool SendMail(string addr_to, string subject, string body)
  142. {
  143. return SendMail(addr_to, subject, body, false);
  144. }
  145. /// <summary>
  146. /// 发送邮件的方法,默认发送别名,优先级,是否HTML
  147. /// </summary>
  148. /// <param name="addr_to">接收地址</param>
  149. /// <param name="subject">邮件主题</param>
  150. /// <param name="body">邮件内容</param>
  151. /// <param name="isHtml">是否是html格式的内容</param>
  152. /// <returns>是否发送成功,内容不正确会被视为垃圾邮件</returns>
  153. public bool SendMail(string addr_to, string subject, string body, bool isHtml)
  154. {
  155. return SendMail(MailFromAddress, "邮件发送系统", new string[] { addr_to }, subject, body, MailPriority.Normal, isHtml);
  156. }
  157. /// <summary>
  158. /// 发送邮件的方法,需要提供完整的参数信息
  159. /// </summary>
  160. /// <param name="addr_from">发送地址</param>
  161. /// <param name="name">发送别名</param>
  162. /// <param name="addr_to">接收地址</param>
  163. /// <param name="subject">邮件主题</param>
  164. /// <param name="body">邮件内容</param>
  165. /// <param name="priority">优先级</param>
  166. /// <param name="isHtml">邮件内容是否是HTML语言</param>
  167. /// <returns>发生是否成功,内容不正确会被视为垃圾邮件</returns>
  168. public bool SendMail(string addr_from, string name, string[] addr_to, string subject, string body, MailPriority priority, bool isHtml)
  169. {
  170. if (SoftMailSendFailedCount > 10) { SoftMailSendFailedCount++; return false; }
  171. using (MailMessage Message = new MailMessage())
  172. {
  173. try
  174. {
  175. Message.From = new MailAddress(addr_from, name, Encoding.UTF8);
  176. foreach (var m in addr_to)
  177. {
  178. Message.To.Add(m);
  179. }
  180. Message.Subject = subject;
  181. Message.Body = body;
  182. Message.Body += Environment.NewLine + Environment.NewLine + Environment.NewLine + "邮件服务系统自动发出,请勿回复!";
  183. Message.SubjectEncoding = Encoding.UTF8;
  184. Message.BodyEncoding = Encoding.UTF8;
  185. Message.Priority = priority;
  186. Message.IsBodyHtml = isHtml;
  187. smtpClient.Send(Message);
  188. //清空数据
  189. SoftMailSendFailedCount = 0;
  190. return true;
  191. }
  192. catch(Exception ex)
  193. {
  194. Console.WriteLine( SoftBasic.GetExceptionMessage( ex ) );
  195. SoftMailSendFailedCount++;
  196. return false;
  197. }
  198. }
  199. }
  200. }
  201. }