C#使用 MailKit 收发邮件

科技   2024-10-30 07:16   北京  

实现步骤

  • 获取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中收发邮件的完整示例(https://blog.csdn.net/Hellc007/article/details/140889544)

  • QQ邮箱获取和使用授权码(https://blog.csdn.net/xiaowei1028/article/details/118305788)


二次元攻城狮

出处:cnblogs.com/timefiles/p/18466070


关注公众号DotNet开发跳槽    

DotNet开发跳槽
本公众号专注为.net开发工程师提供一个学习技术及求职/跳槽的交流平台。不定期分享NET技术类文章、面试题、求助技巧等干货,原创文章300+篇,让.net开发工程师学习/面试不再迷茫。ps: 后台回复“跳槽”,免费领取.NET开发面试题!
 最新文章