NET 5 收发邮件之 MailKit
大家都用过SmtpClient来处理发送邮件的操作,不过这个类以及被标记已过时,所以介绍一个微软推荐的库MailKit来处理。
MailKit开源地址:https://github.com/jstedfast/MailKit
新建一个控制台应用程序,将MailKit添加到项目中。
Install-Package MailKit
新建一个IEmail接口。
using MimeKit;
using System.Threading.Tasks; namespace EmailDemo
{
public interface IEmail
{
/// <summary>
/// 发送Email
/// </summary>
/// <param name="message"></param>
/// <returns></returns>
Task SendEmailAsync(MimeMessage message);
}
}
实现
using MailKit.Net.Smtp;
using MimeKit;
using System.Collections.Generic;
using System.Threading.Tasks; namespace EmailDemo
{
public class Email : IEmail
{
public async Task SendEmailAsync(MimeMessage message)
{
var host = "smtp.exmail.qq.com";
var port = 465;
var useSsl = true;
var from_username = "123@meowv.com";
var from_password = "...";
var from_name = "测试";
var from_address = "123@meowv.com"; var address = new List<MailboxAddress>
{
new MailboxAddress("111","111@meowv.com"),
new MailboxAddress("222","222@meowv.com")
}; message.From.Add(new MailboxAddress(from_name, from_address));
message.To.AddRange(address); using var client = new SmtpClient
{
ServerCertificateValidationCallback = (s, c, h, e) => true
};
client.AuthenticationMechanisms.Remove("XOAUTH2"); await client.ConnectAsync(host, port, useSsl);
await client.AuthenticateAsync(from_username, from_password);
await client.SendAsync(message);
await client.DisconnectAsync(true);
}
}
}
上面关于邮箱的账号密码服务器可以放在配置文件中,这里为了方便直接写了,演示了发送邮件到两个Email地址。
然后在Program.cs中使用依赖注入的方式调用。
using Microsoft.Extensions.DependencyInjection;
using MimeKit;
using System;
using System.Threading.Tasks; namespace EmailDemo
{
class Program
{
static async Task Main(string[] args)
{
IServiceCollection service = new ServiceCollection(); service.AddSingleton<IEmail, Email>(); var provider = service.BuildServiceProvider().GetRequiredService<IEmail>(); var message = new MimeMessage
{
Subject = "我是邮件主题",
Body = new BodyBuilder
{
HtmlBody = $"我是邮件内容,时间:{DateTime.Now:yyyy-MM-dd HH:mm:ss}"
}.ToMessageBody()
}; await provider.SendEmailAsync(message);
}
}
}

以上演示了在 .NET Core 中发送邮件的示例,同时利用MailKit也可以接收邮件,这里使用场景不多,如有需要可以参考MailKitGitHub代码示例。
通常发送邮件可以提前写好HTML模板,然后将关键内容做字符串替换,这样发出去的就是一个比较美观的邮件了。
MailKit还支持将图片作为数据内容发送出去。
using Microsoft.Extensions.DependencyInjection;
using MimeKit;
using MimeKit.Utils;
using System;
using System.Threading.Tasks; namespace EmailDemo
{
class Program
{
static async Task Main(string[] args)
{
IServiceCollection service = new ServiceCollection(); service.AddSingleton<IEmail, Email>(); var provider = service.BuildServiceProvider().GetRequiredService<IEmail>(); var path = "D:\\bg.jpg"; var builder = new BodyBuilder(); var image = builder.LinkedResources.Add(path);
image.ContentId = MimeUtils.GenerateMessageId(); builder.HtmlBody = $"当前时间:{DateTime.Now:yyyy-MM-dd HH:mm:ss} <img src=\"cid:{image.ContentId}\"/>"; var message = new MimeMessage
{
Subject = "带图片的邮件推送",
Body = builder.ToMessageBody()
}; await provider.SendEmailAsync(message);
}
}
}
先在本地准备一张图片,利用ContentId的方式嵌入在img标签中,成功将其发送出去。

NET 5 收发邮件之 MailKit的更多相关文章
- mailkit库收发邮件
		
mailkit库用于收发邮件.这个库可以替代C#自带的发邮件库 环境 W10 / VS2017CMMT / MailKit version="2.0.3" "net46 ...
 - DouNet学习_收发邮件
		
