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);
}
参考文章
C#使用 MailKit 收发邮件的更多相关文章
- 使用MailKit收发邮件
.Net BCL库中对于邮件的支持只有SmtpClient一个,它只能进行简单的邮件的发送操作,并且不支持POP3和SMTP,无法接收邮件,用起来有诸多不便. 今天看到园子里有文章(使用 MimeKi ...
- mailkit库收发邮件
mailkit库用于收发邮件.这个库可以替代C#自带的发邮件库 环境 W10 / VS2017CMMT / MailKit version="2.0.3" "net46 ...
- MailKit和MimeKit 收发邮件
新建项目,引用MailKit和MimeKit NuGet包 using CommonTool.MailKit; using System; using System.Collections.Gener ...
- .NET CORE 下收发邮件之 MAILKIT
背景 利用代码发送邮件在工作中还是比较常见的,相信大家都用过SmtpClient来处理发送邮件的操作,不过这个类以及被标记已过时,所以介绍一个微软推荐的库MailKit来处理. MailKit开源地址 ...
- DouNet学习_收发邮件
一.收发邮件 --->第一步:发邮件首先要有发送者的邮箱地址和登录的密码才能发送 这些都写在APP里 不要写死 --->第二步:发邮件就要有网络,要添加net.Mail命名空间 要发送的 ...
- Outlook Express 收发邮件出现"0x800CCC0F"错误代码解决方法
非常多网友在使用Outlook Express收发邮件的过程中,有时能够发送邮件,但出现不能接收信件的问题.每次在收邮件都会在某个地方停止不动,然后报超时,出现错误代码0x800CCC19或0x800 ...
- 用 Apache James 搭建邮件服务器来收发邮件实践(一)(转)
Apache James 简称 James, 是 Java Apache Mail Enterprise Server的缩写.James 是100%基于Java的电子邮件服务器.它是一种独立的邮件服务 ...
- 用Emacs收发邮件
使用Emacs,将尽可能多的工作放到Emacs中来完成,这样可以提高工作效率. 1.安装必要的LISP插件和程序 $sudo apt-get install stunnel4 $sudo apt-ge ...
- Python收发邮件
发送邮件使用SMTP协议,接受POP3或IMAP: 创建邮件内容email模块,发送邮件smtplib模块.发送邮件比较简单,只需先创建SMTP对象,登录服务器后根据发收邮箱地址发送即可: POP3接 ...
- 转--python -- 收发邮件
官方 import smtplib from email.mime.text import MIMEText from email.header import Header # 发送邮箱服务器 smt ...
随机推荐
- 【Vue】Re08 模块化
一.JS的演变: 1.简单的页面控制,改变HTML标签和CSS样式 2.AJAX异步请求,控制前后数据传输问题 3.更强大的功能,几乎依赖JS实现 工程管理问题: 简单页面只需要在页面嵌入script ...
- 【转载】 传统PID算法解决不了的情况,应该怎么办?
原文地址: http://www.51hei.com/bbs/dpj-152844-1.html --------------------------------------------------- ...
- mujoco_py.cymj.GlfwError: Failed to initialize GLFW
安装mujoco后运行可视化界面代码报错: mujoco_py.cymj.GlfwError: Failed to initialize GLFW 解决方法: sudo apt-get install ...
- 记录一次实验室linux系统的GPU服务器死机故障的排查——Linux系统的Power States
实验室的ubuntu服务器不知怎么的突然又崩溃了,死机重启,然后查看日志,发现了下面的情况: 由于从其他的日志中知道是显卡的问题引起的死机,而这个显卡的地址正好是D9:00,这部分的日志就不给出了.结 ...
- 在oracle中将一行字符串拆分成多行
例如,有如下一张表,表名为bk_test.插入了以下数据: CREATE TABLE BK_TESK(id varchar2(10),s varchar2(20)); insert into BK_T ...
- Leetcode: 1484. Groups Sold Products By The Date
题目要求如下: 输入的数据为 要求按照日期查询出每日销售数量及相应产品的名称,并按照字符顺序进行排序. 下面是实现的代码: import pandas as pd def categorize_pro ...
- 【倍增】Rigged Games
题意 两队打比赛,大比分 2b − 1 赢,小比分 2a − 1 赢. 给定的长度为 n 的串,两队比赛的每个小分结果是这个串的循环重复. 问从该串的每个位置开始,最终谁会赢得整个比赛. 思路 倍增. ...
- MPTCP(二):MPTCP版本说明
MPTCP版本说明 简介 参考链接 https://github.com/multipath-tcp/mptcp_net-next/wiki MPTCP的两个版本 MPTCPv0: 在5.6之前的li ...
- Python 开发中,使用bcrypt 或 Passlib 对系统用户密码进行哈希和验证处理
在设计一个系统的时候,肯定都有会有用户身份认证的问题,一般对用户校验的时候,都是对用户存在数据库总的密码哈希值进行判断,从而避免密码泄露和反向解密,那么在Python 开发中,我们可以引入bcrypt ...
- win10无法访问共享文件夹win2008R2 错误代码0X80004005
错误代码0X80004005 无法访问共享计算机的解决方法 开始->运行(快捷键"win+R"),输入"regedit"后回车,打开注册表编辑器. 依次打 ...