收發郵件之 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.pswp.cn/news/283761.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/283761.shtml
英文地址,請注明出處:http://en.pswp.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;再…