一.收发邮件 --->第一步:发邮件首先要有发送者的邮箱地址和登录的密码才能发送 这些都写在APP里 不要写死 --->第二步:发邮件就要有网络,要添加net.Mail命名空间 要发送的 ...
 - Outlook Express 收发邮件出现"0x800CCC0F"错误代码解决方法
		
非常多网友在使用Outlook Express收发邮件的过程中,有时能够发送邮件,但出现不能接收信件的问题.每次在收邮件都会在某个地方停止不动,然后报超时,出现错误代码0x800CCC19或0x800 ...
 - 用 Apache James 搭建邮件服务器来收发邮件实践(一)(转)
		
Apache James 简称 James, 是 Java Apache Mail Enterprise Server的缩写.James 是100%基于Java的电子邮件服务器.它是一种独立的邮件服务 ...
 - 跨平台的.NET邮件协议MailKit组件解析
		
发起的.NET Core开源组织号召,进展的速度是我自己也没有想到的,很多园友都积极参与(虽然有些人诚心砸场子,要是以我以前的宝脾气,这会应该被我打住院了吧,不过幸好是少数,做一件事总有人说好,也有人 ...
 - 用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 ...
 - c#使用QQ邮箱的SSL收发邮件
		
c#使用SMTP.QQ.COM的SSL验证时,收发邮件,请勿设置端口,代码如下: (1)虽然SSL端口是465,但是,在代码里,不能直接设置端口,很奇怪?挺奇怪,好吧腾讯SSL好像用的是587端口!! ...
 
随机推荐
- Linux 学习笔记04丨Linux的用户和用户组管理
			
Chapter 3. 用户和用户组管理 由于Linux系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以该账号身份进入系统. 3.0 用户与 ...
 - C++重复结构题解
			
买房子 总时间限制: 1000ms 内存限制: 65536kB 描述 某程序员开始工作,年薪N万,他希望在中关村公馆买一套60平米的房子,现在价格是200万,假设房子价格以每年百分之K增长,并且该 ...
 - 一条 sql 的执行过程详解
			
写操作执行过程 如果这条sql是写操作(insert.update.delete),那么大致的过程如下,其中引擎层是属于 InnoDB 存储引擎的,因为InnoDB 是默认的存储引擎,也是主流的,所以 ...
 - 基于gin的golang web开发:Gin技术拾遗
			
本文是对前几篇文章的一些补充,主要包含两部分:单元测试和实际项目中使用路由的小问题. 拾遗1:单元测试 Golang单元测试要求代码文件以_test结尾,单元测试方法以Test开头,参数为*testi ...
 - Cys_Control(五) MMenu
			
一.查看Menu原样式 1.通过Blend查看Menu原有样式 Menu的原有样式结构较为简单,由边框Border及集合控件 ItemsPresenter 组成,原有样式如下 <Style x: ...
 - PyQt(Python+Qt)学习随笔:model/view架构中QTableView视图的标题显示不正常问题
			
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 在进行QTableView展示数据时,使用了QStandardItemModel的model,并在将 ...
 - pandas 由其中几列生成新的列
			
data是一个dataframe #data["x1"]=data[["a","b"]].apply(lambda x:x["a& ...
 - pl/sql12;pl/sql14激活注册码
			
搜集的plsql 12激活码: Product Code(产品编号):4t46t6vydkvsxekkvf3fjnpzy5wbuhphqz serial Number(序列号):601769 pass ...
 - Day1 Scrum 冲刺博客
			
团队作业4--项目冲刺 第一篇博客 一. 各个成员在 Alpha 阶段认领的任务 蔡越,冷沐样:视觉元素设计与方块类Cell开发 周梓波,纪昂学:游戏功能逻辑开发,即抽象出主要元素对应的数据类型 廖业 ...
 - 半夜删你代码队 Day2冲刺
			
一.每日站立式会议 1.站立式会议 成员 昨日完成工作 今日计划工作 遇到的困难 陈惠霖 整理任务 了解相关网页设计 任务安排有的不合理,需改进 侯晓龙 学习了解相关知识 尝试写第一个实例子 无 周楚 ...