using MailKit.Net.Smtp; using Marco.Pms.Model.Utilities; using Microsoft.Extensions.Options; using MimeKit; namespace MarcoBMS.Services.Service { public class EmailSender : IEmailSender { private readonly SmtpSettings _smtpSettings; private readonly IConfiguration _configuration; public EmailSender(IOptions emailSettings, IConfiguration configuration) { _smtpSettings = emailSettings.Value; _configuration = configuration; } public async Task GetEmailTemplate(string templateName, Dictionary replacements) { string path = Path.Combine(Directory.GetCurrentDirectory(), "EmailTemplates", $"{templateName}.html"); if (!File.Exists(path)) throw new FileNotFoundException("Template file not found"); string content = await File.ReadAllTextAsync(path); foreach (var item in replacements) { content = content.Replace($"{{{{{item.Key}}}}}", item.Value); } return content; } public async Task SendResetPasswordEmailOnRegister(string toEmail, string toName, string resetLink) { var replacements = new Dictionary { { "MAIL_TITLE", "New registration,Reset Your Password" }, { "RESET_PWD_URL", resetLink }, { "RECEIVER_NAME", toName } }; List toEmails = new List { toEmail }; string emailBody = await GetEmailTemplate("new-user-email", replacements); await SendEmailAsync(toEmails, "New user registration, Reset Your Password", emailBody); } public async Task SendResetPasswordEmail(string toEmail, string userName, string resetLink) { var replacements = new Dictionary { { "MAIL_TITLE", "Reset Your Password" }, { "RESET_PWD_URL", resetLink } }; string emailBody = await GetEmailTemplate("forgot-password", replacements); List toEmails = new List { toEmail }; await SendEmailAsync(toEmails, "Reset Your Password", emailBody); } public async Task SendResetPasswordSuccessEmail(string toEmail, string toName) { var replacements = new Dictionary { { "MAIL_TITLE", "Reset Password Successful" }, { "RECEIVER_NAME", toName } }; string emailBody = await GetEmailTemplate("password-change-success", replacements); List toEmails = new List { toEmail }; await SendEmailAsync(toEmails, "Password Changed Successfully", emailBody); } public async Task SendRequestDemoEmail(List toEmails, InquiryEmailObject demoEmailObject) { var replacements = new Dictionary { { "MAIL_TITLE", "User Requested a Demo" }, { "ORGANIZATION_NAME", demoEmailObject.OrganizatioinName }, { "EMAIL", demoEmailObject.Email }, { "ABOUT", demoEmailObject.About }, { "ORGANIZATION_SIZE", demoEmailObject.OragnizationSize }, { "INDUSTRY_NAME", demoEmailObject.IndustryName }, { "CONTACT_NAME", demoEmailObject.ContactPerson }, { "CONTACT_NUMBER", demoEmailObject.ContactNumber } }; string emailBody = await GetEmailTemplate("request-demo", replacements); await SendEmailAsync(toEmails, "User Requested a Demo", emailBody); } public async Task SendEmailAsync(List toEmails, string subject, string body) { var email = new MimeMessage(); email.From.Add(new MailboxAddress(_smtpSettings.SenderName, _smtpSettings.SenderEmail)); foreach (var toEmail in toEmails) { email.To.Add(MailboxAddress.Parse(toEmail)); } email.Subject = subject; var bodyBuilder = new BodyBuilder { HtmlBody = body }; email.Body = bodyBuilder.ToMessageBody(); using var smtp = new SmtpClient(); await smtp.ConnectAsync(_smtpSettings.SmtpServer, _smtpSettings.Port, MailKit.Security.SecureSocketOptions.StartTls); await smtp.AuthenticateAsync(_smtpSettings.SenderEmail, _smtpSettings.Password); await smtp.SendAsync(email); await smtp.DisconnectAsync(true); } } }