using MailKit; using MailKit.Net.Imap; using MailKit.Net.Smtp; using MailKit.Search; using MimeKit; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; namespace MadRunFabric.Common { /// /// send email /// public class MailUtil { private async static Task SendMail(MimeMessage mailMessage, MailConfig config) { try { var smtpClient = new SmtpClient(); smtpClient.Timeout = 10 * 1000; //设置超时时间 smtpClient.Connect(config.SMPTHost, config.Port, MailKit.Security.SecureSocketOptions.None);//连接到远程smtp服务器 smtpClient.Authenticate(config.Address, config.Password); await smtpClient.SendAsync(mailMessage);//发送邮件 smtpClient.Disconnect(true); return true; } catch { throw; } } /// ///发送邮件 /// /// 配置 /// 接收人 /// 发送人 /// 标题 /// 内容 /// 附件 /// 附件名 /// public async static Task SendMail(MailConfig config, List receives, string subject, string body, List attachmentsList = null, List fileNameList = null) { var fromMailAddress = new MailboxAddress(config.Name, config.Address); var mailMessage = new MimeMessage(); mailMessage.From.Add(fromMailAddress); foreach (var add in receives) { var toMailAddress = new MailboxAddress(add); mailMessage.To.Add(toMailAddress); } var bodyBuilder = new BodyBuilder() { HtmlBody = body }; //附件 if (attachmentsList != null && attachmentsList.Count > 0) { for (int i = 0; i < attachmentsList.Count; i++) { var fileName = fileNameList != null && fileNameList.Count > 0 ? fileNameList[i] : ""; if (string.IsNullOrEmpty(fileName)) { fileName = "未命名文件.txt"; } var attachment = new MimePart(new ContentType("image", "png")) { Content = new MimeContent(attachmentsList[i]), ContentDisposition = new ContentDisposition(ContentDisposition.Attachment), ContentTransferEncoding = ContentEncoding.Base64, }; attachment.ContentType.Parameters.Add("GB18030", "name", fileName); attachment.ContentDisposition.Parameters.Add("GB18030", "filename", fileName); bodyBuilder.Attachments.Add(attachment); } } mailMessage.Body = bodyBuilder.ToMessageBody(); mailMessage.Subject = subject; return await SendMail(mailMessage, config); } /// /// 接收邮件 /// /// /// /// public async static Task> GetMail(MailConfig config, string webRootPath) { List list = new List(); using (var client = new ImapClient()) { client.ServerCertificateValidationCallback = (s, c, h, e) => true; await client.ConnectAsync(config.IMAPHost, config.IMAPPort, true); await client.AuthenticateAsync(config.IMAPAddress, config.IMAPPassword); var inbox = client.Inbox; await inbox.OpenAsync(FolderAccess.ReadOnly); var unids = await inbox.SearchAsync(SearchQuery.NotSeen); foreach (var summary in await inbox.FetchAsync(unids, MessageSummaryItems.UniqueId | MessageSummaryItems.Envelope | MessageSummaryItems.BodyStructure)) { var directory = Path.Combine(webRootPath, summary.UniqueId.ToString()); if (!Directory.Exists(directory)) { Directory.CreateDirectory(directory); } //邮件列表 list.Add(new MailOutput { Id = summary.UniqueId.ToString(), Date = summary.Date.DateTime, Subject = summary.Envelope.Subject }); //if (summary.TextBody != null) //{ // // this will download *just* the text/plain part // var text = await inbox.GetBodyPartAsync(summary.UniqueId, summary.TextBody); // var part = (MimePart)text; // var fileName = "TextBody.txt"; // var path = Path.Combine(directory, fileName); // using (var stream = System.IO.File.Create(path)) // { // await part.Content.DecodeToAsync(stream); // } //} if (summary.HtmlBody != null) { // this will download *just* the text/html part var html = await inbox.GetBodyPartAsync(summary.UniqueId, summary.HtmlBody); var part = (MimePart)html; var fileName = "HtmlBody.txt"; var path = Path.Combine(directory, fileName); using (var stream = System.IO.File.Create(path)) { await part.Content.DecodeToAsync(stream); } } if (summary.Body is BodyPartMultipart) { foreach (var attachment in summary.Attachments) { // this will download *just* the attachment var entity = await inbox.GetBodyPartAsync(summary.UniqueId, attachment); if (entity is MessagePart) { var rfc822 = (MessagePart)entity; var path = Path.Combine(directory, attachment.PartSpecifier + ".eml"); rfc822.Message.WriteTo(path); } else { var part = (MimePart)entity; var fileName = part.FileName; var path = Path.Combine(directory, fileName); using (var stream = System.IO.File.Create(path)) { await part.Content.DecodeToAsync(stream); } } } } } await client.DisconnectAsync(true); } return list; } } }