ZrAdminNetCore/ZR.Common/MailHelper.cs

180 lines
6.2 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using Infrastructure;
using Infrastructure.Model;
using MailKit.Net.Smtp;
using MimeKit;
using MimeKit.Text;
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
namespace ZR.Common
{
public class MailHelper
{
/// <summary>
/// 发送人邮箱
/// </summary>
public string FromEmail { get; set; } = "";
private readonly MailOptions mailOptions = new();
public MailHelper()
{
AppSettings.Bind("MailOptions", mailOptions);
FromEmail = mailOptions.FromEmail;
}
public MailHelper(MailOptions _mailOptions)
{
this.mailOptions = _mailOptions;
FromEmail = _mailOptions.FromEmail;
}
/// <summary>
/// 发送一个
/// </summary>
/// <param name="toAddress"></param>
/// <param name="subject"></param>
/// <param name="text"></param>
/// <param name="path"></param>
public string SendMail(string toAddress, string subject, string text, string path = "", string html = "")
{
IEnumerable<MailboxAddress> mailboxes = new List<MailboxAddress>() {
new MailboxAddress(toAddress, toAddress)
};
return SendMail(mailboxes, subject, text, path, html);
}
/// <summary>
/// 发送多个邮箱
/// </summary>
/// <param name="toAddress"></param>
/// <param name="subject"></param>
/// <param name="text"></param>
/// <param name="path"></param>
public string SendMail(string[] toAddress, string subject, string text, string path = "", string html = "")
{
IList<MailboxAddress> mailboxes = new List<MailboxAddress>() { };
foreach (var item in toAddress)
{
mailboxes.Add(new MailboxAddress(item, item));
}
return SendMail(mailboxes, subject, text, path, html);
}
/// <summary>
/// 发送邮件
/// </summary>
/// <param name="toAddress"></param>
/// <param name="subject">主题</param>
/// <param name="text"></param>
/// <param name="path">附件url地址</param>
/// <param name="html">网页HTML内容</param>
private string SendMail(IEnumerable<MailboxAddress> toAddress, string subject, string text, string path = "", string html = "")
{
MimeMessage message = new MimeMessage();
//发件人
message.From.Add(new MailboxAddress(mailOptions.FromName, mailOptions.FromEmail));
//收件人
message.To.AddRange(toAddress);
message.Subject = subject;
message.Date = DateTime.Now;
//创建附件Multipart
Multipart multipart = new Multipart("mixed");
var alternative = new MultipartAlternative();
//html内容
if (!string.IsNullOrEmpty(html))
{
var Html = new TextPart(TextFormat.Html)
{
Text = html
};
alternative.Add(Html);
}
//文本内容
//if (!string.IsNullOrEmpty(text))
//{
var plain = new TextPart(TextFormat.Plain)
{
Text = text + "\r\n\n\n" + mailOptions.Signature
};
alternative.Add(plain);
//}
//附件
if (!string.IsNullOrEmpty(path))
{
string[] files = path.Split(",");
foreach (var file in files)
{
MimePart attachment = new()
{
Content = new MimeContent(File.OpenRead(file), ContentEncoding.Default),
//读取文件,只能用绝对路径
ContentDisposition = new ContentDisposition(ContentDisposition.Attachment),
ContentTransferEncoding = ContentEncoding.Base64,
//文件名字
FileName = Path.GetFileName(path)
};
alternative.Add(attachment);
}
}
multipart.Add(alternative);
//赋值邮件内容
message.Body = multipart;
//开始发送
using var client = new SmtpClient();
client.ServerCertificateValidationCallback = (s, c, h, e) => true;
//client.CheckCertificateRevocation = false;
client.Connect(mailOptions.Smtp, mailOptions.Port, mailOptions.UseSsl);
//登录,发送
//特别说明对于服务器端的中文相应Exception中有编码问题显示乱码了
client.Authenticate(System.Text.Encoding.UTF8, mailOptions.FromEmail, mailOptions.Password);
try
{
var result = client.Send(message);
//断开
client.Disconnect(true);
Console.WriteLine($"【{DateTime.Now}】发送邮件结果{result}");
return result;
}
catch (Exception ex)
{
client.Disconnect(true);
Log.WriteLine(ConsoleColor.Red, "发送邮件失败" + ex.Message);
return "fail";
}
}
public string VerifyCode(int n)
{
var strB = new StringBuilder();
var rand = new Random();
for (var i = 0; i < n; i++)
{
var r1 = rand.Next(3);
var r2 = 0;
// r2为ASCII码值
switch (r1)
{
case 0: // 数字: 48-57的随机数
r2 = rand.Next(48, 58);
break;
case 1:
r2 = rand.Next(65, 91); // 大写字母: 65-90的随机数
break;
case 2:
r2 = rand.Next(97, 123); // 小写字母: 97-122的随机数
break;
}
strB.Append((char)r2);
}
return strB.ToString();
}
}
}