这是一个基于MimeKit的跨平台.NET邮件库,支持IMAP、POP3、SMTP协议。它相比.NET自带的SmtpClient,支持更广泛的协议和更现代的电子邮件标准。因此微软官方建议,SmtpClient只用来兼容老应用,如果开发新应用的话,直接使用MailKit。
一、首先要拿到我们的客户端授权码
QQ:先进入QQ邮箱,点击设置
![](https://i-blog.csdnimg.cn/blog_migrate/d552fc22490b7c1a0bdcf99088b32f73.png)
二、开启SMTP服务
![](https://i-blog.csdnimg.cn/blog_migrate/8053b067fb5b392e119e1f481276b6bf.png)
然后发送短信到指定号码,就能得到授权码
先建一个邮件类
/// <summary>
/// 邮件类
/// </summary>
public class Mail
{
/// <summary>
/// 发送人
/// </summary>
public string fromPerson { get; set; }
/// <summary>
/// 收件人地址(多人)
/// </summary>
public string[] recipientArry { get; set; }
/// <summary>
/// 抄送地址(多人)
/// </summary>
public string[] mailCcArray { get; set; }
/// <summary>
/// 标题
/// </summary>
public string mailTitle { get; set; }
/// <summary>
/// 正文
/// </summary>
public string mailBody { get; set; }
/// <summary>
/// 客户端授权码(可存在配置文件中)
/// </summary>
public string code { get; set; }
/// <summary>
/// SMTP邮件服务器
/// </summary>
public string host { get; set; }
/// <summary>
/// 正文是否是html格式
/// </summary>
public bool isbodyHtml { get; set; }
/// <summary>
/// 接收文件
/// </summary>
public List<IFormFile> files { get; set; }
}
控制器代码:
[Route("api/[controller]/[action]")]
[ApiController]
public class SendMailController
{
private readonly Mail _mail;
private readonly IHostingEnvironment _hostingEnvironment;
public SendMailController(Mail mail,
IHostingEnvironment hostingEnvironment)
{
_mail = mail;
_hostingEnvironment = hostingEnvironment;
}
/// <summary>
/// 发送邮件
/// </summary>
[HttpPost]
public async Task<IActionResult> PostEmails([FromForm]Mail mails)
{
//截取发件人邮箱地址从而判断Smtp的值
string[] sArray = mails.fromPerson.Split(new char[2] { '@', '.' });
if (sArray[1] == "qq")
{
mails.host = "smtp.qq.com";//如果是QQ邮箱则:smtp.qq.com,依次类推 163:smtp.163.com
}
else if (sArray[1] == "163")
{
mails.host = "smtp.163.com";//如果是QQ邮箱则:smtp.qq.com,依次类推 163:smtp.163.com
}
//将发件人邮箱带入MailAddress中初始化
MailAddress mailAddress = new MailAddress(mails.fromPerson);
//创建Email的Message对象
MailMessage mailMessage = new MailMessage();
//判断收件人数组中是否有数据
if (mails.recipientArry.Any())
{
//循环添加收件人地址
foreach (var item in mails.recipientArry)
{
if (!string.IsNullOrEmpty(item))
mailMessage.To.Add(item.ToString());
}
}
//判断抄送地址数组是否有数据
if (mails.mailCcArray.Any())
{
//循环添加抄送地址
foreach (var item in mails.mailCcArray)
{
if (!string.IsNullOrEmpty(item))
mailMessage.To.Add(item.ToString());
}
}
//发件人邮箱
mailMessage.From = mailAddress;
//标题
mailMessage.Subject = mails.mailTitle;
//编码
mailMessage.SubjectEncoding = Encoding.UTF8;
//正文
mailMessage.Body = mails.mailBody;
//正文编码
mailMessage.BodyEncoding = Encoding.Default;
//邮件优先级
mailMessage.Priority = MailPriority.High;
//正文是否是html格式
mailMessage.IsBodyHtml = mails.isbodyHtml;
//取得Web根目录和内容根目录的物理路径
string webRootPath = string.Empty;
//添加附件
foreach (IFormFile item in mails.files)
{
//路径拼接
//webRootPath = _hostingEnvironment.WebRootPath + "\\" + "upload-file" + "\\" + DateTime.Now.ToString("yyyyMMddHHmmssfff") + Path.GetFileNameWithoutExtension(item.FileName) + Path.GetExtension(item.FileName).ToLower();
//创建文件流
//using (var FileStream = new FileStream(webRootPath, FileMode.Create))
//{
//拷贝文件流
//await item.CopyToAsync(FileStream);
//释放缓存
//FileStream.Flush();
//}
//再根据路径打开文件,得到文件流
//FileStream stream = new FileStream(webRootPath, FileMode.Open);
//添加至附件中
//mailMessage.Attachments.Add(new Attachment(stream, item.FileName)); mailMessage.Attachments.Add(new Attachment(item.OpenReadStream(),item.FileName));
};
//实例化一个Smtp客户端
SmtpClient smtp = new SmtpClient();
//将发件人的邮件地址和客户端授权码带入以验证发件人身份
smtp.Credentials = new System.Net.NetworkCredential(mails.fromPerson, mails.code);
//指定SMTP邮件服务器
smtp.Host = mails.host;
//邮件发送到SMTP服务器
smtp.Send(mailMessage);
return new JsonResult(new
{
message = "发送成功",
code = 200,
success = true
});
}
}
安装包
首先,使用NuGet安装MailKit:
Visual Studio
Install-Package MailKit
发现支持各种框架
![](https://i-blog.csdnimg.cn/blog_migrate/ddf8b904995761a8ad638bef02cbf752.png)
参考