Пример #1
0
        public virtual async Task <bool> ProcessMessageAsync(string address, string messageBodyJson)
        {
            if (!address.EndsWith(EmailSenderConstants.AddressSuffix))
            {
                return(false);
            }

            EmailSenderTask emailSenderTask = JsonConvert.DeserializeObject <EmailSenderTask>(messageBodyJson);

            List <EmailAttachment> emailAttachments = null;

            if (emailSenderTask.EmailAttachments != null)
            {
                emailAttachments = new List <EmailAttachment>();

                foreach (var encodedEmailAttachment in emailSenderTask.EmailAttachments)
                {
                    emailAttachments.Add(new EmailAttachment(
                                             encodedEmailAttachment.MimeType,
                                             encodedEmailAttachment.FileName,
                                             Convert.FromBase64String(encodedEmailAttachment.Base64EncodedContent)));
                }
            }

            await SendEmailAsync(emailSenderTask.ConfigurationKey, emailSenderTask.FromOverride, emailSenderTask.To, emailSenderTask.Cc, emailSenderTask.Bcc, emailSenderTask.Subject, emailSenderTask.HtmlMessage, emailAttachments).ConfigureAwait(false);

            return(true);
        }
Пример #2
0
        public async Task SendEmailAsync(string configurationKey, string fromOverride, string fromDisplayNameOverride, List <string> to, List <string> cc, List <string> bcc, string subject, string htmlMessage, List <EmailAttachment> emailAttachments = null)
        {
            if (to.TrueForAll(string.IsNullOrEmpty))
            {
                throw new Exception("At least one valid to address is required!");
            }

            if (string.IsNullOrEmpty(subject))
            {
                throw new Exception("A subject line is required!");
            }

            long totalApproximateSize = 0;

            var emailSenderTask = new EmailSenderTask()
            {
                ConfigurationKey        = configurationKey,
                FromOverride            = fromOverride,
                FromDisplayNameOverride = fromDisplayNameOverride,
                To          = to,
                Cc          = cc,
                Bcc         = bcc,
                Subject     = subject,
                HtmlMessage = htmlMessage
            };

            totalApproximateSize += htmlMessage.Length;

            if (emailAttachments != null)
            {
                emailSenderTask.EmailAttachments = new List <EmailSenderTaskEmailAttachment>();

                foreach (var emailAttachment in emailAttachments)
                {
                    var base64EncodedContent = Convert.ToBase64String(emailAttachment.Content);

                    totalApproximateSize += base64EncodedContent.Length;

                    emailSenderTask.EmailAttachments.Add(new EmailSenderTaskEmailAttachment()
                    {
                        Base64EncodedContent = base64EncodedContent,
                        FileName             = emailAttachment.FileName,
                        MimeType             = emailAttachment.MimeType
                    });
                }
            }

            if (totalApproximateSize > 200000)
            {
                // 256kB is Service Bus max message size

                throw new Exception("The total email message size must not exceed 200 kB");
            }

            await _amqpMessenger.SendMessageAsync(_emailSenderAddress,
                                                  emailSenderTask).ConfigureAwait(false);
        }
Пример #3
0
        public void SetupReadsTemplates()
        {
            // --- Arrange
            var sendertask = new EmailSenderTask();

            // --- Act
            sendertask.Setup(new EmailTaskExecutionContext());

            // --- Assert
            EmailSenderTask.TemplateDefinitions.ShouldHaveCountOf(6);
        }
Пример #4
0
        public void RetryWorksAsExpected()
        {
            // --- Arrange
            var service    = ServiceManager.GetService <IEmailComposerService>();
            var sendertask = new EmailSenderTask();

            ServiceManager.RemoveService(typeof(IEmailSender));
            ServiceManager.Register <IEmailSender, EmailSenderWithRetry>();
            for (var i = 0; i < 5; i++)
            {
                var request = new EmailDefinitionDto
                {
                    FromAddr     = "*****@*****.**",
                    FromName     = "You",
                    ToAddr       = "*****@*****.**",
                    TemplateType = "MeetingProposed",
                    Parameters   = new Dictionary <string, string> {
                        { "FullName", "MyName" }
                    },
                    SendAfterUtc = null
                };
                service.SendEmail(request);
            }

            // --- Act
            FakeConfigurationReader.SetConfigurationValue("SmtpConfig", "EmailCount", "4");
            FakeConfigurationReader.SetConfigurationValue("SmtpConfig", "MaxRetry", "3");
            EmailSenderWithRetry.ForceFailure = true;

            sendertask.Setup(new EmailTaskExecutionContext());
            sendertask.Run();
            sendertask.Run();
            EmailSenderWithRetry.ForceFailure = false;
            sendertask.Run();

            // --- Assert
            var db           = new SqlDatabase(DB_CONN);
            var emailsToSend = db.Fetch <EmailToSendRecord>();

            emailsToSend.ShouldHaveCountOf(1);
            var emailsSent = db.Fetch <EmailSentRecord>();

            emailsSent.ShouldHaveCountOf(4);
            var emailsFailed = db.Fetch <EmailFailedRecord>();

            emailsFailed.ShouldHaveCountOf(0);

            foreach (var email in emailsSent)
            {
                email.Subject.ShouldEqual("Evaluation meeting proposed");
                email.Message.ShouldContain("MyName");
                email.Message.ShouldNotContain("FullName");
            }
        }
