.Net Core 发送邮件
之前做过一个业务,就是发送邮件。
这里算是做一下回顾吧,今天再写一次。
可用于的业务场景:
1.提醒消息,例如会员到期、降价通知;
2.验证登录,发送code;
... ...
首先要拿到我们的客户端授权码
QQ:先进入QQ邮箱,点击设置
tab栏选择账户
往下滑
开启SMTP服务
然后发送短信到指定号码,就能得到授权码
163邮箱:先登录163官网
选择常规设置
然后设置SMTP服务
开启客户端授权码
这里我只举例这两个较常用的邮箱
下面是Code部分
首先说一下我这是webapi的项目,前端表单部分没有写,只写了接口
先建一个邮件类
/// <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 }); } }
用PostMan测试:
我测了一下是没问题的,这里的话大家可以扩展一下。
晚安!
🌙
作者:江北
出处:https://www.cnblogs.com/zhangnever/p/11926020.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
微信:CodeDoraemon
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现