C#使用 MailKit 收发邮件
目录
- 获取QQ邮箱授权码
- 安装 MailKit
- 配置邮件服务器信息
- 实现邮件收发方法
- 测试邮件收发
- 参考文章
获取QQ邮箱授权码#
打开QQ邮箱,进入 设置->账号 页面:
在 POP3/IMAP/SMTP 中开启 SMTP服务,然后点击 授权码复制授权码:
QQ邮箱服务器的参数如下,详细内容参考SMTP/IMAP服务:
- 接收邮件服务器: imap.qq.com,使用SSL,端口号993
- 发送邮件服务器: smtp.qq.com,使用SSL,端口号465或587
网易邮箱服务器的参数如下,详细内容参考网易邮箱服务器参数如何设置?:
安装 MailKit#
在项目中安装 MailKit 库,可以通过NuGet包管理器安装它或者使用以下命令:
dotnet add package MailKit
MailKit 是在 MimeKit 之上构建的跨平台邮件客户端库,目标是成为 .NET 的最佳电子邮件框架。
配置邮件服务器信息#
配置邮件服务器信息,包括主机、端口、用户名、密码等,封装成 EmailData 类:
/// <summary> /// 邮件数据 /// </summary> class EmailData { /// <summary> /// 发件人 /// </summary> public string From { get; set; } /// <summary> /// 授权码 /// </summary> public string Password { get; set; } /// <summary> /// 收件人 /// </summary> public string To { get; set; } /// <summary> /// 主题 /// </summary> public string Subject { get; set; } /// <summary> /// 纯文本内容 /// </summary> public string TextBody { get; set; } /// <summary> /// HTML内容 /// </summary> public string HtmlBody { get; set; } /// <summary> /// 发送邮件服务器 /// </summary> public HostInfo SMTP { get; set; } /// <summary> /// 接受邮件服务器 /// </summary> public HostInfo IMAP { get; set; } } /// <summary> /// 服务器信息 /// </summary> class HostInfo { /// <summary> /// 服务器地址 /// </summary> public string Host { get; set; } /// <summary> /// 服务器端口 /// </summary> public int Port { get; set; } }
实现邮件收发方法#
邮件收发方法如下,这里只接收最新的10封邮件便于实现交互逻辑:
static async Task SendEmail(EmailData data) { try { // 创建一个新的 MIME 消息对象 var message = new MimeMessage(); // 设置发件人 message.From.Add(MailboxAddress.Parse(data.From)); // 设置收件人 message.To.Add(MailboxAddress.Parse(data.To)); // 设置主题 message.Subject = data.Subject; // 创建邮件正文 var builder = new BodyBuilder(); builder.TextBody = data.TextBody; builder.HtmlBody = data.HtmlBody; // 添加附件 using (var stream = new FileStream("file.txt", FileMode.Open)) { builder.Attachments.Add("file.txt", stream); } // 设置正文 message.Body = builder.ToMessageBody(); // 使用 SMTP 客户端发送邮件 using (var client = new SmtpClient()) { await client.ConnectAsync(data.SMTP.Host, data.SMTP.Port, SecureSocketOptions.StartTls); // 注:用户名和密码应妥善保管,不要硬编码到源码中 await client.AuthenticateAsync(data.From, data.Password); // 发送邮件 await client.SendAsync(message); // 断开与服务器的连接 await client.DisconnectAsync(true); } Console.WriteLine("邮件已成功发送!"); } catch (Exception ex) { Console.WriteLine($"邮件发送失败:{ex.Message}"); } } static async Task GetEmail(EmailData data) { try { // 连接到 IMAP 服务器 using (var client = new ImapClient()) { await client.ConnectAsync(data.IMAP.Host, data.IMAP.Port, true); // 通常使用 TLS 加密 // 认证用户 await client.AuthenticateAsync(data.From, data.Password); // 选择收件箱 var inbox = client.Inbox; await inbox.OpenAsync(FolderAccess.ReadOnly); // 获取邮件数量 int totalMessages = inbox.Count; // 确保开始位置不会小于1 int start = Math.Max(totalMessages - 5, 1); int end = totalMessages; // 获取最新的10封邮件的信息 var messages = inbox.Fetch(start, end, MessageSummaryItems.Envelope | MessageSummaryItems.UniqueId); // 遍历邮件信息并打印出来 foreach (var summary in messages) { var uid = summary.UniqueId; var message = await inbox.GetMessageAsync(uid); Console.WriteLine($"Subject: {message.Subject}"); Console.WriteLine($"From: {message.From}"); Console.WriteLine($"To: {message.To}"); Console.WriteLine($"Date: {message.Date}"); Console.WriteLine($"HtmlBody: {message.HtmlBody}"); Console.WriteLine($"TextBody: {message.TextBody}"); } // 断开连接 await client.DisconnectAsync(true); } } catch (Exception ex) { Console.WriteLine($"接收邮件失败:{ex.Message}"); } }
注意接受邮件时 message.Body 部分内容需要特殊的解析规则,比如附件部分、历史邮件部分。
测试邮件收发#
使用时关键信息替换成自己的:
static async Task Main(string[] args) { var data = new EmailData { From = "qqqqqq@qq.com", Password = "**********", To = "qqqqqq@qq.com", Subject = "来自 .NET Core 的测试邮件", TextBody = "这是纯文本消息内容。", HtmlBody = "<h1>这是HTML消息</h1><p>这封邮件是通过MailKit从 .NET Core 发送的。</p>", SMTP = new HostInfo() { Host = "smtp.qq.com", Port = 587 }, IMAP = new HostInfo() { Host = "imap.qq.com", Port = 993 } }; File.WriteAllText("file.txt", "This is a test file."); await SendEmail(data); await GetEmail(data); }
参考文章#
- 使用MailKit在.NET Core中收发邮件的完整示例
- QQ邮箱获取和使用授权码
目录
- 获取QQ邮箱授权码
- 安装 MailKit
- 配置邮件服务器信息
- 实现邮件收发方法
- 测试邮件收发
- 参考文章
获取QQ邮箱授权码#
打开QQ邮箱,进入 设置->账号 页面:
在 POP3/IMAP/SMTP 中开启 SMTP服务,然后点击 授权码复制授权码:
QQ邮箱服务器的参数如下,详细内容参考SMTP/IMAP服务:
- 接收邮件服务器: imap.qq.com,使用SSL,端口号993
- 发送邮件服务器: smtp.qq.com,使用SSL,端口号465或587
网易邮箱服务器的参数如下,详细内容参考网易邮箱服务器参数如何设置?:
安装 MailKit#
在项目中安装 MailKit 库,可以通过NuGet包管理器安装它或者使用以下命令:
dotnet add package MailKit
MailKit 是在 MimeKit 之上构建的跨平台邮件客户端库,目标是成为 .NET 的最佳电子邮件框架。
配置邮件服务器信息#
配置邮件服务器信息,包括主机、端口、用户名、密码等,封装成 EmailData 类:
/// <summary> /// 邮件数据 /// </summary> class EmailData { /// <summary> /// 发件人 /// </summary> public string From { get; set; } /// <summary> /// 授权码 /// </summary> public string Password { get; set; } /// <summary> /// 收件人 /// </summary> public string To { get; set; } /// <summary> /// 主题 /// </summary> public string Subject { get; set; } /// <summary> /// 纯文本内容 /// </summary> public string TextBody { get; set; } /// <summary> /// HTML内容 /// </summary> public string HtmlBody { get; set; } /// <summary> /// 发送邮件服务器 /// </summary> public HostInfo SMTP { get; set; } /// <summary> /// 接受邮件服务器 /// </summary> public HostInfo IMAP { get; set; } } /// <summary> /// 服务器信息 /// </summary> class HostInfo { /// <summary> /// 服务器地址 /// </summary> public string Host { get; set; } /// <summary> /// 服务器端口 /// </summary> public int Port { get; set; } }
实现邮件收发方法#
邮件收发方法如下,这里只接收最新的10封邮件便于实现交互逻辑:
static async Task SendEmail(EmailData data) { try { // 创建一个新的 MIME 消息对象 var message = new MimeMessage(); // 设置发件人 message.From.Add(MailboxAddress.Parse(data.From)); // 设置收件人 message.To.Add(MailboxAddress.Parse(data.To)); // 设置主题 message.Subject = data.Subject; // 创建邮件正文 var builder = new BodyBuilder(); builder.TextBody = data.TextBody; builder.HtmlBody = data.HtmlBody; // 添加附件 using (var stream = new FileStream("file.txt", FileMode.Open)) { builder.Attachments.Add("file.txt", stream); } // 设置正文 message.Body = builder.ToMessageBody(); // 使用 SMTP 客户端发送邮件 using (var client = new SmtpClient()) { await client.ConnectAsync(data.SMTP.Host, data.SMTP.Port, SecureSocketOptions.StartTls); // 注:用户名和密码应妥善保管,不要硬编码到源码中 await client.AuthenticateAsync(data.From, data.Password); // 发送邮件 await client.SendAsync(message); // 断开与服务器的连接 await client.DisconnectAsync(true); } Console.WriteLine("邮件已成功发送!"); } catch (Exception ex) { Console.WriteLine($"邮件发送失败:{ex.Message}"); } } static async Task GetEmail(EmailData data) { try { // 连接到 IMAP 服务器 using (var client = new ImapClient()) { await client.ConnectAsync(data.IMAP.Host, data.IMAP.Port, true); // 通常使用 TLS 加密 // 认证用户 await client.AuthenticateAsync(data.From, data.Password); // 选择收件箱 var inbox = client.Inbox; await inbox.OpenAsync(FolderAccess.ReadOnly); // 获取邮件数量 int totalMessages = inbox.Count; // 确保开始位置不会小于1 int start = Math.Max(totalMessages - 5, 1); int end = totalMessages; // 获取最新的10封邮件的信息 var messages = inbox.Fetch(start, end, MessageSummaryItems.Envelope | MessageSummaryItems.UniqueId); // 遍历邮件信息并打印出来 foreach (var summary in messages) { var uid = summary.UniqueId; var message = await inbox.GetMessageAsync(uid); Console.WriteLine($"Subject: {message.Subject}"); Console.WriteLine($"From: {message.From}"); Console.WriteLine($"To: {message.To}"); Console.WriteLine($"Date: {message.Date}"); Console.WriteLine($"HtmlBody: {message.HtmlBody}"); Console.WriteLine($"TextBody: {message.TextBody}"); } // 断开连接 await client.DisconnectAsync(true); } } catch (Exception ex) { Console.WriteLine($"接收邮件失败:{ex.Message}"); } }
注意接受邮件时 message.Body 部分内容需要特殊的解析规则,比如附件部分、历史邮件部分。
测试邮件收发#
使用时关键信息替换成自己的:
static async Task Main(string[] args) { var data = new EmailData { From = "qqqqqq@qq.com", Password = "**********", To = "qqqqqq@qq.com", Subject = "来自 .NET Core 的测试邮件", TextBody = "这是纯文本消息内容。", HtmlBody = "<h1>这是HTML消息</h1><p>这封邮件是通过MailKit从 .NET Core 发送的。</p>", SMTP = new HostInfo() { Host = "smtp.qq.com", Port = 587 }, IMAP = new HostInfo() { Host = "imap.qq.com", Port = 993 } }; File.WriteAllText("file.txt", "This is a test file."); await SendEmail(data); await GetEmail(data); }
参考文章#
- 使用MailKit在.NET Core中收发邮件的完整示例
- QQ邮箱获取和使用授权码











没有回复内容