public void CannotAddTwoSubjects() { var tokenValues = new Dictionary<string, string> {{"Name", "Bill Gates"}, {"UserId", "123"}}; var factory = new MergedEmailFactory(new TemplateParser()); factory.WithTokenValues(tokenValues).WithSubject("xxx").WithSubject("yyy"); }
public void CannotAddTwoSubjects() { var tokenValues = new Dictionary <string, string> { { "Name", "Bill Gates" }, { "UserId", "123" } }; var factory = new MergedEmailFactory(new TemplateParser()); factory.WithTokenValues(tokenValues).WithSubject("xxx").WithSubject("yyy"); }
public void CanCreateMergedEmailFromFile() { string title = "Welcome {%=name%}, thank you for signing up!"; var tokenValues = new Dictionary<string, string> {{"Name", "Bill Gates"}, {"UserId", "123"}}; var factory = new MergedEmailFactory(new TemplateParser()); MailMessage message = factory.WithTokenValues(tokenValues).WithSubject(title).WithPlainTextBodyFromFile(SampleTemplatePath). Create(); Assert.That(message.Subject == "Welcome Bill Gates, thank you for signing up!"); Assert.IsTrue(message.Body.Contains("Dear Bill Gates")); }
public void CanCreateMergedEmailFromExplicitValues() { string title = "Welcome {%=name%}, thank you for signing up!"; string body = "Dear {%=name%}, ..."; var tokenValues = new Dictionary<string, string> {{"Name", "Bill Gates"}}; var factory = new MergedEmailFactory(new TemplateParser()); MailMessage message = factory.WithTokenValues(tokenValues).WithSubject(title).WithPlainTextBody(body).Create(); Assert.That(message.Subject == "Welcome Bill Gates, thank you for signing up!"); Assert.That(message.Body == "Dear Bill Gates, ..."); }
public void CanCreateMergedEmailFromFile() { string title = "Welcome {%=name%}, thank you for signing up!"; var tokenValues = new Dictionary <string, string> { { "Name", "Bill Gates" }, { "UserId", "123" } }; var factory = new MergedEmailFactory(new TemplateParser()); MailMessage message = factory.WithTokenValues(tokenValues).WithSubject(title).WithPlainTextBodyFromFile(SampleTemplatePath). Create(); Assert.That(message.Subject == "Welcome Bill Gates, thank you for signing up!"); Assert.IsTrue(message.Body.Contains("Dear Bill Gates")); }
public void CanCreateMergedEmailFromExplicitValues() { string title = "Welcome {%=name%}, thank you for signing up!"; string body = "Dear {%=name%}, ..."; var tokenValues = new Dictionary <string, string> { { "Name", "Bill Gates" } }; var factory = new MergedEmailFactory(new TemplateParser()); MailMessage message = factory.WithTokenValues(tokenValues).WithSubject(title).WithPlainTextBody(body).Create(); Assert.That(message.Subject == "Welcome Bill Gates, thank you for signing up!"); Assert.That(message.Body == "Dear Bill Gates, ..."); }
public void Execute() { var factory = new MergedEmailFactory(new TemplateParser()); var employees = _repository.FindAll <Employee>(); var emailTemplate = _repository.Query <EmailTemplate>(x => x.Name == "Daily Tasks List").FirstOrDefault(); employees.Each(x => { var sb = new StringBuilder(); x.GetTasks().Where(t => t.ScheduledDate >= DateTime.Now && t.ScheduledDate <= DateTime.Now.AddDays(1)).Each(task => { sb.Append("Task Type: "); sb.Append(task.TaskType.Name); sb.AppendLine(); sb.Append("Start Time: "); sb.Append(task.ScheduledStartTime); sb.AppendLine(); sb.Append("Field: "); sb.Append(task.Field.Name); sb.AppendLine(); sb.AppendLine(); }); var tokenValues = new Dictionary <string, string> { { "name", x.FullName }, { "date", DateTime.Now.ToLongDateString() }, { "tasks", sb.ToString() } }; MailMessage message = factory .WithTokenValues(tokenValues) .WithSubject("Daily Tasks Email") .WithHtmlBody(emailTemplate.Template) .Create(); var from = new MailAddress("*****@*****.**", "Automated Emailer"); var to = new MailAddress(x.Email, x.FullName); message.From = from; message.To.Add(to); var smtpClient = new SmtpClient(); smtpClient.Send(message); }); }
public void CanSendHtmlEmailWithPlainAlternative() { var factory = new MergedEmailFactory(new TemplateParser()); var tokenValues = new Dictionary <string, string> { { "name", "Joe" }, { "userid", "123" } }; MailMessage message = factory .WithTokenValues(tokenValues) .WithSubject("Test Subject") .WithHtmlBodyFromFile(@"templates\sample-email.html") .WithPlainTextBodyFromFile(@"templates\sample-email.txt") .Create(); var from = new MailAddress("*****@*****.**", "Automated Emailer"); var to = new MailAddress("*****@*****.**", "Joe Bloggs"); message.From = from; message.To.Add(to); using (var output = new MemoryStream()) { message.Save(output); var result = StreamToString(output); Assert.That(result, Contains.Substring(@"Content-Type: multipart/alternative")); Assert.That(result, Contains.Substring(@"Dear Joe")); // Note that actually the email is encoded with RFC 2045 "Quoted Printable" Encoding, but .NET doesn't ship // with a decoder so we'll add the =3D into our test for simplicity. Assert.That(result, Contains.Substring(@"http://localhost/trackedLink?userId=3D123")); Console.WriteLine(result); } }
/// <summary> /// </summary> /// <param name="context"></param> /// <param name="basemessage"></param> public async void Create(IApartmenthostContext context, BaseEmailMessage basemessage) { try { // Сообщение SendGrid SendGridMessage message = new SendGridMessage(); // Шаблонизатор var emailFactory = new MergedEmailFactory(new TemplateParser()); // Считываем глобальные настройки var fromAddress = Environment.GetEnvironmentVariable("EMAIL_FROM_ADDRESS"); var from = Environment.GetEnvironmentVariable("EMAIL_FROM"); var webDomain = Environment.GetEnvironmentVariable("WEB_DOMAIN"); // Отправитель message.From = new MailAddress(fromAddress, from); // Получатель message.AddTo(basemessage.ToUserEmail); // Глобальный HTML шаблон письма StringBuilder htmlTemplate = new StringBuilder(); var templArt = context.Article.SingleOrDefault(x => x.Name == ConstVals.EmailTemplate && x.Type == ConstVals.Email); htmlTemplate.Append(templArt.Text); // Приветстиве пользователя var greetArt = context.Article.SingleOrDefault(x => x.Name == ConstVals.Greet && x.Type == ConstVals.Email); var greetTv = new Dictionary <string, string> { { "username", basemessage.ToUserName } }; MailMessage greetMsg = emailFactory .WithTokenValues(greetTv) .WithHtmlBody(greetArt.Text).Create(); // HTML шаблон основного тела письма StringBuilder bodyTemplate = new StringBuilder(); var bodyTemplateTv = new Dictionary <string, string>(); var bodyTokenValues = new Dictionary <string, string>(); // Считывание шаблона if (!string.IsNullOrEmpty(basemessage.Code)) { var article = context.Article.SingleOrDefault(x => x.Name == basemessage.Code && x.Type == ConstVals.Email); if (article != null) { message.Subject = article.Title; bodyTemplate.Append(article.Text); } } var dateformat = "dd.MM.yyyy"; switch (basemessage.Code) { case RespH.SRV_NOTIF_CARD_FAVORITED: bodyTokenValues.Add("username", basemessage.FromUserName); bodyTokenValues.Add("url", webDomain + "#/posts/" + basemessage.CardId); bodyTokenValues.Add("unsubUrl", webDomain + "#/unsubscr?type=notifications&code=" + basemessage.UnsubscrCode); break; case RespH.SRV_NOTIF_RESERV_NEW: bodyTokenValues.Add("username", basemessage.FromUserName); bodyTokenValues.Add("cardname", basemessage.CardName); bodyTokenValues.Add("cardtype", basemessage.CardType); bodyTokenValues.Add("carddesc", basemessage.CardDescription); bodyTokenValues.Add("datefrom", basemessage.DateFrom.ToString(dateformat)); bodyTokenValues.Add("dateto", basemessage.DateTo.ToString(dateformat)); bodyTokenValues.Add("url", webDomain + "#/posts/" + basemessage.CardId); bodyTokenValues.Add("unsubUrl", webDomain + "#/unsubscr?type=notifications&code=" + basemessage.UnsubscrCode); break; case RespH.SRV_NOTIF_RESERV_PENDING: bodyTokenValues.Add("ownername", basemessage.FromUserName); bodyTokenValues.Add("cardname", basemessage.CardName); bodyTokenValues.Add("cardtype", basemessage.CardType); bodyTokenValues.Add("carddesc", basemessage.CardDescription); bodyTokenValues.Add("datefrom", basemessage.DateFrom.ToString(dateformat)); bodyTokenValues.Add("dateto", basemessage.DateTo.ToString(dateformat)); bodyTokenValues.Add("url", webDomain + "#/posts/" + basemessage.CardId); bodyTokenValues.Add("unsubUrl", webDomain + "#/unsubscr?type=notifications&code=" + basemessage.UnsubscrCode); break; case RespH.SRV_NOTIF_RESERV_ACCEPTED: bodyTokenValues.Add("ownername", basemessage.FromUserName); bodyTokenValues.Add("cardname", basemessage.CardName); bodyTokenValues.Add("cardtype", basemessage.CardType); bodyTokenValues.Add("carddesc", basemessage.CardDescription); bodyTokenValues.Add("datefrom", basemessage.DateFrom.ToString(dateformat)); bodyTokenValues.Add("dateto", basemessage.DateTo.ToString(dateformat)); bodyTokenValues.Add("url", webDomain + "#/posts/" + basemessage.CardId); bodyTokenValues.Add("unsubUrl", webDomain + "#/unsubscr?type=notifications&code=" + basemessage.UnsubscrCode); break; case RespH.SRV_NOTIF_RESERV_DECLINED: bodyTokenValues.Add("ownername", basemessage.FromUserName); bodyTokenValues.Add("cardname", basemessage.CardName); bodyTokenValues.Add("cardtype", basemessage.CardType); bodyTokenValues.Add("carddesc", basemessage.CardDescription); bodyTokenValues.Add("datefrom", basemessage.DateFrom.ToString(dateformat)); bodyTokenValues.Add("dateto", basemessage.DateTo.ToString(dateformat)); bodyTokenValues.Add("url", webDomain + "#/posts/" + basemessage.CardId); bodyTokenValues.Add("unsubUrl", webDomain + "#/unsubscr?type=notifications&code=" + basemessage.UnsubscrCode); break; case RespH.SRV_NOTIF_REVIEW_ADDED: bodyTokenValues.Add("username", basemessage.FromUserName); bodyTokenValues.Add("reviewtext", basemessage.ReviewText); bodyTokenValues.Add("unsubUrl", webDomain + "#/unsubscr?type=notifications&code=" + basemessage.UnsubscrCode); break; case RespH.SRV_NOTIF_REVIEW_RATING_ADDED: bodyTokenValues.Add("username", basemessage.FromUserName); bodyTokenValues.Add("reviewtext", basemessage.ReviewText); bodyTokenValues.Add("reviewrating", basemessage.ReviewRating.ToString(CultureInfo.InvariantCulture)); bodyTokenValues.Add("unsubUrl", webDomain + "#/unsubscr?type=notifications&code=" + basemessage.UnsubscrCode); break; case RespH.SRV_NOTIF_REVIEW_AVAILABLE: bodyTokenValues.Add("cardname", basemessage.CardName); bodyTokenValues.Add("carddesc", basemessage.CardDescription); bodyTokenValues.Add("datefrom", basemessage.DateFrom.ToString(dateformat)); bodyTokenValues.Add("dateto", basemessage.DateTo.ToString(dateformat)); break; case ConstVals.Reg: bodyTokenValues.Add("code", basemessage.ConfirmCode); bodyTokenValues.Add("url", webDomain + "#/confirm?userId=" + basemessage.ToUserId + "&code=" + basemessage.ConfirmCode); break; case ConstVals.Restore: bodyTokenValues.Add("code", basemessage.ConfirmCode); bodyTokenValues.Add("url", webDomain + "#/reset?userId=" + basemessage.ToUserId + "&code=" + basemessage.ConfirmCode); break; case ConstVals.Feedback: case ConstVals.Abuse: bodyTokenValues.Add("username", basemessage.FromUserName); bodyTokenValues.Add("text", basemessage.Text); if (!string.IsNullOrWhiteSpace(basemessage.FromUserEmail) && basemessage.AnswerByEmail) { bodyTokenValues.Add("email", basemessage.FromUserEmail); } else { bodyTokenValues.Add("email", "не указан"); } break; } // Формируем основное тело emailFactory = new MergedEmailFactory(new TemplateParser()); var bodyMsg = emailFactory .WithTokenValues(bodyTokenValues) .WithHtmlBody(bodyTemplate.ToString()) .Create(); // Соединяем все вместе StringBuilder fullEmail = new StringBuilder(); fullEmail.Append(greetMsg.Body); fullEmail.Append("<br><br>"); fullEmail.Append(bodyMsg.Body); bodyTemplateTv.Add("content", fullEmail.ToString()); emailFactory = new MergedEmailFactory(new TemplateParser()); MailMessage fullMailMessage = emailFactory.WithTokenValues(bodyTemplateTv) .WithHtmlBody(htmlTemplate.ToString()) .Create(); message.Html = fullMailMessage.Body; // Отслеживание переходов из письма message.EnableClickTracking(true); await Send(message); } catch (InvalidApiRequestException e) { Debug.WriteLine("!!!!!Invalid Api Request Exception!!!!!!"); foreach (var err in e.Errors) { Debug.WriteLine(err); } } catch (Exception e) { Debug.WriteLine("!!!!!SEND EMAIL EXCEPTION!!!!!!"); Debug.WriteLine(e); } }