using IRaCIS.Core.Infra.EFCore; using IRaCIS.Core.Domain.Models; using MailKit.Security; using MimeKit; namespace IRaCIS.Application.Services { public interface IMailVerificationService { Task SendMail(Guid userId, string userName, string emailAddress, int verificationCode); Task AnolymousSendEmail(string emailAddress, int verificationCode); Task SendMailEditEmail(Guid userId, string userName, string emailAddress, int verificationCode); } public class MailVerificationService : IMailVerificationService { private readonly IRepository _verificationCodeRepository; private readonly IRepository _systemBasicDatarepository; public MailVerificationService(IRepository verificationCodeRepository, IRepository systemBasicDatarepository) { _verificationCodeRepository = verificationCodeRepository; _systemBasicDatarepository = systemBasicDatarepository; } public async Task SendMailEditEmail(Guid userId, string userName, string emailAddress, int verificationCode) { var messageToSend = new MimeMessage(); //发件地址 messageToSend.From.Add(new MailboxAddress("GRR", "iracis_grr@163.com")); //收件地址 messageToSend.To.Add(new MailboxAddress(userName, emailAddress)); //主题 messageToSend.Subject = "Reset email (Verification Code)"; messageToSend.Body = new TextPart("plain") { Text = $@"Hey {userName},you are modify your email . The verification code is: {verificationCode}, which is valid within 3 minutes. If it is not your own operation, please ignore it! -- GRR" }; using (var smtp = new MailKit.Net.Smtp.SmtpClient()) { smtp.MessageSent += (sender, args) => { // args.Response var code = verificationCode.ToString(); _ = _verificationCodeRepository.AddAsync(new VerificationCode() { CodeType = 0, HasSend = true, Code = code, UserId = userId, ExpirationTime = DateTime.Now.AddMinutes(3) }).Result; _ = _verificationCodeRepository.SaveChangesAsync().Result; }; smtp.ServerCertificateValidationCallback = (s, c, h, e) => true; await smtp.ConnectAsync("smtp.163.com", 25, SecureSocketOptions.StartTls); await smtp.AuthenticateAsync("iracis_grr@163.com", "XLWVQKZAEKLDWOAH"); await smtp.SendAsync(messageToSend); await smtp.DisconnectAsync(true); } } public async Task SendMail(Guid userId, string userName, string emailAddress, int verificationCode) { var messageToSend = new MimeMessage(); //发件地址 messageToSend.From.Add(new MailboxAddress("GRR", "iracis_grr@163.com")); //收件地址 messageToSend.To.Add(new MailboxAddress(userName, emailAddress)); //主题 messageToSend.Subject = "Reset PassWord (Verification Code)"; messageToSend.Body = new TextPart("plain") { Text = $@"Hey {userName},you are resetting your password via email. The verification code is: {verificationCode}, which is valid within 3 minutes. If it is not your own operation, please ignore it! -- GRR" }; using (var smtp = new MailKit.Net.Smtp.SmtpClient()) { smtp.MessageSent += (sender, args) => { // args.Response var code = verificationCode.ToString(); _= _verificationCodeRepository.AddAsync(new VerificationCode() { CodeType = 0, HasSend = true, Code = code, UserId = userId, ExpirationTime = DateTime.Now.AddMinutes(3) }).Result; _= _verificationCodeRepository.SaveChangesAsync().Result; }; smtp.ServerCertificateValidationCallback = (s, c, h, e) => true; await smtp.ConnectAsync("smtp.163.com", 25, SecureSocketOptions.StartTls); await smtp.AuthenticateAsync("iracis_grr@163.com", "XLWVQKZAEKLDWOAH"); await smtp.SendAsync(messageToSend); await smtp.DisconnectAsync(true); } } public async Task AnolymousSendEmail(string emailAddress, int verificationCode) { var messageToSend = new MimeMessage(); //发件地址 messageToSend.From.Add(new MailboxAddress("GRR", "iracis_grr@163.com")); //收件地址 messageToSend.To.Add(new MailboxAddress(String.Empty, emailAddress)); //主题 messageToSend.Subject = "GRR Site survey (Verification Code)"; messageToSend.Body = new TextPart("plain") { Text = $@"Hey ,you are login for site survey via email. The verification code is: {verificationCode}, which is valid within 3 minutes. If it is not your own operation, please ignore it! -- GRR" }; using (var smtp = new MailKit.Net.Smtp.SmtpClient()) { smtp.MessageSent += (sender, args) => { // args.Response var code = verificationCode.ToString(); _ = _verificationCodeRepository.AddAsync(new VerificationCode() { CodeType = 0, HasSend = true, Code = code, UserId = Guid.Empty,//此时不知道用户 EmailOrPhone = emailAddress, ExpirationTime = DateTime.Now.AddMinutes(3) }).Result; _ = _verificationCodeRepository.SaveChangesAsync().Result; }; smtp.ServerCertificateValidationCallback = (s, c, h, e) => true; await smtp.ConnectAsync("smtp.163.com", 25, SecureSocketOptions.StartTls); await smtp.AuthenticateAsync("iracis_grr@163.com", "XLWVQKZAEKLDWOAH"); await smtp.SendAsync(messageToSend); await smtp.DisconnectAsync(true); } } public async Task SendEmailForExternalUser(string emailAddress, string verificationCode) { var messageToSend = new MimeMessage(); //发件地址 messageToSend.From.Add(new MailboxAddress("GRR", "iracis_grr@163.com")); //收件地址 messageToSend.To.Add(new MailboxAddress(String.Empty, emailAddress)); //主题 messageToSend.Subject = "GRR External User survey (Verification Code)"; messageToSend.Body = new TextPart("plain") { Text = $@"Hey ,you are login for site survey via email. The verification code is: {verificationCode}, If it is not your own operation, please ignore it! -- GRR" }; using (var smtp = new MailKit.Net.Smtp.SmtpClient()) { smtp.MessageSent += (sender, args) => { // args.Response var code = verificationCode.ToString(); _ = _verificationCodeRepository.AddAsync(new VerificationCode() { CodeType = 0, HasSend = true, Code = code, UserId = Guid.Empty,//此时不知道用户 EmailOrPhone = emailAddress, ExpirationTime = DateTime.Now.AddMinutes(3) }).Result; _ = _verificationCodeRepository.SaveChangesAsync().Result; }; smtp.ServerCertificateValidationCallback = (s, c, h, e) => true; await smtp.ConnectAsync("smtp.163.com", 25, SecureSocketOptions.StartTls); await smtp.AuthenticateAsync("iracis_grr@163.com", "XLWVQKZAEKLDWOAH"); await smtp.SendAsync(messageToSend); await smtp.DisconnectAsync(true); } } } }