MailKit帮助类


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();
            }
        }
    }
时间: 2024-11-08 21:37:38

MailKit帮助类的相关文章

跨平台的.NET邮件协议MailKit组件解析

发起的.NET Core开源组织号召,进展的速度是我自己也没有想到的,很多园友都积极参与(虽然有些人诚心砸场子,要是以我以前的宝脾气,这会应该被我打住院了吧,不过幸好是少数,做一件事总有人说好,也有人说是用武汉话说"闹眼子"),.NET社区不是没有乐于共享知识的人,只是没有一个完整和良好的生态环境,总之希望国内的.NET发展越来越强大.我在这里想到一句话"我们希望自己可以做巨浪,但我们也甘愿做巨浪来袭前的小浪". 上面扯淡完毕(我这人干正事前,都要将一些扯淡的话,这

创建基于MailKit和MimeKit的.NET基础邮件服务

邮件服务是一般的系统都会拥有和需要的功能,但是对于.NET项目来说,邮件服务的创建和使用会较为的麻烦..NET对于邮件功能提供了System.Net.Mail用于创建邮件服务,该基础服务提供邮件的基础操作,并且使用也较为的简单.对于真正将该功能使用于项目的人,就会慢慢发现其中的优缺点,甚至有些时候不能忍受其中的问题.在这里介绍一种微软用于替代System.Net.Mail的邮件服务组件MailKit和MimeKit,官网地址:http://www.mimekit.net/.GitHub地址:ht

使用MailKit发送邮件

.NET Core 使用MailKit发送电子邮件 Github:关于 MailKit 很多有经验的.NET老程序员可能会说,发邮件有什么难的,十几年前我们就能用.NET Framework自带的SmtpClient发邮件了,并且.NET Core也能用.为啥还要写这篇文章? 但是,万物皆有始有终,最近我突然发现,SmtpClient 已经被微软标记为弃用: 并且微软官方钦点了一个继任者:MailKit,https://github.com/jstedfast/MailKit 这是一个基于Mim

jvm系列(一):java类的加载机制

java类的加载机制 原文:http://www.cnblogs.com/ityouknow/p/5603287.html 1.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构.类的加载的最终产品是位于堆区中的Class对象,Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口. 类加载器并不需要等到某个

iOS -- SKSpriteNode类

SKSpriteNode类 继承自 SKNode:UIResponder:NSObject 符合 NSCoding(SKNode)NSCopying(SKNode)NSObject(NSObject) 框架  /System/Library/Frameworks/SpriteKit.framework 可用性 可用于iOS 7.0或者更晚的版本 声明于 SKSpriteNode.h 参考指南 Sprite Kit Progamming Guide 概览 重要提示:这是一个初步的API或者开发技术

iOS -- SKScene类

SKScene类 继承自 SKEffectNode:SKNode:UIResponder:NSObject 符合 NSCoding(SKNode)NSCopying(SKNode)NSObject(NSObject) 框架  /System/Library/Frameworks/SpriteKit.framework 可用性 可用于iOS 7.0或者更晚的版本 声明于 SKScene.h 参考指南 Sprite Kit Progamming Guide 概览 重要提示:这是一个初步的API或者开

iOS -- SKPhysicsWorld类

SKPhysicsWorld类 继承自 NSObject 符合 NSCodingNSObject(NSObject) 框架  /System/Library/Frameworks/SpriteKit.framework 可用性 可用于iOS 7.0或者更晚的版本 声明于 SKPhysicsWorld.h 参考指南 Sprite Kit Progamming Guide 概览 重要提示:这是一个初步的API或者开发技术文档.虽然已经审阅了本文档的技术准确性,但是它不是最终的版本.本机密信息仅适用于

C#嵌套类

嵌套类顾名思义就是类或者结构中定义的类 class Container { class Nested { Nested() { } } } <1>嵌套类的默认访问权限是private ,可以指定为public,protected,private,internal,protected internal.<2>嵌套类型可以访问外部类(包裹嵌套类的类),如果要访问外部类型,要把外部类通过构造函数传进一个实例<3>嵌套类中只能访问外部类中的静态成员,不能直接访问外部类的非静态成

一个实用的C#网页抓取类代码分享

一个实用的C# 网页抓取类 模拟蜘蛛,类中定义了超多的C#采集文章.网页抓取文章的基础技巧,下面分享代码: using System; using System.Data; using System.Configuration; using System.Net; using System.IO; using System.Text; using System.Collections.Generic; using System.Text.RegularExpressions; using Sys