180 lines
6.2 KiB
C#
180 lines
6.2 KiB
C#
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();
|
||
}
|
||
}
|
||
} |