From baf13adef898a66c99e917e71d53c61cb4b2d787 Mon Sep 17 00:00:00 2001 From: Mole Date: Fri, 4 Jun 2021 13:10:28 +0200 Subject: [PATCH] Don't convert to MimeMessage --- .../Extensions/EmailMessageExtensions.cs | 55 ++++++++++++++----- .../Extensions/EmailMessageExtensionsTests.cs | 8 +-- 2 files changed, 44 insertions(+), 19 deletions(-) diff --git a/src/Umbraco.Infrastructure/Extensions/EmailMessageExtensions.cs b/src/Umbraco.Infrastructure/Extensions/EmailMessageExtensions.cs index 075c476afe..b4a9d4942e 100644 --- a/src/Umbraco.Infrastructure/Extensions/EmailMessageExtensions.cs +++ b/src/Umbraco.Infrastructure/Extensions/EmailMessageExtensions.cs @@ -1,5 +1,5 @@ using System; -using System.Linq; +using System.Collections.Generic; using MimeKit; using MimeKit.Text; using Umbraco.Cms.Core.Models.Email; @@ -62,27 +62,52 @@ namespace Umbraco.Cms.Infrastructure.Extensions public static NotificationEmailModel ToNotificationEmail(this EmailMessage emailMessage, string configuredFromAddress) { - var mimeMessage = emailMessage.ToMimeMessage(configuredFromAddress); - if (mimeMessage.From.Any() is false || mimeMessage.To.Any() is false) - { - throw new InvalidOperationException("There must be a valid from address and recipient address."); - } - // EmailMessage only supports a single from mail, so take the first. - NotificationEmailAddress from = ToNotificationAddress(mimeMessage.From.Mailboxes.First()); + NotificationEmailAddress from = ToNotificationAddress(emailMessage.From); return new NotificationEmailModel(from, - mimeMessage.To.Mailboxes.Select(ToNotificationAddress), - mimeMessage.Cc.Mailboxes.Select(ToNotificationAddress), - mimeMessage.Bcc.Mailboxes.Select(ToNotificationAddress), - mimeMessage.ReplyTo.Mailboxes.Select(ToNotificationAddress), - mimeMessage.Subject, + GetNotificationAddresses(emailMessage.To), + GetNotificationAddresses(emailMessage.Cc), + GetNotificationAddresses(emailMessage.Bcc), + GetNotificationAddresses(emailMessage.ReplyTo), + emailMessage.Subject, emailMessage.Body, emailMessage.Attachments, emailMessage.IsBodyHtml); } - private static NotificationEmailAddress ToNotificationAddress(MailboxAddress mailboxAddress) => - new NotificationEmailAddress(mailboxAddress.Address, mailboxAddress.Name); + private static NotificationEmailAddress ToNotificationAddress(string address) + { + if (InternetAddress.TryParse(address, out InternetAddress internetAddress)) + { + if (internetAddress is MailboxAddress mailboxAddress) + { + return new NotificationEmailAddress(mailboxAddress.Address, internetAddress.Name); + } + } + + return null; + } + + private static IEnumerable GetNotificationAddresses(IEnumerable addresses) + { + if (addresses is null) + { + return null; + } + + var notificationAddresses = new List(); + + foreach (var address in addresses) + { + NotificationEmailAddress notificationAddress = ToNotificationAddress(address); + if (notificationAddress is not null) + { + notificationAddresses.Add(notificationAddress); + } + } + + return notificationAddresses; + } private static void AddAddresses(MimeMessage message, string[] addresses, Func addressListGetter, bool throwIfNoneValid = false) { diff --git a/src/Umbraco.Tests.UnitTests/Umbraco.Infrastructure/Extensions/EmailMessageExtensionsTests.cs b/src/Umbraco.Tests.UnitTests/Umbraco.Infrastructure/Extensions/EmailMessageExtensionsTests.cs index d53ecbf3f0..5112615431 100644 --- a/src/Umbraco.Tests.UnitTests/Umbraco.Infrastructure/Extensions/EmailMessageExtensionsTests.cs +++ b/src/Umbraco.Tests.UnitTests/Umbraco.Infrastructure/Extensions/EmailMessageExtensionsTests.cs @@ -150,10 +150,10 @@ namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Infrastructure.Extensions public void Can_Construct_NotificationEmailModel_From_Full_EmailMessage() { const string from = "\"From Email\" "; - string[] to = new[] { "to@email.com", "\"Second Email\" " }; - string[] cc = new[] { "\"First CC\" ", "cc2@email.com" }; - string[] bcc = new[] { "bcc@email.com", "bcc2@email.com", "\"Third BCC\" ", "invalid@email@address" }; - string[] replyTo = new[] { "replyto@email.com" }; + string[] to = { "to@email.com", "\"Second Email\" ", "invalid@invalid@invalid" }; + string[] cc = { "\"First CC\" ", "cc2@email.com", "invalid@invalid@invalid" }; + string[] bcc = { "bcc@email.com", "bcc2@email.com", "\"Third BCC\" ", "invalid@email@address" }; + string[] replyTo = { "replyto@email.com", "invalid@invalid@invalid" }; const string subject = "Subject"; const string body = "Message"; const bool isBodyHtml = false;