前言
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);
}
}
}
}