大家都用过SmtpClient来处理发送邮件的操作,不过这个类以及被标记已过时,所以介绍一个微软推荐的库MailKit来处理。

MailKit开源地址:https://github.com/jstedfast/MailKit

新建一个控制台应用程序,将MailKit添加到项目中。

  1. Install-Package MailKit

新建一个IEmail接口。

  1. using MimeKit;
  2. using System.Threading.Tasks;
  3.  
  4. namespace EmailDemo
  5. {
  6. public interface IEmail
  7. {
  8. /// <summary>
  9. /// 发送Email
  10. /// </summary>
  11. /// <param name="message"></param>
  12. /// <returns></returns>
  13. Task SendEmailAsync(MimeMessage message);
  14. }
  15. }

实现

  1. using MailKit.Net.Smtp;
  2. using MimeKit;
  3. using System.Collections.Generic;
  4. using System.Threading.Tasks;
  5.  
  6. namespace EmailDemo
  7. {
  8. public class Email : IEmail
  9. {
  10. public async Task SendEmailAsync(MimeMessage message)
  11. {
  12. var host = "smtp.exmail.qq.com";
  13. var port = 465;
  14. var useSsl = true;
  15. var from_username = "123@meowv.com";
  16. var from_password = "...";
  17. var from_name = "测试";
  18. var from_address = "123@meowv.com";
  19.  
  20. var address = new List<MailboxAddress>
  21. {
  22. new MailboxAddress("111","111@meowv.com"),
  23. new MailboxAddress("222","222@meowv.com")
  24. };
  25.  
  26. message.From.Add(new MailboxAddress(from_name, from_address));
  27. message.To.AddRange(address);
  28.  
  29. using var client = new SmtpClient
  30. {
  31. ServerCertificateValidationCallback = (s, c, h, e) => true
  32. };
  33. client.AuthenticationMechanisms.Remove("XOAUTH2");
  34.  
  35. await client.ConnectAsync(host, port, useSsl);
  36. await client.AuthenticateAsync(from_username, from_password);
  37. await client.SendAsync(message);
  38. await client.DisconnectAsync(true);
  39. }
  40. }
  41. }

上面关于邮箱的账号密码服务器可以放在配置文件中,这里为了方便直接写了,演示了发送邮件到两个Email地址。

然后在Program.cs中使用依赖注入的方式调用。

  1. using Microsoft.Extensions.DependencyInjection;
  2. using MimeKit;
  3. using System;
  4. using System.Threading.Tasks;
  5.  
  6. namespace EmailDemo
  7. {
  8. class Program
  9. {
  10. static async Task Main(string[] args)
  11. {
  12. IServiceCollection service = new ServiceCollection();
  13.  
  14. service.AddSingleton<IEmail, Email>();
  15.  
  16. var provider = service.BuildServiceProvider().GetRequiredService<IEmail>();
  17.  
  18. var message = new MimeMessage
  19. {
  20. Subject = "我是邮件主题",
  21. Body = new BodyBuilder
  22. {
  23. HtmlBody = $"我是邮件内容,时间:{DateTime.Now:yyyy-MM-dd HH:mm:ss}"
  24. }.ToMessageBody()
  25. };
  26.  
  27. await provider.SendEmailAsync(message);
  28. }
  29. }
  30. }

以上演示了在 .NET Core 中发送邮件的示例,同时利用MailKit也可以接收邮件,这里使用场景不多,如有需要可以参考MailKitGitHub代码示例。

通常发送邮件可以提前写好HTML模板,然后将关键内容做字符串替换,这样发出去的就是一个比较美观的邮件了。

MailKit还支持将图片作为数据内容发送出去。

  1. using Microsoft.Extensions.DependencyInjection;
  2. using MimeKit;
  3. using MimeKit.Utils;
  4. using System;
  5. using System.Threading.Tasks;
  6.  
  7. namespace EmailDemo
  8. {
  9. class Program
  10. {
  11. static async Task Main(string[] args)
  12. {
  13. IServiceCollection service = new ServiceCollection();
  14.  
  15. service.AddSingleton<IEmail, Email>();
  16.  
  17. var provider = service.BuildServiceProvider().GetRequiredService<IEmail>();
  18.  
  19. var path = "D:\\bg.jpg";
  20.  
  21. var builder = new BodyBuilder();
  22.  
  23. var image = builder.LinkedResources.Add(path);
  24. image.ContentId = MimeUtils.GenerateMessageId();
  25.  
  26. builder.HtmlBody = $"当前时间:{DateTime.Now:yyyy-MM-dd HH:mm:ss} <img src=\"cid:{image.ContentId}\"/>";
  27.  
  28. var message = new MimeMessage
  29. {
  30. Subject = "带图片的邮件推送",
  31. Body = builder.ToMessageBody()
  32. };
  33.  
  34. await provider.SendEmailAsync(message);
  35. }
  36. }
  37. }

先在本地准备一张图片,利用ContentId的方式嵌入在img标签中,成功将其发送出去。

