愚公系列2023年02月.netcore工具案例-使用mailkit使用pop3协议进行邮件读取(代码片段)

微软MVPEleven 微软MVPEleven     2023-02-23     212

关键词:

前言

1.MailKit简介

MailKit是最流行且最强大的.NET邮件处理框架之一,下面为大家简单介绍MailKit的使用方式(IMAP为例)

2.MailKit功能

  • 安全

    • SASL 身份验证

      • 支持
        CRAM-MD5、DIGEST-MD5、LOGIN、NTLM、OAUTHBEARER、PLAIN、SCRAM-SHA-1、SCRAM-SHA-256、SCRAM-SHA-512
        和 XOAUTH2 机制。
    • 支持 S/MIME v3.2。

    • 支持 OpenPGP。

    • 支持 DKIM 签名。

    • 支持 ARC 签名。

  • 短信客户端

    • 支持 SSL 和 TLS。

    • 支持 STARTTLS、SIZE、DSN、8BITMIME、pipelining、binarymime 和 SMTPUTF8 扩展。

  • POP3 客户端

    • 支持 SSL 和 TLS。

    • 支持 STLS、UIDL、PIPELINING、UTF8 和 LANG 扩展。

  • IMAP 客户端

    • 支持 SSL 和 TLS。

    • 支持 ACL、配额、文字+、空闲、命名空间、ID、子项、登录禁用、启动、多追加、取消选择、UIDPLUS、CONDSTORE、电子搜索、SASL-ID、压缩、内、启用、QRESYNC、排序、线程、注释、列表扩展、电子排序、元数据、元数据服务器、通知、过滤器、列表状态、排序=显示、特殊用途、创建特殊用途、搜索=模糊、移动、UTF8=接受、UTF8=仅、文字-、附加限制、状态=大小、对象ID、替换、保存、XLIST 和 Google Mail (X-GM-EXT-1) 扩展名。

  • MIME 解析器

    • 灵活:允许覆盖任何 MIME 类型的默认类。

    • 高性能:比市场上任何其他 .NET MIME 解析器都快。性能甚至可以与最快的C++解析器相媲美。

    • 强大:轻松处理各种损坏的 MIME 格式。

  • 所有可能阻止的API都允许通过取消令牌取消。

  • 所有执行 I/O 的 API 都有异步变体。

  • 消息的客户端排序和线程处理。

  • 支持 .NET 4.5、.NET 4.6、.NET 4.7、.NET 4.8、.NET 5.0、.NETStandard
    2.0、Xamarin.Android、Xamarin.iOS、Windows Phone 8.1 等。

Github网址:https://github.com/jstedfast/MailKit

官方网址:http://www.mimekit.net/docs/html/Introduction.htm

3.POP3协议

POP3,全名为“Post Office Protocol - Version 3”,即“邮局协议版本3”。是TCP/IP协议族中的一员,由RFC1939 定义。本协议主要用于支持使用客户端远程管理在服务器上的电子邮件。提供了SSL加密的POP3协议被称为POP3S。

POP 协议支持“离线”邮件处理。其具体过程是:邮件发送到服务器上,电子邮件客户端调用邮件客户机程序以连接服务器,并下载所有未阅读的电子邮件。这种离线访问模式是一种存储转发服务,将邮件从邮件服务器端送到个人终端机器上,一般是PC机或 MAC。一旦邮件发送到 PC 机或MAC上,邮件服务器上的邮件将会被删除。但POP3邮件服务器大都可以“只下载邮件,服务器端并不删除”,也就是改进的POP3协议。

一、使用POP3进行邮件处理

1.安装MailKit程序包

2.读取操作文件代码

using MailKit;
using MailKit.Net.Imap;
using MailKit.Net.Pop3;
using MailKit.Search;
using MailKit.Security;
using MimeKit;

