之前做过一个业务,就是发送邮件。
这里算是做一下回顾吧,今天再写一次。
可用于的业务场景:
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)); }; //实例化一个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