做网站比较好,做网站赚钱吗,wordpress主题解压后有多个文件,短视频舆情前言
邮件帮助类#xff08;smtp协议#xff09;#xff0c;需要NuGet引用MailKit包#xff0c;包含了同步发送邮件#xff08;SendEmail)、异步发送邮件#xff08; SendEmailAsync#xff09;方法#xff0c;由于非企业邮箱每日有发送限额#xff0c;故代码中支持轮…前言
邮件帮助类smtp协议需要NuGet引用MailKit包包含了同步发送邮件SendEmail)、异步发送邮件 SendEmailAsync方法由于非企业邮箱每日有发送限额故代码中支持轮询多个邮箱当某个邮箱超限时标记为不可用状态当天不再使用以确保邮件正常发送成功同时支持多种邮箱类型见下表。
下表为常用邮箱服务器的地址和端口SMTP/POP
邮箱类型SMTP-服务器地址SMTP-端口号POP-服务器地址POP-端口号是否SSL163邮箱smtp.163.com25pop.163.com110否126邮箱smtp.126.com25pop.126.com110否139邮箱smtp.139.com25pop.139.com110否QQ邮箱smtp.qq.com25pop.qq.com110否QQ企业邮箱smtp.exmail.qq.com587/465pop.exmail.qq.com995是Gmail邮箱smtp.gmail.com587pop.gmail.com995是Foxmail邮箱smtp.foxmail.com25pop.foxmail.com110否Sina邮箱smtp.sina.com.cn25pop3.sina.com.cn110否SinaVIP邮箱smtp.vip.sina.com25pop3.vip.sina.com110否Sohu邮箱smtp.sohu.com25pop3.sohu.com110否Yahoo邮箱smtp.mail.yahoo.com.cn587pop.mail.yahoo.com.cn995是
代码中的email.json格式如下请自行配置个人邮箱
[{Host: smtp.163.com,EnableSsl: true,Port: 465,SendAddress: xxxx163.com,LoginPassword: 邮箱登录密码,Password: smtp分配的密码代码中使用此密码,CanUse: true}
]代码示例
using MailKit.Net.Smtp;
using MimeKit;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.IO;
using System.Threading.Tasks;
using VW.API.Common.Models;namespace VW.API.Common.Utils
{/// summary/// EmailHelper 的摘要说明邮件帮助类/// /summarypublic class EmailHelper{private static readonly string _emailConfigPath Path.Combine(AppDomain.CurrentDomain.BaseDirectory, Configs/email.json);/// summary/// 创建Email/// /summary/// param nameemail邮箱地址/param/// param namesubject邮件主题/param/// param namemessage邮件内容/param/// param nameattachments附件/param/// returnsEmail/returnsprivate static SmtpClient GetSmtpClient(string email, string subject, string message, Liststring attachments, EmailModel emailModel, out MimeMessage mimeMessage){try{var client new SmtpClient();client.MessageSent (sender, args) {LogHelper.Error(args.Message.ToString());};client.ServerCertificateValidationCallback (sender, certificate, certChainType, errors) true;client.Connect(emailModel.Host, emailModel.Port, emailModel.EnableSsl);client.Authenticate(emailModel.SendAddress, emailModel.Password);mimeMessage new MimeMessage();mimeMessage.From.Add(new MailboxAddress(emailModel.SendAddress, emailModel.SendAddress));mimeMessage.To.Add(new MailboxAddress(email, email));mimeMessage.Subject subject;var builder new BodyBuilder();builder.HtmlBody message;foreach (var attachment in attachments){builder.Attachments.Add(attachment);}mimeMessage.Body builder.ToMessageBody();return client;}catch (Exception) { throw; }}/// summary/// 发送邮件同步/// /summary/// param nameemail邮箱地址/param/// param namesubject邮件主题/param/// param namemessage邮件内容/param/// param nameattachments附件/param/// returnsbool/returnspublic static bool SendEmail(string email, string subject, string message, Liststring attachments null){bool success false;string lastDayFilePath Path.Combine(AppDomain.CurrentDomain.BaseDirectory, $Configs/{DateTime.Now.AddDays(-1).ObjToDateSplitYMD()}.email.json);FileHelper.DeleteFile(lastDayFilePath);string todayFilePath Path.Combine(AppDomain.CurrentDomain.BaseDirectory, $Configs/{DateTime.Now.ObjToDateSplitYMD()}.email.json);if (!FileHelper.IsExistFile(todayFilePath))FileHelper.Copy(_emailConfigPath, todayFilePath, true);ListEmailModel emailModels JsonConvert.DeserializeObjectListEmailModel(FileHelper.FileToString(todayFilePath));foreach (EmailModel emailModel in emailModels){if (!emailModel.CanUse)//不能使用continue;try{var client GetSmtpClient(email, subject, message, attachments, emailModel, out MimeMessage mimeMessage);client.Send(mimeMessage);client.Disconnect(true);//client.Dispose();success true;break;}catch (Exception ex){LogHelper.Error(JsonConvert.SerializeObject(emailModel));LogHelper.Error(ex.ToString());emailModel.CanUse false;success false;}}FileHelper.WriteText(todayFilePath, JsonConvert.SerializeObject(emailModels));return success;}/// summary/// 发送邮件异步/// /summary/// param nameemail邮箱地址/param/// param namesubject邮件主题/param/// param namemessage邮件内容/param/// param nameattachments附件/param/// returnsbool/returnspublic static async Taskbool SendEmailAsync(string email, string subject, string message, Liststring attachments){bool success false;string lastDayFilePath Path.Combine(AppDomain.CurrentDomain.BaseDirectory, $Configs/{DateTime.Now.AddDays(-1).ObjToDateSplitYMD()}.email.json);FileHelper.DeleteFile(lastDayFilePath);string todayFilePath Path.Combine(AppDomain.CurrentDomain.BaseDirectory, $Configs/{DateTime.Now.ObjToDateSplitYMD()}.email.json);if (!FileHelper.IsExistFile(todayFilePath))FileHelper.Copy(_emailConfigPath, todayFilePath, true);ListEmailModel emailModels JsonConvert.DeserializeObjectListEmailModel(FileHelper.FileToString(todayFilePath));foreach (EmailModel emailModel in emailModels){if (!emailModel.CanUse)//不能使用continue;try{var client GetSmtpClient(email, subject, message, attachments, emailModel, out MimeMessage mimeMessage);await client.SendAsync(mimeMessage);client.Disconnect(true);//client.Dispose();success true;break;}catch (Exception ex){LogHelper.Error(JsonConvert.SerializeObject(emailModel));LogHelper.Error(ex.ToString());emailModel.CanUse false;success false;}}FileHelper.WriteText(todayFilePath, JsonConvert.SerializeObject(emailModels));return success;}}
}namespace VW.API.Common.Models
{/// summary/// EmailModel/// /summarypublic class EmailModel{/// summary/// 主机地址/// /summarypublic string Host { set; get; }/// summary/// 是否使用SSL/// /summarypublic bool EnableSsl { set; get; }/// summary/// 端口号/// /summarypublic int Port { set; get; }/// summary/// 邮件地址/// /summarypublic string SendAddress { set; get; }/// summary/// 登录密码/// /summarypublic string LoginPassword { set; get; }/// summary/// 邮件STMP授权码/// /summarypublic string Password { set; get; }/// summary/// 是否可用/// /summarypublic bool CanUse { set; get; }}
}