引用的包信息
<PackageReference Include="MailKit" Version="4.14.1" />
代码
using MailKit;
using MailKit.Net.Imap;
using MailKit.Net.Pop3;
using MailKit.Search;
using MimeKit;
public class Program
{
static int _lastPop3Count = 0;
public static async Task Main(string[] args)
{
string protocol = "IMAP";
string host = "imap.qq.com";
int port = 993;
// 目前只测试了扣扣邮箱其他的收不到126,163、outlook等
string username = "example@qq.com";
string password = "password";
int checkInterval = 5;
bool useSsl = true;
// 3. 初始化控制台
Console.Title = "MailKit 邮箱监控程序 - .NET Core";
Console.WriteLine("======================================");
Console.WriteLine("邮箱监控程序已启动(.NET Core)!");
Console.WriteLine($"协议:{protocol} | 邮箱:{username}");
Console.WriteLine($"检查间隔:{checkInterval}秒");
Console.WriteLine("======================================");
Console.WriteLine("按 ESC 键退出程序...\n");
// 4. 退出令牌(.NET Core 优雅退出方案)
var cts = new CancellationTokenSource();
// 后台线程监听ESC键退出
_ = Task.Run(() =>
{
while (Console.ReadKey(true).Key != ConsoleKey.Escape) { }
Console.WriteLine("\n程序正在退出...");
cts.Cancel(); // 触发取消令牌
});
// 5. 核心监控逻辑(循环检查,支持取消)
try
{
while (!cts.Token.IsCancellationRequested)
{
try
{
if (protocol.Equals("IMAP", StringComparison.OrdinalIgnoreCase))
{
await CheckImapEmailsAsync(host, port, username, password, useSsl);
}
else
{
await CheckPop3EmailsAsync(host, port, username, password, useSsl);
}
}
catch (Exception ex)
{
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine($"[{DateTime.Now:yyyy-MM-dd HH:mm:ss}] 监控异常:{ex.Message}");
Console.ResetColor();
}
// 等待间隔(支持取消)
await Task.Delay(TimeSpan.FromSeconds(checkInterval), cts.Token);
}
}
catch(OperationCanceledException ex)
{
// 正常取消,无异常
;
}
Console.WriteLine("程序已退出!");
}
/// <summary>
/// IMAP协议:精准获取未读邮件(推荐)
/// </summary>
public static async Task CheckImapEmailsAsync(string host, int port, string username, string password, bool useSsl)
{
using var client = new ImapClient();
// 异步连接(.NET Core 推荐异步操作)
await client.ConnectAsync(host, port, useSsl);
await client.AuthenticateAsync(username, password);
var inbox = client.Inbox;
await inbox.OpenAsync(FolderAccess.ReadOnly);
Console.WriteLine($"[{DateTime.Now:yyyy-MM-dd HH:mm:ss}] 检查收件箱:总计 {inbox.Count} 封邮件");
// 搜索未读邮件
var unreadMessages = await inbox.SearchAsync(SearchQuery.NotSeen);
if (unreadMessages.Count > 0)
{
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine($"发现 {unreadMessages.Count} 封未读邮件:\n");
Console.ResetColor();
foreach (var uid in unreadMessages)
{
var message = await inbox.GetMessageAsync(uid);
PrintEmailInfo(message, uid.ToString());
// 可选:标记为已读
// await inbox.AddFlagsAsync(uid, MessageFlags.Seen, true);
}
}
else
{
Console.WriteLine("暂无未读邮件\n");
}
await client.DisconnectAsync(true);
}
/// <summary>
/// POP3协议:兼容模式
/// </summary>
public static async Task CheckPop3EmailsAsync(string host, int port, string username, string password, bool useSsl)
{
using var client = new Pop3Client();
await client.ConnectAsync(host, port, useSsl);
await client.AuthenticateAsync(username, password);
int totalCount = client.Count;
Console.WriteLine($"[{DateTime.Now:yyyy-MM-dd HH:mm:ss}] 检查收件箱:总计 {totalCount} 封邮件");
if (totalCount > _lastPop3Count)
{
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine($"发现 {totalCount - _lastPop3Count} 封新邮件:\n");
Console.ResetColor();
for (int i = _lastPop3Count + 1; i <= totalCount; i++)
{
var message = await client.GetMessageAsync(i);
PrintEmailInfo(message, i.ToString());
}
_lastPop3Count = totalCount;
}
else
{
Console.WriteLine("暂无新邮件\n");
}
await client.DisconnectAsync(true);
}
/// <summary>
/// 格式化输出邮件信息
/// </summary>
public static void PrintEmailInfo(MimeMessage message, string id)
{
Console.WriteLine($"---------- 邮件 [{id}] ----------");
Console.WriteLine($"发件人:{message.From}");
Console.WriteLine($"收件人:{message.To}");
Console.WriteLine($"标题:{message.Subject}");
Console.WriteLine($"时间:{message.Date:yyyy-MM-dd HH:mm:ss}");
// 解析纯文本正文
var body = message.TextBody ?? "无纯文本正文";
Console.WriteLine($"正文:{body.Substring(0, Math.Min(body.Length, 200))}...");
Console.WriteLine("----------------------------------\n");
}
}
预览
======================================
邮箱监控程序已启动(.NET Core)!
协议:IMAP | 邮箱:wx167788@qq.com
检查间隔:5秒
======================================
按 ESC 键退出程序...
[2026-01-12 08:48:44] 检查收件箱:总计 0 封邮件
暂无未读邮件
[2026-01-12 08:48:50] 检查收件箱:总计 1 封邮件
发现 1 封未读邮件:
---------- 邮件 [513] ----------
发件人:"Charles" <412102100@qq.com>
收件人:"wx167788" <wx167788@qq.com>
标题:Test
时间:2026-01-12 08:48:10
正文:Test
Charles
412102100@qq.com...
----------------------------------