翼度科技»论坛 编程开发 .net 查看内容

C#使用 MailKit 收发邮件

6

主题

6

帖子

18

积分

新手上路

Rank: 1

积分
18
目录

获取QQ邮箱授权码

打开QQ邮箱,进入 设置->账号 页面:

POP3/IMAP/SMTP 中开启 SMTP服务,然后点击 授权码复制授权码:

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

  • 接收邮件服务器: imap.qq.com,使用SSL,端口号993
  • 发送邮件服务器: smtp.qq.com,使用SSL,端口号465或587
网易邮箱服务器的参数如下,详细内容参考网易邮箱服务器参数如何设置?

安装 MailKit

在项目中安装 MailKit 库,可以通过NuGet包管理器安装它或者使用以下命令:
  1. dotnet add package MailKit
复制代码
MailKit 是在 MimeKit 之上构建的跨平台邮件客户端库,目标是成为 .NET 的最佳电子邮件框架。
配置邮件服务器信息

配置邮件服务器信息,包括主机、端口、用户名、密码等,封装成 EmailData 类:
  1. /// <summary>
  2. /// 邮件数据
  3. /// </summary>
  4. class EmailData
  5. {
  6.     /// <summary>
  7.     /// 发件人
  8.     /// </summary>
  9.     public string From { get; set; }
  10.     /// <summary>
  11.     /// 授权码
  12.     /// </summary>
  13.     public string Password { get; set; }
  14.     /// <summary>
  15.     /// 收件人
  16.     /// </summary>
  17.     public string To { get; set; }
  18.     /// <summary>
  19.     /// 主题
  20.     /// </summary>
  21.     public string Subject { get; set; }
  22.     /// <summary>
  23.     /// 纯文本内容
  24.     /// </summary>
  25.     public string TextBody { get; set; }
  26.     /// <summary>
  27.     /// HTML内容
  28.     /// </summary>
  29.     public string HtmlBody { get; set; }
  30.     /// <summary>
  31.     /// 发送邮件服务器
  32.     /// </summary>
  33.     public HostInfo SMTP { get; set; }
  34.     /// <summary>
  35.     /// 接受邮件服务器
  36.     /// </summary>
  37.     public HostInfo IMAP { get; set; }
  38. }
  39. /// <summary>
  40. /// 服务器信息
  41. /// </summary>
  42. class HostInfo
  43. {
  44.     /// <summary>
  45.     /// 服务器地址
  46.     /// </summary>
  47.     public string Host { get; set; }
  48.     /// <summary>
  49.     /// 服务器端口
  50.     /// </summary>
  51.     public int Port { get; set; }
  52. }
复制代码
实现邮件收发方法

邮件收发方法如下,这里只接收最新的10封邮件便于实现交互逻辑:
  1. static async Task SendEmail(EmailData data)
  2. {
  3.     try
  4.     {
  5.         // 创建一个新的 MIME 消息对象
  6.         var message = new MimeMessage();
  7.         // 设置发件人
  8.         message.From.Add(MailboxAddress.Parse(data.From));
  9.         // 设置收件人
  10.         message.To.Add(MailboxAddress.Parse(data.To));
  11.         // 设置主题
  12.         message.Subject = data.Subject;
  13.         // 设置正文
  14.         message.Body = new BodyBuilder
  15.         {
  16.             TextBody = data.TextBody,
  17.             HtmlBody = data.HtmlBody
  18.         }.ToMessageBody();
  19.         // 使用 SMTP 客户端发送邮件
  20.         using (var client = new SmtpClient())
  21.         {
  22.             await client.ConnectAsync(data.SMTP.Host, data.SMTP.Port, SecureSocketOptions.StartTls);
  23.             // 注:用户名和密码应妥善保管,不要硬编码到源码中
  24.             await client.AuthenticateAsync(data.From, data.Password);
  25.             // 发送邮件
  26.             await client.SendAsync(message);
  27.             // 断开与服务器的连接
  28.             await client.DisconnectAsync(true);
  29.         }
  30.         Console.WriteLine("邮件已成功发送!");
  31.     }
  32.     catch (Exception ex)
  33.     {
  34.         Console.WriteLine($"邮件发送失败:{ex.Message}");
  35.     }
  36. }
  37. static async Task GetEmail(EmailData data)
  38. {
  39.     try
  40.     {
  41.         // 连接到 IMAP 服务器
  42.         using (var client = new ImapClient())
  43.         {
  44.             await client.ConnectAsync(data.IMAP.Host, data.IMAP.Port, true); // 通常使用 TLS 加密
  45.             // 认证用户
  46.             await client.AuthenticateAsync(data.From, data.Password);
  47.             // 选择收件箱
  48.             var inbox = client.Inbox;
  49.             await inbox.OpenAsync(FolderAccess.ReadOnly);
  50.             // 获取邮件数量
  51.             int totalMessages = inbox.Count;
  52.             // 确保开始位置不会小于1
  53.             int start = Math.Max(totalMessages - 5, 1);
  54.             int end = totalMessages;
  55.             // 获取最新的10封邮件的信息
  56.             var messages = inbox.Fetch(start, end, MessageSummaryItems.Envelope | MessageSummaryItems.UniqueId);
  57.             // 遍历邮件信息并打印出来
  58.             foreach (var summary in messages)
  59.             {
  60.                 var uid = summary.UniqueId;
  61.                 var message = await inbox.GetMessageAsync(uid);
  62.                 Console.WriteLine($"Subject: {message.Subject}");
  63.                 Console.WriteLine($"From: {message.From}");
  64.                 Console.WriteLine($"To: {message.To}");
  65.                 Console.WriteLine($"Date: {message.Date}");
  66.                                 Console.WriteLine($"HtmlBody: {message.HtmlBody}");
  67.                                 Console.WriteLine($"TextBody: {message.TextBody}");
  68.             }
  69.             // 断开连接
  70.             await client.DisconnectAsync(true);
  71.         }
  72.     }
  73.     catch (Exception ex)
  74.     {
  75.         Console.WriteLine($"接收邮件失败:{ex.Message}");
  76.     }
  77. }
复制代码
注意接受邮件时 message.Body 部分内容需要特殊的解析规则,比如附件部分、历史邮件部分。
测试邮件收发

使用时关键信息替换成自己的:
  1. static async Task Main(string[] args)
  2. {
  3.     var data = new EmailData
  4.     {
  5.         From = "qqqqqq@qq.com",
  6.         Password = "**********",
  7.         To = "qqqqqq@qq.com",
  8.         Subject = "来自 .NET Core 的测试邮件",
  9.         TextBody = "这是纯文本消息内容。",
  10.         HtmlBody = "<h1>这是HTML消息</h1><p>这封邮件是通过MailKit从 .NET Core 发送的。</p>",
  11.         SMTP = new HostInfo()
  12.         {
  13.             Host = "smtp.qq.com",
  14.             Port = 587
  15.         },
  16.         IMAP = new HostInfo()
  17.         {
  18.             Host = "imap.qq.com",
  19.             Port = 993
  20.         }
  21.     };
  22.     await SendEmail(data);
  23.     await GetEmail(data);
  24. }
复制代码
参考文章


来源:https://www.cnblogs.com/timefiles/p/18466070
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具