整理文件夹
This commit is contained in:
@@ -0,0 +1,77 @@
|
||||
namespace IRaCIS.Core.Application.Helper;
|
||||
|
||||
public static class IRCEmailPasswordHelper
|
||||
{
|
||||
private static readonly Random Random = new Random();
|
||||
|
||||
//显示位数:3分之2的位数,向上取整
|
||||
//取哪几个个值:最后一位和前面几位
|
||||
//其他:3个***。
|
||||
//比如:hlj23@126.com
|
||||
//为:hlj***3@126.com
|
||||
|
||||
//he@126.com
|
||||
//为:h*** e@126.com
|
||||
|
||||
public static string MaskEmail(string email)
|
||||
{
|
||||
|
||||
// 找到 "@" 符号的位置
|
||||
int atIndex = email.IndexOf('@');
|
||||
|
||||
string visiblePartBefore = email.Substring(0, atIndex);
|
||||
|
||||
string afterAt = email.Substring(atIndex + 1);
|
||||
|
||||
int visibleLength = (int)Math.Ceiling((double)visiblePartBefore.Length * 2 / 3);
|
||||
|
||||
// 替换中间两位字符为星号
|
||||
string hiddenPartBeforeAt = visiblePartBefore.Substring(0, visibleLength - 1) + "***" + visiblePartBefore.Last();
|
||||
|
||||
|
||||
// 组合隐藏和可见部分
|
||||
string hiddenEmail = hiddenPartBeforeAt + "@" + afterAt;
|
||||
|
||||
return hiddenEmail;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 密码必须包含:1)8 – 32 个字符;2)至少1个数字;3) 至少1个大写字母;4)至少1个小写字母;5)至少1个特殊字符 (~!-@#$%^&*_+?)
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public static string GenerateRandomPassword(int length)
|
||||
{
|
||||
// 必须包含的字符组
|
||||
const string numbers = "0123456789";
|
||||
const string upperCaseLetters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
|
||||
const string lowerCaseLetters = "abcdefghijklmnopqrstuvwxyz";
|
||||
const string specialCharacters = "~!-@#$%^&*_+?";
|
||||
|
||||
// 随机选择至少一个字符
|
||||
char[] requiredCharacters =
|
||||
{
|
||||
numbers[Random.Next(numbers.Length)],
|
||||
upperCaseLetters[Random.Next(upperCaseLetters.Length)],
|
||||
lowerCaseLetters[Random.Next(lowerCaseLetters.Length)],
|
||||
specialCharacters[Random.Next(specialCharacters.Length)]
|
||||
};
|
||||
|
||||
// 构建剩余的字符集,用于填充密码的其余部分
|
||||
string allCharacters = numbers + upperCaseLetters + lowerCaseLetters + specialCharacters;
|
||||
|
||||
// 确保密码长度满足用户要求
|
||||
char[] password = new char[length];
|
||||
|
||||
// 将必须包含的字符放入密码中
|
||||
requiredCharacters.CopyTo(password, 0);
|
||||
|
||||
// 填充剩余的字符
|
||||
for (int i = requiredCharacters.Length; i < length; i++)
|
||||
{
|
||||
password[i] = allCharacters[Random.Next(allCharacters.Length)];
|
||||
}
|
||||
|
||||
// 随机打乱密码字符顺序
|
||||
return new string(password.OrderBy(_ => Random.Next()).ToArray());
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,198 @@
|
||||
using IRaCIS.Core.Domain.Share;
|
||||
using MailKit;
|
||||
using MailKit.Security;
|
||||
using MimeKit;
|
||||
|
||||
|
||||
namespace IRaCIS.Core.Application.Helper;
|
||||
|
||||
public static class SendEmailHelper
|
||||
{
|
||||
|
||||
public static async Task SendEmailAsync(MimeMessage messageToSend, SystemEmailSendConfig _systemEmailConfig, EventHandler<MessageSentEventArgs>? messageSentSuccess = null)
|
||||
{
|
||||
try
|
||||
{
|
||||
using (var smtp = new MailKit.Net.Smtp.SmtpClient())
|
||||
{
|
||||
if (messageSentSuccess != null)
|
||||
{
|
||||
smtp.MessageSent += messageSentSuccess;
|
||||
}
|
||||
|
||||
|
||||
smtp.ServerCertificateValidationCallback = (s, c, h, e) => true;
|
||||
|
||||
//await smtp.ConnectAsync("smtp.qq.com", 465, SecureSocketOptions.SslOnConnect);
|
||||
|
||||
//await smtp.AuthenticateAsync("zhou941003@qq.com", "sqfhlpfdvnexbcab");
|
||||
|
||||
await smtp.ConnectAsync(_systemEmailConfig.Host, _systemEmailConfig.Port, SecureSocketOptions.Auto);
|
||||
|
||||
await smtp.AuthenticateAsync(_systemEmailConfig.FromEmail, _systemEmailConfig.AuthorizationCode);
|
||||
|
||||
|
||||
await smtp.SendAsync(messageToSend);
|
||||
|
||||
await smtp.DisconnectAsync(true);
|
||||
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
|
||||
//---邮件发送失败,您进行的操作未能成功,请检查邮箱或联系维护人员
|
||||
throw new Exception(I18n.T("SendEmail_SendFail"), new Exception(ex.Message));
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
public static async Task<bool> TestEmailConfigAsync(SystemEmailSendConfig _systemEmailConfig)
|
||||
{
|
||||
using (var cts = new CancellationTokenSource(TimeSpan.FromSeconds(5)))
|
||||
{
|
||||
using (var client = new MailKit.Net.Smtp.SmtpClient())
|
||||
{
|
||||
|
||||
await client.ConnectAsync(_systemEmailConfig.Host, _systemEmailConfig.Port, SecureSocketOptions.Auto, cts.Token);
|
||||
|
||||
await client.AuthenticateAsync(_systemEmailConfig.FromEmail, _systemEmailConfig.AuthorizationCode, cts.Token);
|
||||
|
||||
await client.DisconnectAsync(true);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public static async Task SendEmailAsync(SMTPEmailConfig sMTPEmailConfig, EventHandler<MessageSentEventArgs>? messageSentSuccess = null)
|
||||
{
|
||||
var messageToSend = new MimeMessage();
|
||||
|
||||
//主题
|
||||
messageToSend.Subject = sMTPEmailConfig.TopicDescription;
|
||||
|
||||
//发件地址
|
||||
messageToSend.From.Add(sMTPEmailConfig.FromEmailAddress);
|
||||
|
||||
//收件地址
|
||||
|
||||
if (sMTPEmailConfig.ToMailAddressList.Count == 0)
|
||||
{
|
||||
//---没有收件人
|
||||
throw new ArgumentException(I18n.T("SendEmail_NoRecipient"));
|
||||
}
|
||||
else
|
||||
{
|
||||
foreach (var item in sMTPEmailConfig.ToMailAddressList)
|
||||
{
|
||||
messageToSend.To.Add(item);
|
||||
}
|
||||
//抄送
|
||||
foreach (var copyToMailAddress in sMTPEmailConfig.CopyToMailAddressList)
|
||||
{
|
||||
messageToSend.Cc.Add(copyToMailAddress);
|
||||
}
|
||||
}
|
||||
|
||||
var builder = new BodyBuilder();
|
||||
|
||||
//html body
|
||||
|
||||
builder.HtmlBody = sMTPEmailConfig.HtmlBodyStr;
|
||||
|
||||
|
||||
//附件
|
||||
|
||||
foreach (var item in sMTPEmailConfig.EmailAttachMentConfigList)
|
||||
{
|
||||
//builder.Attachments.Add(item.FileName, item.FileData);
|
||||
|
||||
var attachment = builder.Attachments.Add(item.FileName, item.FileStream);
|
||||
|
||||
//解决附件名过长 奇怪的名字
|
||||
foreach (var param in attachment.ContentDisposition.Parameters)
|
||||
param.EncodingMethod = ParameterEncodingMethod.Rfc2047;
|
||||
foreach (var param in attachment.ContentType.Parameters)
|
||||
param.EncodingMethod = ParameterEncodingMethod.Rfc2047;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
messageToSend.Body = builder.ToMessageBody();
|
||||
|
||||
using (var smtp = new MailKit.Net.Smtp.SmtpClient())
|
||||
{
|
||||
if (messageSentSuccess != null)
|
||||
{
|
||||
smtp.MessageSent += messageSentSuccess;
|
||||
}
|
||||
|
||||
|
||||
smtp.ServerCertificateValidationCallback = (s, c, h, e) => true;
|
||||
|
||||
await smtp.ConnectAsync(sMTPEmailConfig.Host, sMTPEmailConfig.Port, SecureSocketOptions.Auto);
|
||||
|
||||
await smtp.AuthenticateAsync(sMTPEmailConfig.UserName, sMTPEmailConfig.AuthorizationCode);
|
||||
|
||||
await smtp.SendAsync(messageToSend);
|
||||
|
||||
await smtp.DisconnectAsync(true);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
public class SMTPEmailConfig
|
||||
{
|
||||
public int Port { get; set; }
|
||||
|
||||
public string Host { get; set; }
|
||||
|
||||
|
||||
public string UserName { get; set; }
|
||||
|
||||
public string AuthorizationCode { get; set; }
|
||||
|
||||
|
||||
//邮件HtmlBody
|
||||
|
||||
public string HtmlBodyStr { get; set; } = string.Empty;
|
||||
|
||||
|
||||
//发
|
||||
public MailboxAddress FromEmailAddress { get; set; }
|
||||
|
||||
//收
|
||||
public List<MailboxAddress> ToMailAddressList { get; set; } = new List<MailboxAddress>();
|
||||
|
||||
//抄送
|
||||
public List<MailboxAddress> CopyToMailAddressList { get; set; } = new List<MailboxAddress>();
|
||||
|
||||
//邮件主题
|
||||
public string TopicDescription { get; set; } = string.Empty;
|
||||
|
||||
//邮件附件
|
||||
public List<EmailAttachMentConfig> EmailAttachMentConfigList { get; set; } = new List<EmailAttachMentConfig>() { };
|
||||
|
||||
}
|
||||
|
||||
|
||||
public class EmailAttachMentConfig
|
||||
{
|
||||
public string FileName { get; set; }
|
||||
|
||||
public Stream FileStream { get; set; }
|
||||
|
||||
|
||||
public byte[] FileData { get; set; }
|
||||
}
|
||||
Reference in New Issue
Block a user