收发邮件之 MAILKIT

背景

利用代码发送邮件在工作中还是比较常见的,相信大家都用过SmtpClient来处理发送邮件的操作,不过这个类以及被标记已过时,所以介绍一个微软推荐的库MailKit来处理。

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

需要邮件功能

1、服务提供方:需提供邮件收发客户端或Web服务。如:QQ邮箱、GMail邮箱、126、163等知名邮件服务提供商。注:如果你使用的第三方不知名邮件服务商提供的邮件收发服务,通过其发出的邮件,可能会被其他知名邮件服务提供商的STMP服务器视为是"恶意邮件或垃圾邮件"!

2、消息推送:消息推送方

3、App:某些网站会员的注册功能或者功能激活功能。

协议

1、SMTP(Simple Mail Transfer Protocol)   ---简单邮件传输协议

2、POP3(Post Office Protocol -Version3)   ---邮局协议第三个版本

代码实现

1、新建项目 引用 MailKit

using MailKit.Net.Smtp;using MimeKit;

2、指定发件人、收件人、附件等信息

[HttpPost][Route("sendmail")]public bool Sendmail(SendmailDto model){string mailTo = model.mail;string title = model.title;string requestId = Guid.NewGuid().ToString("N");string path = WriteFilepath(requestId, title + ".html", model.str);string docpath = path.Replace(".html", ".docx");try{string applicationRoot = AppContext.BaseDirectory;var provider = new PhysicalFileProvider(applicationRoot);string apath = @"C:/www/fengnan";// string apath = @"C:/net6.0";var filePath =//applicationRoot +apath + $"/Template/fldoc/" + requestId + "/";var filePath2 =//applicationRoot +apath + $"/Template/fldoc/" + requestId + "/"+ title + ".html";ecmd("soffice --headless --convert-to docx:\"Office Open XML Text\" " + filePath2 + " --outdir " + filePath);//   string docpath = path.Replace(".html", ".docx");}catch (Exception ex){_logger.Error(ex);}// string mailFrom = "xxxx@qq.com";string mailFrom = "xxx@xx.net";//   mailTo = "xx@xxx.com";string Text = "内容见附件,请查收<br/> 感谢";string mailFromAccount = "xxx@qq.com";string mailPassword = "xxxx";string mailFromAccount = "xxx@xx.net";string mailPassword = "xxxx@";var contentRoot = Directory.GetCurrentDirectory();var webRoot = Path.Combine(contentRoot, "wwwroot");///  string path = Path.Combine(webRoot, "Images/icc.png");//  string path = @"D:\xxxx知.html";//  string Text = @"Hey Chandler,//I just wanted to let you know that Monica and I were going to go play some paintball, you in?//-- Joey";Config eConfig = new Config{                From = new MailAddress("xxxx", mailFrom),//  Host = "smtp.qq.com",                Host = "smtp.exmail.qq.com",                MailFromAccount = mailFromAccount,                MailPassword = mailPassword,// Port = 587,                Port = 465,                UseSsl = true,                IsHtml = true};List<MailAddress> tos = new List<MailAddress>();tos.Add(new MailAddress("", mailTo));List<string> flist = new List<string>();if (System.IO.File.Exists(docpath)){flist.Add(docpath);//docpath}else{flist.Add(path);}Mailhelper.SendEmail(eConfig, tos, title, Text, flist.ToArray());return true;}

3、发邮件帮助类

using MimeKit;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Threading.Tasks;
namespace DFTech.Service.Filters
{/// <summary>/// 发邮件/// </summary>public class Mailhelper{/// <summary>/// 发邮件/// </summary>/// <param name="config"></param>/// <param name="tos"></param>/// <param name="subject"></param>/// <param name="message"></param>/// <param name="attachments"></param>/// <returns></returns>public  static void SendEmail(Config config, List<MailAddress> tos, string subject, string message, params string[] attachments){var emailMessage = new MimeMessage();emailMessage.From.Add((MailboxAddress)config.From);foreach (var to in tos)emailMessage.To.Add(to as MailAddress);emailMessage.Subject = subject;var alternative = new Multipart("alternative");if (config.IsHtml)alternative.Add(new TextPart("html") { Text = message });elsealternative.Add(new TextPart("plain") { Text = message });if (attachments != null){foreach (string f in attachments){var attachment = new MimePart()//("image", "png"){ContentObject = new ContentObject(File.OpenRead(f), ContentEncoding.Default),ContentDisposition = new ContentDisposition(ContentDisposition.Attachment),ContentTransferEncoding = ContentEncoding.Base64,FileName = Path.GetFileName(f)};alternative.Add(attachment);}}emailMessage.Body = alternative;using (var client = new SmtpClient()){client.Connect(config.Host, config.Port, config.UseSsl);// SecureSocketOptions.Noneclient.AuthenticationMechanisms.Remove("XOAUTH2");client.Authenticate(config.MailFromAccount, config.MailPassword);client.Send(emailMessage);client.Disconnect(true);}}}public class Config{public int Port { get; set; } = 25; //25public string Host { get; set; } //smtp.hantianwei.cnpublic bool IsHtml { get; set; } = true;public bool UseSsl { get; set; } = false;public string MailFromAccount { get; set; }//mail@hantianwei.cnpublic string MailPassword { get; set; }public MailAddress From { get; set; }}/// <summary>////// </summary>public class MailAddress : MailboxAddress{public MailAddress(string name, string address) : base(name, address){}public MailAddress(Encoding encoding, string name, string address) : base(encoding, name, address){}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/283761.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IOS_SearchBar搜索栏及关键字高亮

搜索框的效果演示: 这个就是所谓的搜索框了,那么接下来我们看看如何使用代码来实现这个功能. 我所使用的数据是英雄联盟的英雄名单,是一个JSON数据的txt文件, JSON数据的处理代码如下所示: ?123456//获取文件的路径pathNSString *path [[NSBundle mainBundle] pathForResourc…

Java设计模式之(工厂模式)--简单工厂模式--工厂方法模式--抽象工厂模式

工厂模式&#xff1a; 工厂模式可以分为三类&#xff1a; 1&#xff09;简单工厂模式&#xff08;Simple Factory&#xff09; 2&#xff09;工厂方法模式&#xff08;Factory Method&#xff09; 3&#xff09;抽象工厂模式&#xff08;Abstract Factory&#xff09; 简单工…

今天很多 CTO 都是被干掉的,因为他没有成就业务

作者&#xff5c;乔新亮 编辑&#xff5c;邓艳琴 我可以丝毫不开玩笑地说&#xff0c;今天&#xff0c;很多传统企业里的研发都只是“工人”&#xff0c;哪怕是 CTO&#xff0c;充其量也只是“高级工人”&#xff0c;如果不转换思维去成就业务&#xff0c;就只能停留在工人级…

中航工业集团金网络(北京)电子商务有限公司副总经理刘正珩:航空“智”造的供应链支撑平台...

编者按 “十三五”时期是我国贸易发展的重要战略机遇期&#xff0c;物流产业发展迅速&#xff0c;智慧供应链已经成为推动流通大国向流通强国过程中的重要行动。6月2日&#xff0c;由上海市国有资产监督管理委员会、上海市邮政管理局、上海市商务委员会指导&#xff0c;上海市国…

创建、检查和反编译世界上(几乎)最短的 C# 程序

创建、检查和反编译世界上&#xff08;几乎&#xff09;最短的 C# 程序原文来自https://www.stevejgordon.co.uk/creating-inspecting-decompiling-the-worlds-smallest-csharp-program在这篇文章中&#xff0c;我认为创建世界上&#xff08;几乎&#xff09;最短的 C# 程序然后…

Linux下画原理图和PCB

Linux下画原理图和PCBWindows下大名鼎鼎的Allegro和经典的Protel 99SE都是不支持Linux操作系统的。做Linux驱动开发免不了要看一下原理图和PCB。一般的做法有三种&#xff1a; 1.主机使用Windows系统&#xff0c;将Linux装在VMWARE之类的虚拟机中这样能够使用Windows下的软件看…

配置中心 App Configuration (二):Feature Flag 功能开关特性

写在前面Web服务开发过程中我们经常有这样的需求&#xff1a;某些功能我必须我修改了配置才启用&#xff0c;比如新用户注册送券等&#xff1b;某个功能需到特定的时间才启用&#xff0c;过后就失效&#xff0c;比如春节活动等&#xff1b;某些功能&#xff0c;我想先对10%的用…

oracle临时表空间

--查看临时表空间SELECT * FROM v$tablespace;SELECT * FROM dba_tablespaces;--查看所有临时表空间文件SELECT * FROM dba_data_files;--查看临时临时表空间文件SELECT * FROM dba_temp_files;--查看临时表空间组SELECT * FROM dba_tablespace_groups; --查找默认临时表空间SE…

ES 2022 正式发布!有哪些新特性?

2022 年 6 月 22 日&#xff0c;第 123 届 Ecma 大会批准了 ECMAScript 2022 语言规范[1]&#xff0c;这意味着它现在正式成为标准。 1 ECMAScript 2022编辑 本次发布的编辑有&#xff1a; Shu-yu Guo[2] Michael Ficarra[3] Kevin Gibbons[4] 2 ECMAScript 2022有什么新内…

联想(Lenovo)小新310经典版进bios方法

1&#xff0c;找到novo按钮。 2&#xff0c;在关机的状态下桶一下小孔&#xff0c;不用任何操作&#xff0c;电脑进入bios选择界面。转载于:https://www.cnblogs.com/senior-engineer/p/6761457.html

C#中的匿名类型

这节来讲一下C#中的匿名类型。匿名类在C#中&#xff0c;我们可以不去显示的声明一个类&#xff0c;而是通过匿名类去临时声明一个类结构去帮助我们去完成一些功能。声明一个匿名类&#xff0c;我们可以像下面这样做&#xff1a;var Anonymousnew {name"charles",year…

MySQL之MHA高可用集群

目录 一、MHA概述 1.1.MHA 是什么 1.2.MHA 的组成 1.3.MHA 的特点 二、MHA搭建准备 2.1.实验思路 三、MHA搭建 3.1配置主从复制 3.2.安装 MHA 软件 3.3.故障模拟 3.4.故障修复 四、总结 一、MHA概述 1.1.MHA 是什么 1.MHA&#xff08;MasterHigh Availability&…

Tensorflow之安装

1.fellow the instruction of https://www.tensorflow.org/install/install_linux#installing_with_anaconda 2.anaconda安装&#xff0c;修改~/.bash_profile为 export PATH~/anaconda2/bin:/usr/local/cuda/bin:$PATHexport LD_LIBRARY_PATH/usr/local/cuda/lib64:$LD_LIBRAR…

2、Saltstack的数据系统

一、Grainsgrains是salt用来收集minion端底层系统信息的接口。比如&#xff0c;操作系统type、域名 、IP地址、内存及其他相关系统属性信息等。存储在minion端&#xff0c;用于保存minion端数据信息。minion启动时才加载grains信息&#xff0c;所以他时静态的&#xff0c;Grain…

配置中心 App Configuration (一):轻松集成到Asp.Net Core

写在前面在日常开发中&#xff0c;我这边比较熟悉的配置中心有&#xff0c;携程Apollo&#xff0c;阿里Nacos(配置中心&#xff0c;服务治理一体)之前文章&#xff1a;Asp.Net Core与携程阿波罗(Apollo)的第一次亲密接触总体来说&#xff0c;Apollo和Nacos社区都比较活跃&#…

stop-hbase.sh一直处于等待状态

今天关闭HBase时&#xff0c;输入stop-hbase.sh一直处于等待状态 解决方法&#xff1a; 先输入&#xff1a;hbase-daemon.sh stop master 再输入&#xff1a;stop-hbase.sh就可以关闭HBase集群了。 转载于:https://www.cnblogs.com/lijinze-tsinghua/p/8667761.html

shell编程100例

1、编写hello world脚本 #!/bin/bash# 编写hello world脚本echo "Hello World!"2、通过位置变量创建 Linux 系统账户及密码 #!/bin/bash# 通过位置变量创建 Linux 系统账户及密码#$1 是执行脚本的第一个参数,$2 是执行脚本的第二个参数 useradd "$1" …

sqlserver 分页

select top 10 numComImg.* from( select row_number() over(order by id asc) as rownumber,* from (select * FROM [TCCLine].[dbo].[CLine_CommonImage]) as comImg)as numComImg where rownumber>40select top 10 * --10 为页大小from [TCCLine].[dbo].[CLine_CommonIma…

详解SpringMVC中Controller的方法中参数的工作原理[附带源码分析] good

目录 前言现象源码分析 HandlerMethodArgumentResolver与HandlerMethodReturnValueHandler接口介绍HandlerMethodArgumentResolver与HandlerMethodReturnValueHandler接口的具体应用常用HandlerMethodArgumentResolver介绍常用HandlerMethodReturnValueHandler介绍本文开头现象…

instancing render

当要绘制同一个东西很多次的时候&#xff0c;最简单的想法可能是循环调用glDrawArrays()&#xff0c;但这样会造成性能的损失。因为当显卡在渲染一个物体的时候&#xff0c;可能并不需要太多时间&#xff0c;但系统会花大量的时间&#xff0c;频繁的调用draw命令&#xff0c;再…