MailKit是最流行且最强大的.NET邮件处理框架之一,下面为大家简单介绍MailKit的使用方式(IMAP为例)
Github网址:https://github.com/jstedfast/MailKit
官方网址:http://www.mimekit.net/docs/html/Introduction.htm
IMAP(Internet Message Access Protocol)以前称作交互邮件访问协议(Interactive Mail Access Protocol),是一个应用层协议。IMAP是斯坦福大学在1986年开发的一种邮件获取协议。它的主要作用是邮件客户端可以通过这种协议从邮件服务器上获取邮件的信息,下载邮件等。当前的权威定义是RFC3501。IMAP协议运行在TCP/IP协议之上,使用的端口是143。它与POP3协议的主要区别是用户可以不用把所有的邮件全部下载,可以通过客户端直接对服务器上的邮件进行操作。
本代码以.NET 7为主
using MailKit;
using MailKit.Net.Imap;
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 = "XXXXXXXXXX";//这个不是qq密码,是开启imap时候的16位授权码
private const string DIRECTORY = @"D:\";
static void Main(string[] args)
{
using (var client = new ImapClient())
{
//不加密
client.Connect("imap.qq.com", 143, SecureSocketOptions.None);
加密
//client.Connect("imap.qq.com", 993, SecureSocketOptions.SslOnConnect);
//登入邮箱
client.Authenticate(MAIL_NAME, MAIL_PASSWORD);
//打开邮件文件夹
client.Inbox.Open(FolderAccess.ReadWrite);
// 读取方式一:可以预先筛选邮件
// search for messages where the Subject header contains either "MimeKit" or "MailKit"
//var query = SearchQuery.SubjectContains("MimeKit").Or(SearchQuery.SubjectContains("MailKit"));
//var uids = client.Inbox.Search(query);
// 读取方式二:读取所有邮件
var uids = client.Inbox.Search(SearchQuery.All);
foreach (var uid in uids)
{
var message = client.Inbox.GetMessage(uid);
// 操作邮件一:读取邮件标题
string subject = message.Subject;
// 操作邮件二:读取正文
string body = message.TextBody ?? string.Empty;
// 操作邮件三:下载邮件附件
var attachments = message.Attachments;
if (attachments.Any())
{
foreach (var attachment in attachments)
DownloadAttachment(attachment);
}
// 操作邮件四:移动邮件(移动至删除文件夹)
client.Inbox.MoveTo(uid, client.GetFolder(SpecialFolder.Trash));
// 操作邮件五:删除邮件 - 将邮件标记为删除、最后删除
client.Inbox.AddFlags(uid, MessageFlags.Deleted, true);
client.Inbox.Expunge();
}
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);
}
}
}
}