using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; using System.Net.Mail; using System.Text; using System.Threading.Tasks; using System.Web; using System.Web.Routing; using Umbraco.Core.Configuration; using Umbraco.Core.Events; namespace Umbraco.Core { /// /// A utility class for sending emails /// public class EmailSender : IEmailSender { //TODO: This should encapsulate a BackgroundTaskRunner with a queue to send these emails! private readonly bool _enableEvents; /// /// Default constructor /// public EmailSender() : this(false) { } internal EmailSender(bool enableEvents) { _enableEvents = enableEvents; } private static readonly Lazy SmtpConfigured = new Lazy(() => GlobalSettings.HasSmtpServerConfigured(HttpRuntime.AppDomainAppVirtualPath)); /// /// Sends the message non-async /// /// public void Send(MailMessage message) { if (SmtpConfigured.Value == false && _enableEvents) { OnSendEmail(new SendEmailEventArgs(message)); } else { using (var client = new SmtpClient()) { client.Send(message); } } } /// /// Sends the message async /// /// /// public async Task SendAsync(MailMessage message) { if (SmtpConfigured.Value == false && _enableEvents) { OnSendEmail(new SendEmailEventArgs(message)); } else { using (var client = new SmtpClient()) { if (client.DeliveryMethod == SmtpDeliveryMethod.Network) { await client.SendMailAsync(message); } else { client.Send(message); } } } } /// /// Returns true if the application should be able to send a required application email /// /// /// We assume this is possible if either an event handler is registered or an smtp server is configured /// internal static bool CanSendRequiredEmail { get { return EventHandlerRegistered || SmtpConfigured.Value; } } /// /// returns true if an event handler has been registered /// internal static bool EventHandlerRegistered { get { return SendEmail != null; } } /// /// An event that is raised when no smtp server is configured if events are enabled /// internal static event EventHandler SendEmail; private static void OnSendEmail(SendEmailEventArgs e) { var handler = SendEmail; if (handler != null) handler(null, e); } } }