Don't convert to MimeMessage

This commit is contained in:
Mole
2021-06-04 13:10:28 +02:00
parent ba129b045b
commit baf13adef8
2 changed files with 44 additions and 19 deletions

View File

@@ -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<NotificationEmailAddress> GetNotificationAddresses(IEnumerable<string> addresses)
{
if (addresses is null)
{
return null;
}
var notificationAddresses = new List<NotificationEmailAddress>();
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<MimeMessage, InternetAddressList> addressListGetter, bool throwIfNoneValid = false)
{