.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));
            };

            //實例化一個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測試:

 

 我測了一下是沒問題的,這裏的話大家可以擴展一下。

晚安!

🌙 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章