Пример #5
0
        public void EmailsFailWithUnknownTemplate()
        {
            // --- Arrange
            var service    = ServiceManager.GetService <IEmailComposerService>();
            var sendertask = new EmailSenderTask();

            ServiceManager.RemoveService(typeof(IEmailSender));
            ServiceManager.Register <IEmailSender, AlwaysWorkingEmailSender>();
            for (var i = 0; i < 5; i++)
            {
                var request = new EmailDefinitionDto
                {
                    FromAddr     = "*****@*****.**",
                    FromName     = "You",
                    ToAddr       = "*****@*****.**",
                    TemplateType = "Unknown",
                    Parameters   = new Dictionary <string, string> {
                        { "FullName", "MyName" }
                    },
                    SendAfterUtc = null
                };
                service.SendEmail(request);
            }

            // --- Act
            FakeConfigurationReader.SetConfigurationValue("SmtpConfig", "EmailCount", "4");
            FakeConfigurationReader.SetConfigurationValue("SmtpConfig", "MaxRetry", "0");
            sendertask.Setup(new EmailTaskExecutionContext());
            sendertask.Run();

            // --- Assert
            var db           = new SqlDatabase(DB_CONN);
            var emailsToSend = db.Fetch <EmailToSendRecord>();

            emailsToSend.ShouldHaveCountOf(1);
            var emailsSent = db.Fetch <EmailSentRecord>();

            emailsSent.ShouldHaveCountOf(0);
            var emailsFailed = db.Fetch <EmailFailedRecord>();

            emailsFailed.ShouldHaveCountOf(4);

            foreach (var email in emailsFailed)
            {
                email.Subject.ShouldBeNull();
                email.Message.ShouldBeNull();
                email.LastError.ShouldContain("not found");
            }
        }
Пример #6
0
        public void EmailsFailWithProcessingException()
        {
            // --- Arrange
            var db         = new SqlDatabase(DB_CONN);
            var sendertask = new EmailSenderTask();

            ServiceManager.RemoveService(typeof(IEmailSender));
            ServiceManager.Register <IEmailSender, AlwaysWorkingEmailSender>();
            for (var i = 0; i < 5; i++)
            {
                db.Insert(new EmailToSendRecord
                {
                    FromAddr     = "*****@*****.**",
                    FromName     = "Me",
                    ToAddr       = "*****@*****.**",
                    TemplateType = "MeetingProposed",
                    Parameters   = "<dummy><Parameter/></dummy>"
                });
            }

            // --- Act
            FakeConfigurationReader.SetConfigurationValue("SmtpConfig", "EmailCount", "4");
            FakeConfigurationReader.SetConfigurationValue("SmtpConfig", "MaxRetry", "0");
            sendertask.Setup(new EmailTaskExecutionContext());
            sendertask.Run();

            // --- Assert
            var emailsToSend = db.Fetch <EmailToSendRecord>();

            emailsToSend.ShouldHaveCountOf(1);  //1
            var emailsSent = db.Fetch <EmailSentRecord>();

            emailsSent.ShouldHaveCountOf(0);
            var emailsFailed = db.Fetch <EmailFailedRecord>();

            emailsFailed.ShouldHaveCountOf(4);

            foreach (var email in emailsFailed)
            {
                email.Subject.ShouldBeNull();
                email.Message.ShouldBeNull();
                email.LastError.ShouldContain("Email message");
            }
        }
Пример #7
0
        public void SetupCachesTemplates()
        {
            // --- Arrange
            var sendertask = new EmailSenderTask();

            // --- Act
            var templ1 = EmailSenderTask.TemplateDefinitions;

            sendertask.Setup(new EmailTaskExecutionContext());
            var templ2 = EmailSenderTask.TemplateDefinitions;

            sendertask.Setup(new EmailTaskExecutionContext());
            var templ3 = EmailSenderTask.TemplateDefinitions;

            // --- Assert
            templ1.ShouldBeNull();
            templ2.ShouldNotBeNull();
            templ3.ShouldNotBeNull();
            templ2.ShouldBeSameAs(templ3);
        }
Пример #8
0
 public void Initialize()
 {
     SqlScriptHelper.RunScript("InitEmailTemplates.sql");
     EmailSenderTask.ResetCache();
 }