C# 使用 MailKit 接收邮件(附demo)
- 介绍
- 安装包(依赖)
- 简单代码
- 获取附件
- 核心代码
- 完整代码
介绍
MailKit 是一个开源的 C# 邮件处理库,用于在应用程序中发送和接收电子邮件。它提供了一个强大且易于使用的 API,支持多种邮件协议,包括 SMTP、POP3、和 IMAP。
特性与优势 | 描述 |
---|---|
多协议支持 | 支持 SMTP、POP3、IMAP 等多种邮件协议。 |
异步操作 | 使用异步编程模型,提高性能和响应性。 |
附件处理 | 提供灵活的附件处理功能,支持添加、读取和保存邮件附件。 |
SSL/TLS 支持 | 支持安全套接字层(SSL)和传输层安全性(TLS),确保邮件的安全传输。 |
容错处理 | 提供容错处理机制,处理网络或协议错误,确保稳定的邮件通信。 |
丰富的 API | 提供丰富的 API,方便开发人员访问邮件的各个方面,包括主题、发件人、收件人等。 |
跨平台 | MailKit 是一个跨平台的邮件处理库,可在多个操作系统上运行,包括 Windows、Linux 和 macOS。 |
安装包(依赖)
通过命令操作 NuGet 包管理器进行安装:
Install-Package MailKit -Version 2.15.0
通过管理 NuGet 程序包进行安装
简单代码
以下是一个简单的示例,演示如何使用 MailKit 接收邮件:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MailKit.Net.Pop3;
using MimeKit;
namespace Pop3EmailDemo
{
internal class Program
{
static void Main(string[] args)
{
using (var client = new Pop3Client())
{
// 邮箱信息
string email = "csdndaolizhe@163.com";
string password = "AOKRBYUISXPAITAI";
// POP3 服务器和端口
string pop3Server = "pop.163.com";
int pop3Port = 995;
// 连接到 POP3 服务器
client.Connect(pop3Server, pop3Port, true);
// 登录
client.Authenticate(email, password);
// 获取邮件数量
int messageCount = client.Count;
// 遍历邮件
for (int i = 0; i < messageCount; i++)
{
// 获取邮件 UID
var uid = client.GetMessageUid(i);
Console.WriteLine($"\r\n{email} \r\n接收到邮件 {uid}\r\n");
// 获取邮件
MimeMessage message = client.GetMessage(i);
Console.WriteLine($"\r\n标题:{message.Subject} \r\n内容:{message.TextBody}\r\n");
// 断开连接
client.Disconnect(true);
}
}
}
}
}
我这里展示一下网易163邮箱的POP3开启方式
AOKRBYUISXPAITAI
POP3 服务器地址
由于我这里是自己给自己发的邮件,所以可以看到自己的邮件内容
以下是 MimeMessage
类中的一些主要字段及其解释:
字段 | 类型 | 解释 |
---|---|---|
From | InternetAddressList | 发件人的电子邮件地址列表,表示邮件的实际发件人或邮件的代理发件人。 常用 |
Sender | InternetAddress | 实际发送邮件的用户或代理的电子邮件地址。在协作场景中,与 From 可能不同。 |
ReplyTo | InternetAddressList | 邮件回复时使用的地址列表,指定了接收回复的地址,不一定与发件人相同。 |
To | InternetAddressList | 收件人的电子邮件地址列表,表示邮件的主要接收人。 |
Cc | InternetAddressList | 抄送收件人的电子邮件地址列表,指定了附加接收邮件的地址,不是主要的接收人。 |
Bcc | InternetAddressList | 密送收件人的电子邮件地址列表,接收邮件的人不会看到这个地址。 |
MessageId | string | 用于唯一标识邮件的字符串,在电子邮件通信中是邮件的唯一标识符。 |
Date | DateTime | 表示邮件发送日期和时间的时间戳,用于指示邮件的发送时间。 常用 |
Subject | string | 邮件的主题或标题,描述邮件内容的简短文本。常用 |
HtmlBody | string | 邮件的正文内容,可以是纯文本 (TextPart) 或包含多个部分的复合体 (Multipart),如 HTML、附件等。 |
TextBody | string | 邮件的正文纯文本 ,特别纯,一般常用 的就是这个 |
Attachments | IEnumerable<MimePart> | 包含在邮件中的附件列表,每个附件是一个 MimePart 对象,表示二进制数据或其他嵌套消息。 |
获取附件
核心代码
// 处理邮件附件
foreach (var attachment in message.Attachments)
{
if (attachment.IsAttachment)
if (attachment is MimePart)
{
var part = (MimePart)attachment;
var fileName = part.FileName;
var filePath = "D:\\临时\\邮件简历\\" + Guid.NewGuid().ToString() + fileName;
//File.Create(filePath)
using (var stream = File.Create(filePath))
{
if (attachment is MessagePart rfc822)
{
rfc822.Message.WriteTo(stream);
}
else
{
part.Content.DecodeTo(stream);
}
}
// 保存附件到本地文件
var mailFileInfo = new FileInfo(filePath);
}
}
完整代码
using MailKit.Net.Pop3;
using MimeKit;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Pop3EmailAttachmentsDemo
{
internal class Program
{
static void Main(string[] args)
{
using (var client = new Pop3Client())
{
// 邮箱信息
string email = "csdndaolizhe@163.com";
string password = "AOKRBYUISXPAITAI";
// POP3 服务器和端口
string pop3Server = "pop.163.com";
int pop3Port = 995;
// 连接到 POP3 服务器
client.Connect(pop3Server, pop3Port, true);
// 登录
client.Authenticate(email, password);
// 获取邮件数量
int messageCount = client.Count;
// 遍历邮件
for (int i = 0; i < messageCount; i++)
{
// 获取邮件 UID
var uid = client.GetMessageUid(i);
Console.WriteLine($"\r\n{email} \r\n接收到邮件 {uid}\r\n");
// 获取邮件
MimeMessage message = client.GetMessage(i);
Console.WriteLine($"\r\n标题:{message.Subject} \r\n内容:{message.TextBody}\r\n");
// 处理邮件附件
foreach (var attachment in message.Attachments)
{
if (attachment.IsAttachment)
if (attachment is MimePart)
{
var part = (MimePart)attachment;
var fileName = part.FileName;
var filePath = "D:\\临时\\邮件附件\\" + Guid.NewGuid().ToString() + fileName;
//File.Create(filePath)
using (var stream = File.Create(filePath))
{
if (attachment is MessagePart rfc822)
{
rfc822.Message.WriteTo(stream);
}
else
{
part.Content.DecodeTo(stream);
}
}
// 保存附件到本地文件
var mailFileInfo = new FileInfo(filePath);
}
}
// 断开连接
client.Disconnect(true);
}
}
}
}
}