Email

MailKit帮助类

https://github.com/jstedfast/MailKit

https://github.com/jstedfast/MimeKit

https://www.cnblogs.com/pengze0902/p/6562447.html

public class EmailHelp
    {
        /// <summary>
        /// Smtp服务器地址
        /// </summary>
        private static readonly string SmtpServer = ConfigurationManager.AppSettings["SmtpServer"];

        /// <summary>
        /// Pop服务器地址
        /// </summary>
        private static readonly string PopServer = ConfigurationManager.AppSettings["PopServer"];

        /// <summary>
        /// Imap服务器地址
        /// </summary>
        private static readonly string ImapServer = ConfigurationManager.AppSettings["ImapServer"];

        /// <summary>
        /// SMTP端口
        /// </summary>
        private static readonly int SmtpPort = int.Parse(ConfigurationManager.AppSettings["SmtpPort"]);

        /// <summary>
        /// POP端口
        /// </summary>
        private static readonly int PopPort = int.Parse(ConfigurationManager.AppSettings["PopPort"]);

        /// <summary>
        /// IMAP端口
        /// </summary>
        private static readonly int ImapPort = int.Parse(ConfigurationManager.AppSettings["ImapPort"]);

        /// <summary>
        /// 邮件发送
        /// </summary>
        /// <param name="mailFromAccount">发送邮箱账号</param>
        /// <param name="mailPassword">发送邮箱密码</param>
        /// <param name="message">邮件</param>
        public static void SendEmali(string mailFromAccount, string mailPassword, MimeMessage message)
        {
            using (var client = new MailKit.Net.Smtp.SmtpClient())
            {
                client.Connect(SmtpServer, SmtpPort, false);

                // Note: since we don't have an OAuth2 token, disable
                // the XOAUTH2 authentication mechanism.
                client.AuthenticationMechanisms.Remove("XOAUTH2");

                // Note: only needed if the SMTP server requires authentication
                client.Authenticate(mailFromAccount, mailPassword);
                client.Send(message);
                client.Disconnect(true);
            }
        }

        /// <summary>
        /// 创建文本消息
        /// </summary>
        /// <param name="fromAddress">发件地址</param>
        /// <param name="toAddressList">收件地址</param>
        /// <param name="title">标题</param>
        /// <param name="content">内容</param>
        /// <param name="IsPostFiles">是否将POST上传文件加为附件</param>
        /// <returns></returns>
        public static MimeMessage CreateTextMessage(MailboxAddress fromAddress, IList<MailboxAddress> toAddressList
            , string title, string content, bool IsPostFiles = false)
        {
            var message = new MimeMessage();
            message.From.Add(fromAddress);
            message.To.AddRange(toAddressList);
            message.Subject = title; //设置消息的主题

            var html = new TextPart("html")
            {
                Text = content,
            };
            var alternative = new Multipart("alternative");
            alternative.Add(html);

            var multipart = new Multipart("mixed");
            multipart.Add(alternative);
            if (IsPostFiles)
            {
                IList<MimePart> multiPartList = GetMimePartList();
                foreach (var item in multiPartList)
                {
                    multipart.Add(item);
                }
            }

            message.Body = multipart;
            return message;
        }

        /// <summary>
        /// 收邮件
        /// </summary>
        /// <param name="mailFromAccount">发送邮箱账号</param>
        /// <param name="mailPassword">发送邮箱密码</param>
        /// <param name="searchQuery">查询条件</param>
        /// <param name="folderName">文件夹名称</param>
        /// <returns></returns>
        public static IList<IMessageSummary> ReceiveEmail(string mailFromAccount, string mailPassword, string folderName, SearchQuery searchQuery = null)
        {
            //打开收件箱
            var folder = OpenFolder(mailFromAccount, mailPassword, folderName);

            //IList<OrderBy> orderByList = new List<OrderBy> { OrderBy.Date };
            //查询所有的邮件
            var uidss = folder.Search(searchQuery);

            IList<IMessageSummary> msgList = new List<IMessageSummary>();
            if (uidss.Count > 0)//判断是否查询到邮件
            {
                //获取邮件头
                msgList = folder.Fetch(uidss, MessageSummaryItems.UniqueId | MessageSummaryItems.Full);
            }

            folder.Close();
            return msgList;
        }


        /// <summary>
        /// 根据唯一号查询信件
        /// </summary>
        /// <param name="mailFromAccount">邮箱账号</param>
        /// <param name="mailPassword">邮箱密码</param>
        /// <param name="id">唯一号</param>
        /// <param name="folderName">文件夹名称</param>
        /// <returns></returns>
        public static MimeMessage GetEmailByUniqueId(string mailFromAccount, string mailPassword, uint id, string folderName)
        {
            //打开收件箱
            var folder = OpenFolder(mailFromAccount, mailPassword, folderName);
            UniqueId emailUniqueId = new UniqueId(id);
            MimeMessage message = folder.GetMessage(emailUniqueId);
            /*将邮件设为已读*/
            MessageFlags flags = MessageFlags.Seen;
            folder.SetFlags(emailUniqueId, flags, true);
            return message;
        }

        /// <summary>
        /// 读取上传的文件
        /// </summary>
        /// <returns></returns>
        public static IList<MimePart> GetMimePartList()
        {
            IList<MimePart> mimePartList = new List<MimePart>();
            var current = HttpContext.Current;
            if (current != null)
            {
                HttpRequest request = current.Request;
                HttpFileCollection files = request.Files;
                int filesCount = files.Count;
                for (int i = 0; i < filesCount; i++)
                {
                    HttpPostedFile item = files[i];
                    MimePart attachment = new MimePart(item.ContentType)
                    {
                        ContentObject = new ContentObject(item.InputStream, ContentEncoding.Default),
                        ContentDisposition = new ContentDisposition(ContentDisposition.Attachment),
                        ContentTransferEncoding = ContentEncoding.Base64,
                        FileName = item.FileName
                    };

                    mimePartList.Add(attachment);
                }
            }
            return mimePartList;
        }


        /// <summary>
        /// 打开邮箱文件夹
        /// </summary>
        /// <param name="mailFromAccount">邮箱账号</param>
        /// <param name="mailPassword">邮箱密码</param>
        /// <param name="folderName">文件夹名称(INBOX:收件箱名称)</param>
        /// <returns></returns>
        public static IMailFolder OpenFolder(string mailFromAccount, string mailPassword, string folderName)
        {
            ImapClient client = new ImapClient();
            client.Connect(ImapServer, ImapPort);
            client.Authenticate(mailFromAccount, mailPassword);
            //获取所有文件夹
            //List<IMailFolder> mailFolderList = client.GetFolders(client.PersonalNamespaces[0]).ToList();

            var folder = client.GetFolder(folderName);

            //打开文件夹并设置为读的方式
            folder.Open(MailKit.FolderAccess.ReadWrite);
            return folder;
        }

        /// <summary>
        /// 下载邮件附件
        /// </summary>
        /// <param name="mimePart"></param>
        public static void DownFile(MimePart mimePart)
        {
            HttpContext context = HttpContext.Current;

            // 设置编码和附件格式
            context.Response.ContentType = mimePart.ContentType.ToString();
            //context.Response.ContentEncoding = Encoding.UTF8;

            context.Response.Charset = "";
            string fileName = HttpUtility.UrlEncode(mimePart.FileName, Encoding.UTF8);
            context.Response.AppendHeader("Content-Disposition",
                "attachment;filename=" + fileName);
            using (MemoryStream ms = new MemoryStream())
            {
                mimePart.ContentObject.DecodeTo(ms);
                ms.Flush();
                ms.Position = 0;
                context.Response.BinaryWrite(ms.GetBuffer());

                context.Response.End();
            }
        }
    }
