.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测试:

 

 我测了一下是没问题的,这里的话大家可以扩展一下。

晚安!

🌙 

 

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