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); }
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); }
public void SetupReadsTemplates() { // --- Arrange var sendertask = new EmailSenderTask(); // --- Act sendertask.Setup(new EmailTaskExecutionContext()); // --- Assert EmailSenderTask.TemplateDefinitions.ShouldHaveCountOf(6); }
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"); } }
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"); } }
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"); } }
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); }
public void Initialize() { SqlScriptHelper.RunScript("InitEmailTemplates.sql"); EmailSenderTask.ResetCache(); }