namespace MailKitDemo

    /// <summary>
    /// .NET使用MailKit进行邮件处理
    /// </summary>
    class Program
    
        private const string MAIL_NAME = "2528877987@qq.com";
        private const string MAIL_PASSWORD = "XXXXXXXXXXXXXXXXXXXX";//这个不是qq密码,是开启imap时候的16位授权码
        private const string DIRECTORY = @"D:\\";
        static void Main(string[] args)
        
            using (var client = new Pop3Client())
            
                client.Connect("pop.qq.com", 110, false);
                client.Authenticate(MAIL_NAME, MAIL_PASSWORD);

                int count = client.GetMessageCount();
                for (int i = count-1; i < count; i--)
                
                    var message = client.GetMessage(i);
                    var body = message.Body;
                    var Subject = message.Subject;
                

                client.Disconnect(true);
            
        

        /// <summary>
        /// 下载邮件附件
        /// </summary>
        private static void DownloadAttachment(MimeEntity attachment)
        
            if (attachment is MessagePart)
            
                var fileName = attachment.ContentDisposition?.FileName;
                var rfc822 = (MessagePart)attachment;

                if (string.IsNullOrEmpty(fileName))
                    fileName = "attached-message.eml";

                var path = Path.Combine(DIRECTORY, fileName);
                using (var stream = File.Create(path))
                    rfc822.Message.WriteTo(stream);
            
            else
            
                var part = (MimePart)attachment;
                var fileName = part.FileName;

                var path = Path.Combine(DIRECTORY, fileName);
                using (var stream = File.Create(path))
                    part.Content.DecodeTo(stream);
            
        
    



#yyds干货盘点#愚公系列2023年03月.netcore工具案例-.netcore使用questpdf(代码片段)

前言QuestPDF是一个用于生成PDF文档的open-source.NET库。它提供了一个布局引擎,设计时考虑了完整的分页支持。文档由许多简单元素组成(例如边框、背景、图像、文本、填充、表格、网格等),这些元素组合在一起以创建更复杂... 查看详情

#yyds干货盘点#愚公系列2023年03月.netcore工具案例-stackexchange.redis代码变量方式实现商品秒杀(代码片段)

