C#使用 MailKit 收发邮件,C#使用 MailKit 收发邮件-编程算法牛翰社区-数据算法-牛翰网

C#使用 MailKit 收发邮件,C#使用 MailKit 收发邮件

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邮箱获取和使用授权码
请登录后发表评论

    没有回复内容