我们很多时候在系统报错,抛异常的时候要提前预警,这个时候邮件是必不可少的。
第一步:首先确定一下,你所使用的方式,是通过外部邮箱(比如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