using System.Globalization; using System.Text; using MailKit.Net.Smtp; using Marco.Pms.Model.Utilities; using Marco.Pms.Model.ViewModels.Report; using Microsoft.Extensions.Options; using MimeKit; namespace MarcoBMS.Services.Service { public class EmailSender : IEmailSender { private readonly SmtpSettings _smtpSettings; private readonly IConfiguration _configuration; private readonly IWebHostEnvironment _env; public EmailSender(IOptions emailSettings, IConfiguration configuration, IWebHostEnvironment env) { _smtpSettings = emailSettings.Value; _configuration = configuration; _env = env; } public async Task GetEmailTemplate(string templateName, Dictionary replacements) { string path = Path.Combine(_env.ContentRootPath, "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 ?? string.Empty }, { "EMAIL", demoEmailObject.Email ?? string.Empty}, { "ABOUT", demoEmailObject.About ?? string.Empty }, { "ORGANIZATION_SIZE", demoEmailObject.OragnizationSize ?? string.Empty }, { "INDUSTRY_NAME", demoEmailObject.IndustryName ?? string.Empty }, { "CONTACT_NAME", demoEmailObject.ContactPerson ?? string.Empty }, { "CONTACT_NUMBER", demoEmailObject.ContactNumber ?? string.Empty } }; string emailBody = await GetEmailTemplate("request-demo", replacements); await SendEmailAsync(toEmails, "User Requested a Demo", emailBody); } public async Task SendProjectStatisticsEmail(List toEmails, ProjectStatisticReport report) { //List toEmails = [ // "ashutosh.nehete@marcoaiot.com" //]; var date = report.Date.ToString("dd-MMM-yyyy", CultureInfo.InvariantCulture); var replacements = new Dictionary { {"DATE",date }, {"PROJECT_NAME",report.ProjectName }, {"TIMESTAMP",report.TimeStamp }, {"TODAYS_ATTENDANCES", report.TodaysAttendances.ToString()}, {"TOTAL_EMPLOYEES",report.TotalEmployees.ToString() }, {"TODAYS_PLANNED",report.TotalPlannedTask.ToString() }, {"TODAYS_COMPLETED",report.TotalCompletedTask.ToString() }, {"REGULRIZATION_PENDING", report.RegularizationPending.ToString() }, {"CHECKOUT_PRNDING",report.CheckoutPending.ToString() }, {"TOTAL_PLANNED",report.TotalPlannedWork.ToString() }, {"TOTAL_COMPLETED",report.TotalCompletedWork.ToString() }, {"PROJECT_STATUS",report.CompletionStatus.ToString("P") }, {"TODAYS_ASSIGNED",report.TodaysAssignTasks.ToString() }, {"REPORT_PENDING",report.ReportPending.ToString() } }; string emailBody = await GetEmailTemplate("project-report", replacements); //string emailBody = await GetEmailTemplate("test-project", replacements); var teamHtml = new StringBuilder(); teamHtml.Append(""); int flag = 0; foreach (var item in report.TeamOnSite) { if (flag == 6) { teamHtml.Append(""); teamHtml.Append(""); flag = 0; } teamHtml.AppendFormat("
{0}
{1}
", item.RoleName, item.NumberofEmployees); flag += 1; } teamHtml.Append(""); emailBody = emailBody.Replace("{{TEAM_ON_SITE}}", teamHtml.ToString()); var taskHtml = new StringBuilder(); if (report.PerformedTasks.Count > 0) { foreach (var task in report.PerformedTasks) { taskHtml.AppendFormat("\r\n\r\n\r\n {0} \r\n
\r\n {1} \r\n\r\n\r\n {2} / {3} \r\n\r\n\r\n {4} \r\n\r\n {5} \r\n \r\n", task.Activity, task.Location, task.AssignedToday, task.Pending, task.CompletedToday, report.Date.ToString("dd-MMM-yyy")); foreach (var member in task.Team) { taskHtml.AppendFormat(" {0}   \r\n({1})\r\n
", member.Name, member.RoleName); } taskHtml.AppendFormat("\r\n {0} \r\n", task.Comment); } } else { taskHtml.Append("No Activities (Tasks) Performed Today"); } emailBody = emailBody.Replace("{{PERFORMED_TASK}}", taskHtml.ToString()); var attendanceHtml = new StringBuilder(); if (report.PerformedAttendance.Count > 0) { foreach (var attendance in report.PerformedAttendance) { attendanceHtml.AppendFormat("\r\n\r\n {0} \r\n\r\n {1} \r\n {2} \r\n {3} \r\n {4} \r\n", attendance.Name, attendance.RoleName, attendance.InTime.ToString("dd-MMM-yyyy h:mm tt", CultureInfo.InvariantCulture), (attendance.OutTime != null ? attendance.OutTime.Value.ToString("dd-MMM-yyyy h:mm tt", CultureInfo.InvariantCulture) : ""), attendance.Comment); } } else { attendanceHtml.Append("No Attendance Performed Today"); } emailBody = emailBody.Replace("{{PERFORMED_ATTENDANCE}}", attendanceHtml.ToString()); string subject = $"DPR - {date} - {report.ProjectName}"; await SendEmailAsync(toEmails, subject, 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); } } }