颐和api

MailUtil.cs 7.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. using MailKit;
  2. using MailKit.Net.Imap;
  3. using MailKit.Net.Smtp;
  4. using MailKit.Search;
  5. using MimeKit;
  6. using System;
  7. using System.Collections.Generic;
  8. using System.IO;
  9. using System.Linq;
  10. using System.Text;
  11. using System.Threading.Tasks;
  12. namespace MadRunFabric.Common
  13. {
  14. /// <summary>
  15. /// send email
  16. /// </summary>
  17. public class MailUtil
  18. {
  19. private async static Task<bool> SendMail(MimeMessage mailMessage, MailConfig config)
  20. {
  21. try
  22. {
  23. var smtpClient = new SmtpClient();
  24. smtpClient.Timeout = 10 * 1000; //设置超时时间
  25. smtpClient.Connect(config.SMPTHost, config.Port, MailKit.Security.SecureSocketOptions.None);//连接到远程smtp服务器
  26. smtpClient.Authenticate(config.Address, config.Password);
  27. await smtpClient.SendAsync(mailMessage);//发送邮件
  28. smtpClient.Disconnect(true);
  29. return true;
  30. }
  31. catch
  32. {
  33. throw;
  34. }
  35. }
  36. /// <summary>
  37. ///发送邮件
  38. /// </summary>
  39. /// <param name="config">配置</param>
  40. /// <param name="receives">接收人</param>
  41. /// <param name="sender">发送人</param>
  42. /// <param name="subject">标题</param>
  43. /// <param name="body">内容</param>
  44. /// <param name="attachments">附件</param>
  45. /// <param name="fileName">附件名</param>
  46. /// <returns></returns>
  47. public async static Task<bool> SendMail(MailConfig config, List<string> receives, string subject, string body, List<Stream> attachmentsList = null, List<string> fileNameList = null)
  48. {
  49. var fromMailAddress = new MailboxAddress(config.Name, config.Address);
  50. var mailMessage = new MimeMessage();
  51. mailMessage.From.Add(fromMailAddress);
  52. foreach (var add in receives)
  53. {
  54. var toMailAddress = new MailboxAddress(add);
  55. mailMessage.To.Add(toMailAddress);
  56. }
  57. var bodyBuilder = new BodyBuilder() { HtmlBody = body };
  58. //附件
  59. if (attachmentsList != null && attachmentsList.Count > 0)
  60. {
  61. for (int i = 0; i < attachmentsList.Count; i++)
  62. {
  63. var fileName = fileNameList != null && fileNameList.Count > 0 ? fileNameList[i] : "";
  64. if (string.IsNullOrEmpty(fileName))
  65. {
  66. fileName = "未命名文件.txt";
  67. }
  68. var attachment = new MimePart(new ContentType("image", "png"))
  69. {
  70. Content = new MimeContent(attachmentsList[i]),
  71. ContentDisposition = new ContentDisposition(ContentDisposition.Attachment),
  72. ContentTransferEncoding = ContentEncoding.Base64,
  73. };
  74. attachment.ContentType.Parameters.Add("GB18030", "name", fileName);
  75. attachment.ContentDisposition.Parameters.Add("GB18030", "filename", fileName);
  76. bodyBuilder.Attachments.Add(attachment);
  77. }
  78. }
  79. mailMessage.Body = bodyBuilder.ToMessageBody();
  80. mailMessage.Subject = subject;
  81. return await SendMail(mailMessage, config);
  82. }
  83. /// <summary>
  84. /// 接收邮件
  85. /// </summary>
  86. /// <param name="config"></param>
  87. /// <param name="webRootPath"></param>
  88. /// <returns></returns>
  89. public async static Task<List<MailOutput>> GetMail(MailConfig config, string webRootPath)
  90. {
  91. List<MailOutput> list = new List<MailOutput>();
  92. using (var client = new ImapClient())
  93. {
  94. client.ServerCertificateValidationCallback = (s, c, h, e) => true;
  95. await client.ConnectAsync(config.IMAPHost, config.IMAPPort, true);
  96. await client.AuthenticateAsync(config.IMAPAddress, config.IMAPPassword);
  97. var inbox = client.Inbox;
  98. await inbox.OpenAsync(FolderAccess.ReadOnly);
  99. var unids = await inbox.SearchAsync(SearchQuery.NotSeen);
  100. foreach (var summary in await inbox.FetchAsync(unids, MessageSummaryItems.UniqueId | MessageSummaryItems.Envelope | MessageSummaryItems.BodyStructure))
  101. {
  102. var directory = Path.Combine(webRootPath, summary.UniqueId.ToString());
  103. if (!Directory.Exists(directory))
  104. {
  105. Directory.CreateDirectory(directory);
  106. }
  107. //邮件列表
  108. list.Add(new MailOutput
  109. {
  110. Id = summary.UniqueId.ToString(),
  111. Date = summary.Date.DateTime,
  112. Subject = summary.Envelope.Subject
  113. });
  114. //if (summary.TextBody != null)
  115. //{
  116. // // this will download *just* the text/plain part
  117. // var text = await inbox.GetBodyPartAsync(summary.UniqueId, summary.TextBody);
  118. // var part = (MimePart)text;
  119. // var fileName = "TextBody.txt";
  120. // var path = Path.Combine(directory, fileName);
  121. // using (var stream = System.IO.File.Create(path))
  122. // {
  123. // await part.Content.DecodeToAsync(stream);
  124. // }
  125. //}
  126. if (summary.HtmlBody != null)
  127. {
  128. // this will download *just* the text/html part
  129. var html = await inbox.GetBodyPartAsync(summary.UniqueId, summary.HtmlBody);
  130. var part = (MimePart)html;
  131. var fileName = "HtmlBody.txt";
  132. var path = Path.Combine(directory, fileName);
  133. using (var stream = System.IO.File.Create(path))
  134. {
  135. await part.Content.DecodeToAsync(stream);
  136. }
  137. }
  138. if (summary.Body is BodyPartMultipart)
  139. {
  140. foreach (var attachment in summary.Attachments)
  141. {
  142. // this will download *just* the attachment
  143. var entity = await inbox.GetBodyPartAsync(summary.UniqueId, attachment);
  144. if (entity is MessagePart)
  145. {
  146. var rfc822 = (MessagePart)entity;
  147. var path = Path.Combine(directory, attachment.PartSpecifier + ".eml");
  148. rfc822.Message.WriteTo(path);
  149. }
  150. else
  151. {
  152. var part = (MimePart)entity;
  153. var fileName = part.FileName;
  154. var path = Path.Combine(directory, fileName);
  155. using (var stream = System.IO.File.Create(path))
  156. {
  157. await part.Content.DecodeToAsync(stream);
  158. }
  159. }
  160. }
  161. }
  162. }
  163. await client.DisconnectAsync(true);
  164. }
  165. return list;
  166. }
  167. }
  168. }