背景

利用代码发送邮件在工作中还是比较常见的,相信大家都用过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 });
else
alternative.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.None
client.AuthenticationMechanisms.Remove("XOAUTH2");

client.Authenticate(config.MailFromAccount, config.MailPassword);
client.Send(emailMessage);
client.Disconnect(true);
}
}
}

public class Config
{
public int Port { get; set; } = 25; //25
public string Host { get; set; } //smtp.hantianwei.cn

public bool IsHtml { get; set; } = true;

public bool UseSsl { get; set; } = false;

public string MailFromAccount { get; set; }//mail@hantianwei.cn
public 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)
{
}
}
}
 
 

.NET CORE 下收发邮件之 MAILKIT的更多相关文章

  1. NET 5 收发邮件之 MailKit

    大家都用过SmtpClient来处理发送邮件的操作,不过这个类以及被标记已过时,所以介绍一个微软推荐的库MailKit来处理. MailKit开源地址:https://github.com/jsted ...

  2. 打造终端下mutt收发邮件环境(fbterm,fetchmail,msmtp,procmail,mutt)

    实现mutt下收发邮件须要安装,mutt,fbterm,fetchmail,msmtp,procmail 下面是各配置文件.在home文件夹下,隐私信息有马赛克... .muttrc : 当中Mail ...

  3. mailkit库收发邮件

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

  4. CentOS7下搭建邮件服务器(dovecot + postfix + SSL)

    CentOS   花了基本上两天的时间去配置CentOS7下的邮件服务器.其中艰辛太多了,一定得总结下. 本文的目的在于通过一系列配置,在CentOS 7下搭建dovecot + postfix + ...

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

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

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

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

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

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

  8. 在命令行上 使用 mutt, fetchmail, maildrop, msmtp 收发邮件

    基于shell 现在已经有了 Mail.app, Thunderbird, Outlook 这些图形化工具能很方便的处理邮件,为啥还需要 mutt 这种命令行文本方式的邮件工具呢?mutt 的一个优势 ...

  9. java中javamail收发邮件实现方法

    概述 1.邮件相关的标准 厂商所提供的 JavaMail 服务程序可以有选择地实现某些邮件协议,常见的邮件协议包括: SMTP(Simple Mail Transfer Protocol) :即简单邮 ...

  10. 4.5 .net core下直接执行SQL语句并生成DataTable

    .net core可以执行SQL语句,但是只能生成强类型的返回结果.例如var blogs = context.Blogs.FromSql("SELECT * FROM dbo.Blogs& ...

随机推荐

  1. VS Code编写stm32

    说明 virtual code实现编辑功能,其有强大的代码提示.代码阅读功能. 通过bat文件,通过cmd编译.下载,具体下载器设置仍需在keil软件中设置 具体代码调试仍需在keil软件下 项目配置 ...

  2. 苹果ios APP怎么打包?推荐这个网站

    众所周知,苹果的应用开发需要基于苹果电脑环境,而我们很多开发者并不具备这样的条件.如果你买一台贵的苹果电脑只是为了发布一个应用,成本太高了! 就算你有苹果电脑,你也可以自己开发一个基于web的IOS应 ...

  3. 7.29关灯游戏,用script实现

    <!DOCTYPE html> <html lang="en"> <head>     <meta charset="UTF-8 ...

  4. 2023-03-01 Error: Invalid hook call.Hooks can only be called inside of the body of a function component.

    问题描述:rn项目使用钩子useState,详细报错如下: Error: Invalid hook call. Hooks can only be called inside of the body ...

  5. socket简记-消息格式

    1 原理 1.1 数据格式 Packet header + Application body + Packet Tail 本协议中数据字节序为Little endian(超过一个字节的数据类型在内存中 ...

  6. 《Makefile中传递宏定义到源文件》

    Makefile中定义的变量无法直接传递到头文件中,因为头文件是在预编译阶段处理的,而Makefile中的变量是在编译阶段处理的. 如果需要在头文件中使用Makefile中定义的变量,可以在头文件中使 ...

  7. 《Makefile中变量的高级用法:变量的替换引用、变量的嵌套使用》

    高级使用方法有两种:第一种是变量的替换引用,第二种是变量的嵌套引用. 第一种用法经常用到,第二种用法我们很少使用.我们应该尽量避免使用变量的嵌套引用,在必须使用时,嵌套的层数越少越好.因为这种方法表达 ...

  8. [笔记] Android开发中的gradle是什么?

    gradle是什么? 先看下文档中的介绍   https://docs.gradle.org/current/userguide/what_is_gradle.html Gradle is an op ...

  9. STM32F407 HardFault_Handler 中断输出初步定位越界问题

    1.测试环境:MDK + STM32F407 2.汇编重写 HardFault_Handler  中断 3.根据输出 nextPoint 地址对照编译生成的 .map 文件 /* 硬件错误中断的回调 ...

  10. Android Studio相关配置说明

    介绍:Android Sdutio 是谷歌推出的一个 Android 集成开发工具. 现已将 SDK(software development kit)集成到 Android Studio 中.可以直 ...