之前做過一個業務,就是發送郵件。
這里算是做一下回顧吧,今天再寫一次。
可用於的業務場景:
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測試:
我測了一下是沒問題的,這里的話大家可以擴展一下。
晚安!
🌙