.net core 发送邮件

我们很多时候在系统报错,抛异常的时候要提前预警,这个时候邮件是必不可少的。

第一步:首先确定一下,你所使用的方式,是通过外部邮箱(比如QQ还是163)还是内部邮箱

先新建一个model

using System;
using System.Collections.Generic;
using System.Text;

namespace WebApi.Core.Model
{
    public class MailModel
    {
        /// <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; }
    }
}

然后在新建一个helper类,这里面做了一个重载,传model那个是为了在接口测试方便,主要是使用第二个方法

里面的Appsettings是读取配置文件信息,如果没有可以在方法里面直接写,这里面的code 就是区分是外部还是内部了

如果你是外部的,就百度一下 比如163怎么获取授权码,很好找的,然后给mails.code 赋值就可以了,如果是外部的host查一下你所使用的地址(目前只写了两个常用的)

如果是局域网(我使用的就是内部的邮箱)就把你要当做发件人的 密码 赋值给 mails.code 并且 Host 配置 是你邮箱服务器的IP地址,可以用IP也可以用域名

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Mail;
using System.Text;
using System.Threading.Tasks;
using WebApi.Core.Model;

namespace WebApi.Core.Common
{
    /// <summary>
    /// 发送邮件帮助类
    /// 创建人:金永宝
    /// 创建时间:2020年8月11日
    /// </summary>
    public static class SendMailHelper
    {
        /// <summary>
        /// 根据实体类发送邮件
        /// 创建人:金永宝
        /// 创建时间:2020年8月11日
        /// </summary>
        /// <param name="mails"></param>
        /// <returns></returns>
        public static void SendMail(MailModel mails)
        {
            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;

            //实例化一个Smtp客户端
            SmtpClient smtp = new SmtpClient();
            //将发件人的邮件地址和客户端授权码带入以验证发件人身份
            smtp.Credentials = new System.Net.NetworkCredential(mails.fromPerson, mails.code);
            //指定SMTP邮件服务器
            smtp.Host = mails.host;

            //邮件发送到SMTP服务器
            smtp.Send(mailMessage);
        }

        /// <summary>
        /// 根据内容发送邮件(读取配置信息)
        /// 创建人:金永宝
        /// 创建时间:2020年8月11日
        /// </summary>
        /// <param name="mailTitle"></param>
        /// <param name="mailBody"></param>
        /// <returns></returns>
        public static void SendMail(string mailTitle,string mailBody)
        {
            
            MailModel mails = new MailModel();
            mails.fromPerson = AppSettings.app(new string[] { "AppSettings", "MailSetting", "FromPerson" });
            mails.code = AppSettings.app(new string[] { "AppSettings", "MailSetting", "PassWord" });
            mails.recipientArry = AppSettings.app(new string[] { "AppSettings", "MailSetting", "RecipientArry" }).Split(',');
            mails.mailCcArray = AppSettings.app(new string[] { "AppSettings", "MailSetting", "MailCcArray" }).Split(',');
            mails.mailBody = mailBody;
            mails.mailTitle = mailTitle;
            mails.host= AppSettings.app(new string[] { "AppSettings", "MailSetting", "Host" });

            string[] sArray = mails.fromPerson.Split(new char[2] { '@', '.' });
            if (sArray[1] == "qq")
            {
                mails.host = "smtp.qq.com";//如果是QQ邮箱则:smtp.qq.com,
            }
            else if (sArray[1] == "163")
            {
                mails.host = "smtp.163.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;

            //实例化一个Smtp客户端
            SmtpClient smtp = new SmtpClient();
            //将发件人的邮件地址和客户端授权(局域网用密码)码带入以验证发件人身份
            smtp.Credentials = new System.Net.NetworkCredential(mails.fromPerson, mails.code);
            //指定SMTP邮件服务器
            smtp.Host = mails.host;

            //邮件发送到SMTP服务器
            smtp.Send(mailMessage);
        }
    }
}

这是我的appsettings.json配置文件

//邮箱配置
    "MailSetting": {
      "Code": "asdaasdasdas", //授权码
      "PassWord": "123456",  //发件人邮箱的密码
      "FromPerson": "ceshi@cc.net", //发件人
      "RecipientArry": "ceshi@cc.net,ceshi2@cc.net", //多个收件人用,号分割
      "MailCcArray": "kaifalist@cc.net", //抄送 多个人用逗号分割
      "IsbodyHtml": true, //是否邮件体为Html
      "Host": "192.168.5.30" //smtp 服务器地址
    }

 我用的outlook   那个服务器信息 就是host ,密码在这里 也可以设置

工具-账户设置-双击你的邮箱

最后就是调用直接传入标题和内容就可以了。亲测是可以的。我的版本是.net core 3.1

 

posted @ 2020-08-11 15:34  srsly  阅读(1000)  评论(0编辑  收藏  举报