223 lines
10 KiB
C#

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<SmtpSettings> emailSettings, IConfiguration configuration, IWebHostEnvironment env)
{
_smtpSettings = emailSettings.Value;
_configuration = configuration;
_env = env;
}
public async Task<string> GetEmailTemplate(string templateName, Dictionary<string, string> 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<string, string>
{
{ "MAIL_TITLE", "New registration,Reset Your Password" },
{ "RESET_PWD_URL", resetLink },
{ "RECEIVER_NAME", toName }
};
List<string> toEmails = new List<string>
{
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<string, string>
{
{ "MAIL_TITLE", "Reset Your Password" },
{ "RESET_PWD_URL", resetLink }
};
string emailBody = await GetEmailTemplate("forgot-password", replacements);
List<string> toEmails = new List<string>
{
toEmail
};
await SendEmailAsync(toEmails, "Reset Your Password", emailBody);
}
public async Task SendResetPasswordSuccessEmail(string toEmail, string toName)
{
var replacements = new Dictionary<string, string>
{
{ "MAIL_TITLE", "Reset Password Successful" },
{ "RECEIVER_NAME", toName }
};
string emailBody = await GetEmailTemplate("password-change-success", replacements);
List<string> toEmails = new List<string>
{
toEmail
};
await SendEmailAsync(toEmails, "Password Changed Successfully", emailBody);
}
public async Task SendRequestDemoEmail(List<string> toEmails, InquiryEmailObject demoEmailObject)
{
var replacements = new Dictionary<string, string>
{
{ "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<string> toEmails, ProjectStatisticReport report)
{
//List<string> toEmails = [
// "ashutosh.nehete@marcoaiot.com"
//];
var date = report.Date.ToString("dd-MMM-yyyy", CultureInfo.InvariantCulture);
var replacements = new Dictionary<string, string>
{
{"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("<tr style=\"vertical-align:middle\">");
int flag = 0;
foreach (var item in report.TeamOnSite)
{
if (flag == 6)
{
teamHtml.Append("</tr>");
teamHtml.Append("<tr style=\"vertical-align:middle\">");
flag = 0;
}
teamHtml.AppendFormat("<td class=\"team\" style=\"text-align:center\"><div style=\"border: 1px solid #d5d5d5; border-radius: 10px; margin: 10px 10px; padding: 10px;\"><div style=\"font-size: 15px; color: #525b75 \">{0}</div> <div style=\"font-size: 20px; color: #003cc7; margin: 20px !important; font-weight: bold; \">{1}</div></div></td>", item.RoleName, item.NumberofEmployees);
flag += 1;
}
teamHtml.Append("</tr>");
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("<tr>\r\n<td style=\"text-align:left;\">\r\n<span style=\"padding-left: 10px; text-align: left;\">\r\n {0} \r\n</span><br />\r\n<span style=\"color: gray; font-size: small; padding-left: 10px;\"> {1} </span>\r\n</td>\r\n<td style=\"text-align:center\">\r\n {2} / {3} \r\n</td>\r\n<td style=\"text-align:center\">\r\n {4} \r\n</td>\r\n<td style=\"text-align:center\"> {5} </td>\r\n <td style=\"padding-left: 10px; text-align: left;\">\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} &nbsp; \r\n<span style=\"color: gray; font-size: small; padding-left: 10px;\">({1})</span>\r\n<br />",
member.Name, member.RoleName);
}
taskHtml.AppendFormat("</td>\r\n<td style=\"padding-left: 10px; max-width: 150px; text-align: left;\"> {0} </td>\r\n</tr>", task.Comment);
}
}
else
{
taskHtml.Append("<tr><td colspan=\"6\"><span style=\"font-size: 18px; line-height: 25.2px; color: #666666;margin:10px\">No Activities (Tasks) Performed Today</span></td></tr>");
}
emailBody = emailBody.Replace("{{PERFORMED_TASK}}", taskHtml.ToString());
var attendanceHtml = new StringBuilder();
if (report.PerformedAttendance.Count > 0)
{
foreach (var attendance in report.PerformedAttendance)
{
attendanceHtml.AppendFormat("<tr>\r\n<td style=\"text-align:left\">\r\n<span style=\"padding-left:10px;\"> {0} </span>\r\n</td>\r\n<td style=\"text-align:center\"> {1} </td>\r\n<td style=\"text-align:center\"> {2} </td>\r\n<td style=\"text-align:center\"> {3} </td>\r\n<td style=\"padding-left:10px; max-width:150px\"> {4} </td>\r\n</tr>",
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("<tr><td colspan=\"5\"><span style=\"font-size: 18px; line-height: 25.2px; color: #666666;margin:10px\">No Attendance Performed Today</span></td></tr>");
}
emailBody = emailBody.Replace("{{PERFORMED_ATTENDANCE}}", attendanceHtml.ToString());
string subject = $"DPR - {date} - {report.ProjectName}";
await SendEmailAsync(toEmails, subject, emailBody);
}
public async Task SendEmailAsync(List<string> 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);
}
}
}