diff --git a/src/Umbraco.Core/Events/SendEmailEventArgs.cs b/src/Umbraco.Infrastructure/Events/SendEmailEventArgs.cs similarity index 100% rename from src/Umbraco.Core/Events/SendEmailEventArgs.cs rename to src/Umbraco.Infrastructure/Events/SendEmailEventArgs.cs diff --git a/src/Umbraco.Core/EmailSender.cs b/src/Umbraco.Infrastructure/Users/EmailSender.cs similarity index 58% rename from src/Umbraco.Core/EmailSender.cs rename to src/Umbraco.Infrastructure/Users/EmailSender.cs index 5cfdd765bc..62c45b8f78 100644 --- a/src/Umbraco.Core/EmailSender.cs +++ b/src/Umbraco.Infrastructure/Users/EmailSender.cs @@ -1,9 +1,12 @@ using System; using System.Net.Mail; using System.Threading.Tasks; -using Umbraco.Core.Composing; +using MailKit.Security; +using MimeKit; +using MimeKit.Text; using Umbraco.Core.Configuration; using Umbraco.Core.Events; +using SmtpClient = MailKit.Net.Smtp.SmtpClient; namespace Umbraco.Core { @@ -21,7 +24,7 @@ namespace Umbraco.Core { } - internal EmailSender(IGlobalSettings globalSettings, bool enableEvents) + public EmailSender(IGlobalSettings globalSettings, bool enableEvents) { _globalSettings = globalSettings; _enableEvents = enableEvents; @@ -45,7 +48,9 @@ namespace Umbraco.Core { using (var client = new SmtpClient()) { - client.Send(message); + client.Connect(_globalSettings.SmtpSettings.Host, _globalSettings.SmtpSettings.Port); + client.Send(ConstructEmailMessage(message)); + client.Disconnect(true); } } } @@ -65,14 +70,21 @@ namespace Umbraco.Core { using (var client = new SmtpClient()) { - if (client.DeliveryMethod == SmtpDeliveryMethod.Network) + var appSettingsDeliveryMethod = _globalSettings.SmtpSettings.DeliveryMethod; + var deliveryMethod = (SmtpDeliveryMethod)Enum.Parse(typeof(SmtpDeliveryMethod), appSettingsDeliveryMethod, true); + + await client.ConnectAsync(_globalSettings.SmtpSettings.Host, _globalSettings.SmtpSettings.Port); + + if (deliveryMethod == SmtpDeliveryMethod.Network) { - await client.SendMailAsync(message); + await client.SendAsync(ConstructEmailMessage(message)); } else { - client.Send(message); + client.Send(ConstructEmailMessage(message)); } + + await client.DisconnectAsync(true); } } } @@ -83,7 +95,7 @@ namespace Umbraco.Core /// /// We assume this is possible if either an event handler is registered or an smtp server is configured /// - internal static bool CanSendRequiredEmail(IGlobalSettings globalSettings) => EventHandlerRegistered || globalSettings.IsSmtpServerConfigured; + public static bool CanSendRequiredEmail(IGlobalSettings globalSettings) => EventHandlerRegistered || globalSettings.IsSmtpServerConfigured; /// /// returns true if an event handler has been registered @@ -103,5 +115,29 @@ namespace Umbraco.Core var handler = SendEmail; if (handler != null) handler(null, e); } + + private MimeMessage ConstructEmailMessage(MailMessage mailMessage) + { + var messageToSend = new MimeMessage + { + Subject = mailMessage.Subject + }; + + var fromEmail = mailMessage.From?.Address; + if(string.IsNullOrEmpty(fromEmail)) + fromEmail = _globalSettings.SmtpSettings.From; + + messageToSend.From.Add(new MailboxAddress(fromEmail)); + + foreach (var mailAddress in mailMessage.To) + messageToSend.To.Add(new MailboxAddress(mailAddress.Address)); + + if (mailMessage.IsBodyHtml) + messageToSend.Body = new TextPart(TextFormat.Html) { Text = mailMessage.Body }; + else + messageToSend.Body = new TextPart(TextFormat.Plain) { Text = mailMessage.Body }; + + return messageToSend; + } } } diff --git a/src/Umbraco.Core/IEmailSender.cs b/src/Umbraco.Infrastructure/Users/IEmailSender.cs similarity index 100% rename from src/Umbraco.Core/IEmailSender.cs rename to src/Umbraco.Infrastructure/Users/IEmailSender.cs