using System; using System.Collections.Generic; using System.Net; using System.Net.Mail; using System.Threading.Tasks; using xCommons.Extensions; using xExceptions.Constants; using xMessageService.Interfaces; using xMessageService.Models; namespace xMessageService.Providers { public partial class XMailService : IXMailService { private SmtpClient smtpClient; private readonly string defaultProvider; private readonly IDictionary configurations; public XMailService ( string defaultProvider, IDictionary configurations ) { this.defaultProvider = defaultProvider; this.configurations = configurations; // // Get instance of SMTP Client ... PrepareSmtpClient (); } public Task SendMailAsync ( XMessage message, string provider = null ) { // // Run Send Mail Asynchronous ... return Task.Run (() => { SendMail (message, provider); }); } #region Private ... /// /// Validate and Retrieve Provider Configuration for Service /// /// /// private XMailConfiguration GetConfiguration (string provider = null) { // if (provider.IsNullOrEmpty ()) { provider = defaultProvider; } // if (!configurations.Keys.Contains (provider)) { XException.MessageServiceInitialFailed.Throw (); } // return configurations[provider]; } /// /// Prepare SMTP Client by Using Specified/Default Provider /// /// private void PrepareSmtpClient (string provider = null) { // var config = GetConfiguration (provider); if (config.IsNull()) { return; } // smtpClient = new SmtpClient () { Host = config.Host, Port = config.Port, EnableSsl = config.EnableSsl, UseDefaultCredentials = false, Credentials = new NetworkCredential ( config.Username, config.Password) }; } /// /// Prepare Mail Message With Specified/Default Provider /// /// /// /// private MailMessage PrepareMailMessage ( XMessage message, string provider = null ) { // if (message == null || message.Message.IsNullOrEmpty () || message.Recievers.Count == 0) { XException.InvalidMessage.Throw (); } // var config = GetConfiguration (provider); var mailMessage = new MailMessage () { From = new MailAddress (config.Username), Subject = config.Title, Body = message.Message }; // foreach (var reciever in message.Recievers) { mailMessage.To.Add (reciever); } // return mailMessage; } /// /// Send Mail Using Specified/Default Provider /// /// /// private void SendMail ( XMessage message, string provider = null ) { // if (smtpClient.IsNull()) { // Console.WriteLine ($"SMTP Error: MessageServiceInitialFailed ..."); XException.MessageServiceInitialFailed.Throw (); } // var mailMessage = PrepareMailMessage (message, provider); // try { smtpClient.Send (mailMessage); } catch (Exception ex) { // Console.WriteLine ($"SMTP Error: {ex.Message}"); XException.MessageServiceInitialFailed.Throw (); } } #endregion } }