* Run code cleanup * Run dotnet format * Start manual fixes * Manual fixing of warnings * Fix nullability in columnalias * Fix tests * Fix up after merge * Start updating after review * Update editorconfig to contain new static & const rules * Fix up editorconfig to not contain duplicate rules * Fix up static member names * Fix up according to review * Update src/Umbraco.Infrastructure/DependencyInjection/UmbracoBuilder.DistributedCache.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Infrastructure/DependencyInjection/UmbracoBuilder.Repositories.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Infrastructure/DependencyInjection/UmbracoBuilder.Repositories.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Infrastructure/Examine/ContentIndexPopulator.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Infrastructure/Examine/ContentIndexPopulator.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Infrastructure/Examine/ContentValueSetValidator.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Infrastructure/Examine/ContentValueSetValidator.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Infrastructure/Examine/ContentValueSetValidator.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Infrastructure/Examine/ExamineUmbracoIndexingHandler.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Infrastructure/Examine/PublishedContentIndexPopulator.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Infrastructure/Extensions/InstanceIdentifiableExtensions.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Infrastructure/HostedServices/RecurringHostedServiceBase.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Infrastructure/HostedServices/ReportSiteTask.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Infrastructure/Logging/Serilog/LoggerConfigExtensions.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Infrastructure/Logging/Serilog/LoggerConfigExtensions.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Infrastructure/Macros/MacroTagParser.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Infrastructure/Macros/MacroTagParser.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Infrastructure/Macros/MacroTagParser.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Infrastructure/Migrations/Expressions/Alter/Table/IAlterTableColumnOptionBuilder.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Infrastructure/Migrations/Upgrade/V_10_0_0/AddMemberPropertiesAsColumns.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Infrastructure/ModelsBuilder/Building/TextBuilder.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Infrastructure/ModelsBuilder/Building/TextBuilder.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Infrastructure/ModelsBuilder/Building/TextBuilder.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Infrastructure/ModelsBuilder/Building/TextBuilder.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Infrastructure/ModelsBuilder/Building/TextBuilder.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Infrastructure/ModelsBuilder/Building/TextBuilder.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Infrastructure/ModelsBuilder/Building/TextBuilder.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Infrastructure/Persistence/Dtos/ExternalLoginDto.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Infrastructure/Persistence/Mappers/AccessMapper.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Infrastructure/Persistence/Mappers/AuditEntryMapper.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Infrastructure/Persistence/Mappers/MediaMapper.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Infrastructure/Persistence/Mappers/MemberMapper.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Infrastructure/Persistence/Mappers/PropertyGroupMapper.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Infrastructure/Persistence/Mappers/PropertyGroupMapper.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Infrastructure/Persistence/Mappers/PropertyTypeMapper.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Infrastructure/Persistence/Mappers/PropertyTypeMapper.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Infrastructure/Persistence/Mappers/RelationTypeMapper.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Infrastructure/Persistence/Mappers/RelationTypeMapper.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Infrastructure/Persistence/NPocoMapperCollectionBuilder.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Infrastructure/Persistence/Querying/ExpressionVisitorBase.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Infrastructure/Persistence/Repositories/Implement/ExternalLoginRepository.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Fix [..] to substring * Fix after merge with 10/dev * Fox ContentValueSetValidator.cs * Update LoggerConfigExtensions Co-authored-by: Nikolaj Geisle <niko737@edu.ucl.dk> Co-authored-by: Mole <nikolajlauridsen@protonmail.ch>
129 lines
4.3 KiB
C#
129 lines
4.3 KiB
C#
using MimeKit;
|
|
using MimeKit.Text;
|
|
using Umbraco.Cms.Core.Models.Email;
|
|
|
|
namespace Umbraco.Cms.Infrastructure.Extensions;
|
|
|
|
internal static class EmailMessageExtensions
|
|
{
|
|
public static MimeMessage ToMimeMessage(this EmailMessage mailMessage, string configuredFromAddress)
|
|
{
|
|
var fromEmail = string.IsNullOrEmpty(mailMessage.From) ? configuredFromAddress : mailMessage.From;
|
|
|
|
if (!InternetAddress.TryParse(fromEmail, out InternetAddress fromAddress))
|
|
{
|
|
throw new ArgumentException(
|
|
$"Email could not be sent. Could not parse from address {fromEmail} as a valid email address.");
|
|
}
|
|
|
|
var messageToSend = new MimeMessage { From = { fromAddress }, Subject = mailMessage.Subject };
|
|
|
|
AddAddresses(messageToSend, mailMessage.To, x => x.To, true);
|
|
AddAddresses(messageToSend, mailMessage.Cc, x => x.Cc);
|
|
AddAddresses(messageToSend, mailMessage.Bcc, x => x.Bcc);
|
|
AddAddresses(messageToSend, mailMessage.ReplyTo, x => x.ReplyTo);
|
|
|
|
if (mailMessage.HasAttachments)
|
|
{
|
|
var builder = new BodyBuilder();
|
|
if (mailMessage.IsBodyHtml)
|
|
{
|
|
builder.HtmlBody = mailMessage.Body;
|
|
}
|
|
else
|
|
{
|
|
builder.TextBody = mailMessage.Body;
|
|
}
|
|
|
|
foreach (EmailMessageAttachment attachment in mailMessage.Attachments!)
|
|
{
|
|
builder.Attachments.Add(attachment.FileName, attachment.Stream);
|
|
}
|
|
|
|
messageToSend.Body = builder.ToMessageBody();
|
|
}
|
|
else
|
|
{
|
|
messageToSend.Body =
|
|
new TextPart(mailMessage.IsBodyHtml ? TextFormat.Html : TextFormat.Plain) { Text = mailMessage.Body };
|
|
}
|
|
|
|
return messageToSend;
|
|
}
|
|
|
|
public static NotificationEmailModel ToNotificationEmail(
|
|
this EmailMessage emailMessage,
|
|
string? configuredFromAddress)
|
|
{
|
|
var fromEmail = string.IsNullOrEmpty(emailMessage.From) ? configuredFromAddress : emailMessage.From;
|
|
|
|
NotificationEmailAddress? from = ToNotificationAddress(fromEmail);
|
|
|
|
return new NotificationEmailModel(
|
|
from,
|
|
GetNotificationAddresses(emailMessage.To),
|
|
GetNotificationAddresses(emailMessage.Cc),
|
|
GetNotificationAddresses(emailMessage.Bcc),
|
|
GetNotificationAddresses(emailMessage.ReplyTo),
|
|
emailMessage.Subject,
|
|
emailMessage.Body,
|
|
emailMessage.Attachments,
|
|
emailMessage.IsBodyHtml);
|
|
}
|
|
|
|
private static void AddAddresses(MimeMessage message, string?[]? addresses, Func<MimeMessage, InternetAddressList> addressListGetter, bool throwIfNoneValid = false)
|
|
{
|
|
var foundValid = false;
|
|
if (addresses != null)
|
|
{
|
|
foreach (var address in addresses)
|
|
{
|
|
if (InternetAddress.TryParse(address, out InternetAddress internetAddress))
|
|
{
|
|
addressListGetter(message).Add(internetAddress);
|
|
foundValid = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (throwIfNoneValid && foundValid == false)
|
|
{
|
|
throw new InvalidOperationException("Email could not be sent. Could not parse a valid recipient address.");
|
|
}
|
|
}
|
|
|
|
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;
|
|
}
|
|
}
|