From 9957aef8119416580184813a36d14b747fa38fa2 Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Tue, 25 Oct 2011 19:25:08 -0700 Subject: [PATCH] Added SMTP as an ExternalNotifcation method. --- NzbDrone.Core/CentralDispatch.cs | 1 + NzbDrone.Core/NzbDrone.Core.csproj | 2 + .../Providers/Core/ConfigProvider.cs | 57 +++++++++++++++ .../Providers/ExternalNotification/Smtp.cs | 51 +++++++++++++ NzbDrone.Core/Providers/SmtpProvider.cs | 72 +++++++++++++++++++ 5 files changed, 183 insertions(+) create mode 100644 NzbDrone.Core/Providers/ExternalNotification/Smtp.cs create mode 100644 NzbDrone.Core/Providers/SmtpProvider.cs diff --git a/NzbDrone.Core/CentralDispatch.cs b/NzbDrone.Core/CentralDispatch.cs index 7a661f892..47c90a29d 100644 --- a/NzbDrone.Core/CentralDispatch.cs +++ b/NzbDrone.Core/CentralDispatch.cs @@ -105,6 +105,7 @@ namespace NzbDrone.Core private static void BindExternalNotifications() { _kernel.Bind().To(); + _kernel.Bind().To(); var notifiers = _kernel.GetAll(); _kernel.Get().InitializeNotifiers(notifiers.ToList()); diff --git a/NzbDrone.Core/NzbDrone.Core.csproj b/NzbDrone.Core/NzbDrone.Core.csproj index 3018c61d8..65e6e06f7 100644 --- a/NzbDrone.Core/NzbDrone.Core.csproj +++ b/NzbDrone.Core/NzbDrone.Core.csproj @@ -215,6 +215,7 @@ + @@ -226,6 +227,7 @@ + diff --git a/NzbDrone.Core/Providers/Core/ConfigProvider.cs b/NzbDrone.Core/Providers/Core/ConfigProvider.cs index 00b4f8bf9..745fa6d5c 100644 --- a/NzbDrone.Core/Providers/Core/ConfigProvider.cs +++ b/NzbDrone.Core/Providers/Core/ConfigProvider.cs @@ -255,6 +255,63 @@ namespace NzbDrone.Core.Providers.Core set { SetValue("UpdateUrl", value); } } + public virtual Boolean SmtpNotifyOnGrab + { + get { return GetValueBoolean("SmtpNotifyOnGrab"); } + + set { SetValue("SmtpNotifyOnGrab", value); } + } + + public virtual Boolean SmtpNotifyOnDownload + { + get { return GetValueBoolean("SmtpNotifyOnDownload"); } + + set { SetValue("SmtpNotifyOnDownload", value); } + } + + public virtual string SmtpServer + { + get { return GetValue("SmtpServer", String.Empty); } + set { SetValue("SmtpServer", value); } + } + + public virtual int SmtpPort + { + get { return GetValueInt("SmtpPort", 25); } + set { SetValue("SmtpPort", value); } + } + + public virtual Boolean SmtpUseSsl + { + get { return GetValueBoolean("SmtpUseSsl"); } + + set { SetValue("SmtpUseSsl", value); } + } + + public virtual string SmtpUsername + { + get { return GetValue("SmtpUsername", String.Empty); } + set { SetValue("SmtpUsername", value); } + } + + public virtual string SmtpPassword + { + get { return GetValue("SmtpPassword", String.Empty); } + set { SetValue("SmtpPassword", value); } + } + + public virtual string SmtpFromAddress + { + get { return GetValue("SmtpFromAddress", String.Empty); } + set { SetValue("SmtpFromAddress", value); } + } + + public virtual string SmtpToAddresses + { + get { return GetValue("SmtpToAddresses", String.Empty); } + set { SetValue("SmtpToAddresses", value); } + } + private string GetValue(string key) { return GetValue(key, String.Empty); diff --git a/NzbDrone.Core/Providers/ExternalNotification/Smtp.cs b/NzbDrone.Core/Providers/ExternalNotification/Smtp.cs new file mode 100644 index 000000000..33287a053 --- /dev/null +++ b/NzbDrone.Core/Providers/ExternalNotification/Smtp.cs @@ -0,0 +1,51 @@ +using System; +using NzbDrone.Core.Providers.Core; +using NzbDrone.Core.Repository; + +namespace NzbDrone.Core.Providers.ExternalNotification +{ + public class Smtp: ExternalNotificationBase + { + private readonly SmtpProvider _smtpProvider; + + public Smtp(ConfigProvider configProvider, SmtpProvider smtpProvider) + : base(configProvider) + { + _smtpProvider = smtpProvider; + } + + public override string Name + { + get { return "SMTP"; } + } + + public override void OnGrab(string message) + { + const string subject = "NzbDrone [TV] - Grabbed"; + var body = String.Format("{0} sent to SABnzbd queue.", message); + + if (_configProvider.SmtpNotifyOnGrab) + { + _logger.Trace("Sending SMTP Notification"); + _smtpProvider.SendEmail(subject, body); + } + } + + public override void OnDownload(string message, Series series) + { + const string subject = "NzbDrone [TV] - Downloaded"; + var body = String.Format("{0} Downloaded and sorted.", message); + + if (_configProvider.SmtpNotifyOnDownload) + { + _logger.Trace("Sending SMTP Notification"); + _smtpProvider.SendEmail(subject, body); + } + } + + public override void OnRename(string message, Series series) + { + + } + } +} diff --git a/NzbDrone.Core/Providers/SmtpProvider.cs b/NzbDrone.Core/Providers/SmtpProvider.cs new file mode 100644 index 000000000..753971cac --- /dev/null +++ b/NzbDrone.Core/Providers/SmtpProvider.cs @@ -0,0 +1,72 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net.Mail; +using System.Text; +using NLog; +using Ninject; +using NzbDrone.Core.Providers.Core; + +namespace NzbDrone.Core.Providers +{ + public class SmtpProvider + { + private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); + private readonly ConfigProvider _configProvider; + + [Inject] + public SmtpProvider(ConfigProvider configProvider) + { + _configProvider = configProvider; + } + + public virtual bool SendEmail(string subject, string body, bool htmlBody = false) + { + try + { + //Create the Email message + var email = new MailMessage(); + + //Set the addresses + email.From = new MailAddress(_configProvider.SmtpFromAddress); + + //Allow multiple to addresses (split on each comma) + foreach (var toAddress in _configProvider.SmtpToAddresses.Split(',')) + { + email.To.Add(toAddress.Trim()); + } + + //Set the Subject + email.Subject = subject; + + //Set the Body + email.Body = body; + + //Html Body + email.IsBodyHtml = htmlBody; + + //Create the SMTP connection + var smtp = new SmtpClient(_configProvider.SmtpServer, _configProvider.SmtpPort); + + //Enable SSL + smtp.EnableSsl = true; + + //Credentials + smtp.Credentials = new System.Net.NetworkCredential(_configProvider.SmtpUsername, _configProvider.SmtpPassword); + + //Send the email + smtp.Send(email); + + return true; + } + + catch (Exception ex) + { + Logger.Error("There was an error sending an email."); + Logger.TraceException(ex.Message, ex); + } + + return false; + } + } +}