首页 > 极客资料 博客日记
C#使用 MailKit 收发邮件
2024-10-15 09:30:04极客资料围观17次
本篇文章分享C#使用 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;
// 设置正文
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}");
}
// 断开连接
await client.DisconnectAsync(true);
}
}
catch (Exception ex)
{
Console.WriteLine($"接收邮件失败:{ex.Message}");
}
}
注意接受邮件时 message.Body 部分的内容需要特殊的解析规则,不能直接打印 ToString() 方法。
测试邮件收发
使用时关键信息替换成自己的:
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);
}
参考文章
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!
标签:
相关文章
最新发布
- Nuxt.js 应用中的 prerender:routes 事件钩子详解
- 【问题解决】Tomcat由低于8版本升级到高版本使用Tomcat自带连接池报错无法找到表空间的问题
- 【FAQ】HarmonyOS SDK 闭源开放能力 —Vision Kit
- 六、Spring Boot集成Spring Security之前后分离认证流程最佳方案
- 《JVM第7课》堆区
- .NET 8 高性能跨平台图像处理库 ImageSharp
- 还在为慢速数据传输苦恼?Linux 零拷贝技术来帮你!
- 刚毕业,去做边缘业务,还有救吗?
- 如何避免 HttpClient 丢失请求头:通过 HttpRequestMessage 解决并优化
- 让性能提升56%的Vue3.5响应式重构之“版本计数”