View Code

http://www.mimekit.net/

MailKit正式替换了.NET的SmtpClient

SmtpClient的文档现已改成:“废弃(“SmtpClient及其相关类型设计很差,我们强烈建议使用https://github.com/jstedfast/MailKithttps://github.com/jstedfast/MimeKit替代。”)”。这是Microsoft有史以来第二次将一个.NET类正式标为被开源软件库替代。

MailKitMimeKit的创建者是Jeffrey Stedfast,InfoQ曾在2014年采访过他。在当时,它们已被认为是.NET上最全面的MIME和电子邮件库。

Newtonsoft的JSON.NET是被Microsoft接受的首个重要开源库。JSON.NET已在ASP.NET Web API中广泛使用,并被正式推荐为Web API使用的序列化类,通常可替代JavaScriptSerializer类。但是不同于SmtpClient的是,没有任何一个序列化类因此被标记为废弃。

client.Inbox.Open (FolderAccess.ReadOnly);
var uids = client.Inbox.Search (SearchQuery.SubjectContains ("HELLO_"));
if (uids.Count > 0) {
    var summaries = client.Inbox.Fetch (uids, MessageSummaryItems.Envelope);
    foreach (var summary in summaries) {
        if (summary.Envelope.Subject.StartsWith ("HELLO_"))
            return summary.Envelope.Subject;
    }
}
View Code
原文地址:https://www.cnblogs.com/zeroone/p/8433575.html