NET 5 收发邮件之 MailKit的更多相关文章

  1. mailkit库收发邮件

    mailkit库用于收发邮件.这个库可以替代C#自带的发邮件库 环境  W10 / VS2017CMMT / MailKit version="2.0.3" "net46 ...

  2. DouNet学习_收发邮件

    一.收发邮件 --->第一步:发邮件首先要有发送者的邮箱地址和登录的密码才能发送 这些都写在APP里  不要写死 --->第二步:发邮件就要有网络,要添加net.Mail命名空间 要发送的 ...

  3. Outlook Express 收发邮件出现&quot;0x800CCC0F&quot;错误代码解决方法

    非常多网友在使用Outlook Express收发邮件的过程中,有时能够发送邮件,但出现不能接收信件的问题.每次在收邮件都会在某个地方停止不动,然后报超时,出现错误代码0x800CCC19或0x800 ...

  4. 用 Apache James 搭建邮件服务器来收发邮件实践(一)(转)

    Apache James 简称 James, 是 Java Apache Mail Enterprise Server的缩写.James 是100%基于Java的电子邮件服务器.它是一种独立的邮件服务 ...

  5. 跨平台的.NET邮件协议MailKit组件解析

    发起的.NET Core开源组织号召,进展的速度是我自己也没有想到的,很多园友都积极参与(虽然有些人诚心砸场子,要是以我以前的宝脾气,这会应该被我打住院了吧,不过幸好是少数,做一件事总有人说好,也有人 ...

  6. 用Emacs收发邮件

    使用Emacs,将尽可能多的工作放到Emacs中来完成,这样可以提高工作效率. 1.安装必要的LISP插件和程序 $sudo apt-get install stunnel4 $sudo apt-ge ...

  7. Python收发邮件

    发送邮件使用SMTP协议,接受POP3或IMAP: 创建邮件内容email模块,发送邮件smtplib模块.发送邮件比较简单,只需先创建SMTP对象,登录服务器后根据发收邮箱地址发送即可: POP3接 ...

  8. 转--python -- 收发邮件

    官方 import smtplib from email.mime.text import MIMEText from email.header import Header # 发送邮箱服务器 smt ...

  9. c#使用QQ邮箱的SSL收发邮件

    c#使用SMTP.QQ.COM的SSL验证时,收发邮件,请勿设置端口,代码如下: (1)虽然SSL端口是465,但是,在代码里,不能直接设置端口,很奇怪?挺奇怪,好吧腾讯SSL好像用的是587端口!! ...

随机推荐

  1. python升级版本

    前言 目前大部分使用的3.6或者3.7以及更低版本存在不少问题,随着python的更新很多问题得到修复并且具有更多新的功能. 更新 3.y.x版本升级到3.y.z 下载需要升级的exe安装包点击upg ...

  2. DevOps Workshop | 代码管理入门:基于代码扫描实现团队效率提升

    CODING「DevOps Workshop 学习营地」持续火热进行中! 在这里,你可以轻松实践 DevOps 全流程.体验高效的云端开发.赢取精美礼品--第二期大奖「戴尔 U2718Q 显示器」将于 ...

  3. 【知识点】C/C++编码规范

    为了提高我们写的代码的可读性,本文章说一下C/C++的编码规范. 一.源文件头部的注释 /******************************************************* ...

  4. 自动化运维工具之Puppet常用资源(二)

    前文我们了解了部分puppet的资源的使用,以及资源和资源的依赖关系的定义,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/14071459.html:今天我们继 ...

  5. java42

    1.Random类 随机生成某个整数 Random r = new Random(); System.out.println(r.nextInt()); 伪随机数:第一次打印为随机,再次运行,数字将保 ...

  6. ④SpringCloud 实战:引入Hystrix组件,分布式系统容错

    这是SpringCloud实战系列中第4篇文章,了解前面第两篇文章更有助于更好理解本文内容: ①SpringCloud 实战:引入Eureka组件,完善服务治理 ②SpringCloud 实战:引入F ...

  7. charles抓包使用

    Proxy ---> Proxy Setting ---> HTTP Proxy (设置代理的端口) 设备和代理处于同一局域网,并在设备端配置IP,端口,然后监听请求. 抓取本机的请求

  8. 转:为什么说Python是最值得学习的编程语言

    老猿作为一个老程序员,研究生毕业后就没有这么用心的学过一门新的语言,而今年4月开始学Python以来,疯狂的迷上了它,有时很想写一篇为什么要学Python的文章,可一直懒没动笔,今天看到博友" ...

  9. PyQt(Python+Qt)学习随笔:QTreeWidget树型部件中的QTreeWidgetItem项构造方法

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 QTreeWidget树型部件的项是单独的类对象,这个类就是QTreeWidgetItem. QTr ...

  10. js将秒数转换为时分秒格式

    function secondToTimeStr(t) { if (!t) return; if (t < 60) return "00:" + ((i = t) < ...