using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net.Mail; using System.Text; using System.Threading.Tasks; namespace Sevomin.Models.Helpers { public enum EmailType { EmailConfirmation, PasswordReset, NewPassword, NewApplication, NewJob, ExpiringJob } public class SevominEmailer { public Dictionary Parameters { get; set; } public EmailType EmailType { get; set; } private string EmailFolderPath; private string EmailConfirmationFilePath; private string PasswordResetFilePath; private string ExpiringJobFilePath; private string NewJobFilePath; private string NewApplicationFilePath; public SevominEmailer() { EmailFolderPath = Path.Combine(System.Web.HttpContext.Current.Server.MapPath("~/app_data"), "emails"); if (!Directory.Exists(EmailFolderPath)) throw new ApplicationException("Emails folder does not exist in the right address."); EmailConfirmationFilePath = Path.Combine(EmailFolderPath, "email-confirmation.html"); PasswordResetFilePath = Path.Combine(EmailFolderPath, "password-reset.html"); ExpiringJobFilePath = Path.Combine(EmailFolderPath, "expiring-job.html"); NewJobFilePath = Path.Combine(EmailFolderPath, "new-job.html"); NewApplicationFilePath = Path.Combine(EmailFolderPath, "new-application.html"); if(!File.Exists(EmailConfirmationFilePath)) throw new ApplicationException("Email confirmation template does not exist in the right address."); if (!File.Exists(PasswordResetFilePath)) throw new ApplicationException("Password reset template does not exist in the right address."); if (!File.Exists(ExpiringJobFilePath)) throw new ApplicationException("Expiring job template does not exist in the right address."); if (!File.Exists(NewJobFilePath)) throw new ApplicationException("New job template does not exist in the right address."); if (!File.Exists(NewApplicationFilePath)) throw new ApplicationException("New application template does not exist in the right address."); Parameters = new Dictionary(); } public SevominEmailer(Dictionary parameters, EmailType emailType) : this() { Parameters = parameters; EmailType = emailType; } public async Task SendAsync(string to, string subject, bool isHtml) { SmtpClient client = new SmtpClient(); MailMessage msg = new MailMessage(); string template; switch (EmailType) { case EmailType.EmailConfirmation: template = File.ReadAllText(EmailConfirmationFilePath, Encoding.UTF8); break; case EmailType.PasswordReset: template = File.ReadAllText(PasswordResetFilePath, Encoding.UTF8); break; case EmailType.ExpiringJob: template = File.ReadAllText(ExpiringJobFilePath, Encoding.UTF8); break; case EmailType.NewApplication: template = File.ReadAllText(NewApplicationFilePath, Encoding.UTF8); break; case EmailType.NewJob: template = File.ReadAllText(NewJobFilePath, Encoding.UTF8); break; default: template = string.Empty; break; } foreach (var address in to.Split(',')) msg.To.Add(address); msg.Bcc.Add("info@sevom.in"); msg.From = new MailAddress("no-reply@sevom.in", "سومین - مرکز کاریابی کنترل پروژه"); msg.SubjectEncoding = Encoding.UTF8; msg.BodyEncoding = Encoding.UTF8; msg.Subject = subject; msg.IsBodyHtml = isHtml; Func getBody = () => { foreach (var param in Parameters) template = template.Replace(string.Format("[{0}]", param.Key), param.Value); return template; }; msg.Body = getBody(); await Task.Run(() => { client.Send(msg); }); } } }