Пример #1
0
        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");
        }
Пример #3
0
        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"));
        }
Пример #4
0
        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, ...");
        }
Пример #7
0
        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);
            }
        }
Пример #9
0
        /// <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);
            }
        }