C#使用 MailKit 收发邮件

获取QQ邮箱授权码

打开QQ邮箱,进入 设置->账号 页面:
C#使用 MailKit 收发邮件

POP3/IMAP/SMTP 中开启 SMTP服务,然后点击 授权码复制授权码:
C#使用 MailKit 收发邮件

QQ邮箱服务器的参数如下,详细内容参考SMTP/IMAP服务

  • 接收邮件服务器: imap.qq.com,使用SSL,端口号993
  • 发送邮件服务器: smtp.qq.com,使用SSL,端口号465或587

网易邮箱服务器的参数如下,详细内容参考网易邮箱服务器参数如何设置?
C#使用 MailKit 收发邮件

安装 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;          // 设置正文         message.Body = new BodyBuilder         {             TextBody = data.TextBody,             HtmlBody = data.HtmlBody         }.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         }      };      await SendEmail(data);     await GetEmail(data); } 

参考文章

发表评论

评论已关闭。

相关文章