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 ...
随机推荐
- 【JavaScript】文件上传下载问题
问题原因 一般文件上传前端甚至可以不涉及JS来实现 input标签套在form标签,由form标签直接发送请求就可以实现上传功能 但是现在很多项目都使用前后端分离,AJAX一刀切所有. input标签 ...
- Linux下文件及文件夹权限(学习笔记版)
本文遵循CC 4.0 BY-SA版权协议 注意:本文为学习笔记版,只记录个人觉得重要的部分,内容较为片面. Linux 下文件及文件夹的权限可以表示为rwx这三个字符,r代表read,w代表write ...
- 乌克兰学者的学术图谱case4
=============================================== 背景: 弗兰采维奇材料问题研究是欧洲最大的材料科研院所,在核电.航空.航天.军工及其他装备制造领域的先进 ...
- Mybatis-Plus系统化学习之环境准备与简单使用
1.背景 平时在开发中会经常用到单表的CRUD操作 其实,这些单表的CRUD,完全不需要我们写sql,可以使用mybatis-plus自动生成,不但高效而且不容用出错! 2.mybatis-plus的 ...
- 直接在jsp页面上使用flex标签
1:去ADOBE下载FLEX的TAGLIB for JSP. http://download.macromedia.com/pub/labs/flex2_tag_library_jsp/flex2_t ...
- WPF使用Grid布局
WPF布局 WPF布局基础 布局原则 一个窗口中只能包含一个元素 不应显示设置元素尺寸 不应使用坐标设置元素的位置 可以嵌套布局容器 布局容器 StackPanel: 水平或垂直排列元素.Orient ...
- liunx下安装Nginx
Linux下nginx的安装以及环境配置 https://blog.csdn.net/qq_42815754/article/details/82980326 第一步:下载nginx压缩包 在这里可以 ...
- Terraform中的for_each和count
通过Terraform创建云主机时,在某些业务场景下,一个机器需要挂载多个云盘,一般云厂商都是单独创建云主机和云硬盘然后通过attachment的资源去挂载,因此我们的模板大致如下: resource ...
- canfestival源码下载教程
先进入官网的这个页面 https://canfestival.org/code.html.en 点击箭头所指的地方 选择日期最新的点击下载
- 省钱的开源项目「GitHub 热点速览」
本期,我从上周的热门开源项目中挑选了 5 个既省钱又省事,还好玩的开源项目. 首先,推荐的是省钱的电动汽车智能充电管理平台 evcc,它可以根据分时电价智能安排电动车充电时间,从而降低电费,如果你家还 ...