前言下面是Redis分布式锁常用的概念说明:设置、获取、过期时间、删除。1、Setnx命令:SETNXkeyvalue说明:将key的值设为value,当且仅当key不存在。若给定的key已经存在,则SETNX不做任何动作。SETNX是『SETifNoteXists』(如果不存在,则... 查看详情

愚公系列2022年12月.netcore工具案例-.netcore使用paddleocrsharp进行身份证和车牌识别(代码片段)

文章目录前言一、.NETCore使用PaddleOCRSharp进行身份证识别1.安装nueget包2.测试身份证识别3.测试车牌识别二、可在桌面直接使用的软件前言PaddleOCRSharp是一个基于百度飞桨PaddleOCR的C++代码修改并封装的.NET的OCR工具类库。包含文... 查看详情

2023年01月.netcore工具案例-.net7中的webtransport通信(代码片段)

文章目录前言1.技术背景2.QUIC相关概念3.HTTP/3.0一、WebTransport1.WebTransport概念2.WebTransport在js中的使用3.WebTransport在.NET7中的使用3.1创建项目3.2侦听HTTP/3端口3.3获取WebTransport会话3.4监听WebTransport请求4.WebTransport在JavaScript中使用4.1创建We 查看详情

#yyds干货盘点#愚公系列2023年02月.net/c#知识点-程序运行计时的总结(代码片段)

前言在分析一个程序算法时间复杂度时,可以使用统计程序或程序片段的计算时间有助于理解程序性质,许多语言或系统都提供了内部计时功能。下面主要是讲解C#中的计时方式:StopwatchDateTime.NowValueStopwatch一、程序运行计时的... 查看详情

#yyds干货盘点#愚公系列2023年02月.net/c#知识点-list转成字符串的总结(代码片段)

前言List转成字符串的总结的应用场景非常广泛,可以用于字符串拼接、数据处理和存储、显示等方面。它还可以用于格式化输出,以及将列表数据导出到文本文件等。.NET实现List转字符串的方式主要有如下:forLinqString.Join一、Lis... 查看详情

#yyds干货盘点#愚公系列2023年02月微信小程序-page页面扩展(代码片段)

前言在小程序日常开发中,有些功能是所有页面都需要使用的,所以就需要对每个page页面进行扩展,在小程序中Page的作用相当于构造函数,Page会初始化页面对象然后将配置参数中的属性merge到页面对象上。一、Page页面扩展1.组... 查看详情

#yyds干货盘点#愚公系列2023年02月.net/c#知识点-list对象去重的方法总结(代码片段)

前言数组去重其实是个很常见的面试题,比如在数据分析中,有时候因为一些原因会有重复的记录,因此需要去重。如果重复的那些行是每一列懂相同的,删除多余的行只保留相同行中的一行就可以了。其实不管前端还是后端,... 查看详情

#yyds干货盘点#愚公系列2023年02月.net/c#知识点-区块链概念和实现(代码片段)

前言区块链是一种分布式数据库,使用密码学技术进行安全的数据记录和验证。它可以被用来创建可信赖的记录,并确保记录不可篡改。区块链的原理其实是一个又一个区块组成的链条。每一个区块中保存了一定的信息,它们按... 查看详情

#yyds干货盘点#愚公系列2023年02月.net/c#知识点-efcore性能优化之显示编译(代码片段)

前言性能优化,简而言之,就是在不影响系统运行正确性的前提下,使之运行地更快,完成特定功能所需的时间更短。对于EFCore的查询优化其实也是多种多样的,性能优化是在特定的情况下的特定解决方案,下面着重介绍EFCore的... 查看详情

2023年01月.netcore工具案例-.net7中的webtransport通信(代码片段)

文章目录前言1.技术背景2.QUIC相关概念3.HTTP/3.0一、WebTransport1.WebTransport概念2.WebTransport在js中的使用3.WebTransport在.NET7中的使用3.1创建项目3.2侦听HTTP/3端口3.3获取WebTransport会话3.4监听WebTransport请求4.WebTransport在JavaScript中使用4.1创建We... 查看详情

#yyds干货盘点#愚公系列2023年02月.net/c#知识点-委托匿名方法lambda泛型委托表达式树的进化史(代码片段)

前言在.NET中,委托是一种类型,它可以持有对一个或多个方法的引用,并允许将这些方法作为参数传递给其他方法。.NET中的委托类似于C和C++中的函数指针,但具有更高的类型安全性和其他功能。委托的概念最早可以追溯到早期... 查看详情

#yyds干货盘点#愚公系列2022年08月go教学课程028-函数小结案例(通讯录)(代码片段)

一、通讯录1.什么是通讯录通讯录的信息可以涵盖多项内容比如:姓名、电话号码、单位电话、移动电话、传真号、电子邮件、QQ、MSN、个人主页、公司、街道、邮编、生日、大头贴、车牌、银行账号、俱乐部名称、爱好等等。... 查看详情

#yyds干货盘点#愚公系列2023年02月微信小程序-获取wifi信息(代码片段)

前言微信小程序货期WIFI信息主要分为以下几个步骤getSystemlnfo:查看平台环境startWifi:启动WiFi模块getWifiList:尝试拉取WiFi列表onGetWifiList:监听WiFi列表到达connectWifi:连接WiFi一、获取WIFI信息1.全局配置app.js配置"permission":&q... 查看详情

愚公系列2022年05月.net架构班075-分布式中间件schedulemaster的基本使用

文章目录一、ScheduleMaster的介绍1.ScheduleMaster的基本概念2.ScheduleMaster的架构引进2.1传统解决方案2.2ScheduleMaster解决方案二、ScheduleMaster的基本使用1.ScheduleMaster准备2.MySQL准备3.NetCore客户端准备3.1新建测试业务类3.2然后通过CMD启动程... 查看详情

#yyds干货盘点#愚公系列2022年08月go教学课程002-go语言环境安装(代码片段)

一、Go语言环境安装Go语言是一门编译性的语言需要有SDK工具包对其进行编译才能运行,其次需要有一个编辑工具来写代码,最后为SDK中的工具配置环境变量,所以总结一下可以包含三个方面:SDK工具包安装VSCode安装环境变量配... 查看详情

2022年10月.netcore工具案例-diffplex文本差异组件(代码片段)

文章目录前言一、DiffPlex文本差异组件1.Nuget安装DiffPlex组件2.比较代码前言对于开发人员来说,Git是我们经常使用的工具,在每次编写完代码并提交后,我们可以通过gitdiff来对比不同版本之间的代码的差异,当然... 查看详情

#yyds干货盘点#愚公系列2022年08月go教学课程021-go容器之切片操作(代码片段)

一、切片操作1.什么是切片切片和数组类似,都是数据集合。和数组不同的是,切片是一块动态分配大小的连续空间。2.切片的定义2.1切片的格式var变量名[]T//T表示切片类型。相关案例:packagemainimport"fmt"funcmain()//声明整型切片varn... 查看详情