.NET Core 下收发邮件之 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);    }}

然后添加Email.cs实现这个接口。

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标签中,成功将其发送出去。

(0)

相关推荐

  • 结合 AOP 轻松处理事件发布处理日志

    结合 AOP 轻松处理事件发布处理日志 Intro 前段时间,实现了 EventBus 以及 EventQueue 基于 Event 的事件处理,但是没有做日志(EventLog)相关的部分,原本想增 ...

  • 如何使用thrift 服务引擎组件

    在本文中将介绍如何通过thrift 组件集成到surging 微服务引擎中,然后可以选择dotnetty 或thrift作为服务远程调用RPC,也可以通过其它语言的thrift 调用surging 服 ...

  • WebAPI-HTTP编程模型

    带着问题去思考,大家好! 它是什么?它包含什么?它能干什么? 消息 HTTP编程模型的核心就是消息抽象,表示为:HttPRequestMessage,HttpResponseMessage.用于客户端 ...

  • async,await执行流看不懂?看完这篇以后再也不会了

    一:案例一 [嵌套下的异步] 写了这么多年的程序,相信大家都知道连接数据库少不了这几个对象,DbConnection,DbCommand,DbDataReader等等..先来看看ContinueWit ...

  • 日志框架NLog之将日志发送到邮件

    背景 NLog可以将日志输出到不同的媒介上,邮件是其中一个,通过邮件可以让我们第一时间收到信息.使用SMTP协议通过电子邮件发送日志消息.与FallbackGroup Target很好地结合在一起,以 ...

  • C# 异步编程

    基于Task的异步编程模式(TAP)是Microsoft为.Net平台下使用Task进行编程所提供的一组建议,这种模式提供了可以被await消耗(调用)方法的APIs,并且当使用async关键字编写遵 ...

  • .NET Core 下使用 Log4Net 记录日志

    Log4Net相信大家都很熟悉了,算是比较主流和著名的日志组件了. 最佳实践 在项目中添加组件包 Install-Package log4net 添加log4net.config文件 <?xml ...

  • .NET Core 下的 API 网关

    网关介绍 网关其实就是将我们写好的API全部放在一个统一的地址暴露在公网,提供访问的一个入口.在 .NET Core下可以使用Ocelot来帮助我们很方便的接入API 网关.与之类似的库还有Proxy ...

  • Dotnet Core下的Channel, 你用了吗?

    今天给大家分享一个微软官方的好东西:Channel. 前言 今天给大家分享一个微软官方的生产者/消费者方案的特性解决:Channel. Channel在System.Threading.Channel ...

  • 唐河县特岗信息技术面试试讲以下网络应用中,带宽要求最低的应用是( )。收发邮件网上视频聊天数字电视可视电话

    以下网络应用中,带宽要求最低的应用是(  ). 收发邮件 网上视频聊天 数字电视 可视电话唐河县特岗信息技术面试试讲

  • 1949-1950年收发邮件路单二件

    1949-1950年收发邮件路单二件:其中一件销京沪杭(民国)卅八年三月十六火车邮局戳,另一件销浙赣路一九五〇年六月十七火车邮局戳,保存完好

  • 如何只让登录公司邮箱收发邮件、只让登录特定的邮箱收发邮件

    在企业网络管理中,有时候我们处于网络安全的管理,常常需要监控邮箱使用,往往只让使用公司内部邮箱而禁止使用互联网邮箱.只让登录特定邮箱而禁止随意打开网页邮箱?如何实现呢?大势至电脑文件防泄密系统(下载地 ...

  • 详解Net Core Web Api项目与在NginX下发布

    前言 本文将介绍Net Core的一些基础知识和如何NginX下发布Net Core的WebApi项目. 测试环境 操作系统:windows 10 开发工具:visual studio 2019 框架 ...

  • 新媒体下邮件推广的四个趋势

    如果你还用着QQ号,那么,你就会拥有一个QQ邮箱,而且细心的你有没有发现,当你打开QQ的时候,有时候会有一个邮件广告信息突然而至,而访问QQ的时候,更会发现,QQ邮箱拦截了好多广告邮件,这说明了两个问 ...

  • 【邮件合并】修改域状态下的日期和数值显示方式

    不知道大家注意到过没有,在邮件合并的时候,涉及到的日期字段,在Excel中明明是"年月日"的显示格式,可是通过合并域合并到Word中后却显示为类似"2/4/2015&qu ...