New: Option to attach files to email notifications (#18)

This commit is contained in:
Thomas Mathews 2020-05-10 15:09:43 +01:00 committed by GitHub
parent 8c2750e96c
commit 663aa462b0
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
13 changed files with 59 additions and 31 deletions

View file

@ -18,12 +18,12 @@ public Boxcar(IBoxcarProxy proxy)
public override void OnGrab(GrabMessage grabMessage) public override void OnGrab(GrabMessage grabMessage)
{ {
_proxy.SendNotification(ALBUM_GRABBED_TITLE, grabMessage.Message, Settings); _proxy.SendNotification(BOOK_GRABBED_TITLE, grabMessage.Message, Settings);
} }
public override void OnReleaseImport(AlbumDownloadMessage message) public override void OnReleaseImport(AlbumDownloadMessage message)
{ {
_proxy.SendNotification(ALBUM_DOWNLOADED_TITLE, message.Message, Settings); _proxy.SendNotification(BOOK_DOWNLOADED_TITLE, message.Message, Settings);
} }
public override void OnHealthIssue(HealthCheck.HealthCheck message) public override void OnHealthIssue(HealthCheck.HealthCheck message)

View file

@ -92,7 +92,7 @@ public override void OnTrackRetag(TrackRetagMessage message)
{ {
new Embed new Embed
{ {
Title = TRACK_RETAGGED_TITLE, Title = BOOK_RETAGGED_TITLE,
Text = message.Message Text = message.Message
} }
}; };

View file

@ -21,14 +21,16 @@ public override void OnGrab(GrabMessage grabMessage)
{ {
var body = $"{grabMessage.Message} sent to queue."; var body = $"{grabMessage.Message} sent to queue.";
_emailService.SendEmail(Settings, ALBUM_GRABBED_TITLE_BRANDED, body); _emailService.SendEmail(Settings, BOOK_GRABBED_TITLE_BRANDED, body);
} }
public override void OnReleaseImport(AlbumDownloadMessage message) public override void OnReleaseImport(AlbumDownloadMessage message)
{ {
var body = $"{message.Message} Downloaded and sorted."; var body = $"{message.Message} Downloaded and sorted.";
_emailService.SendEmail(Settings, ALBUM_DOWNLOADED_TITLE_BRANDED, body); var paths = Settings.AttachFiles ? message.TrackFiles.SelectList(a => a.Path) : null;
_emailService.SendEmail(Settings, BOOK_DOWNLOADED_TITLE_BRANDED, body, false, paths);
} }
public override void OnHealthIssue(HealthCheck.HealthCheck message) public override void OnHealthIssue(HealthCheck.HealthCheck message)

View file

@ -1,4 +1,6 @@
using System; using System;
using System.Collections.Generic;
using System.Linq;
using System.Net; using System.Net;
using System.Net.Mail; using System.Net.Mail;
using FluentValidation.Results; using FluentValidation.Results;
@ -8,7 +10,7 @@ namespace NzbDrone.Core.Notifications.Email
{ {
public interface IEmailService public interface IEmailService
{ {
void SendEmail(EmailSettings settings, string subject, string body, bool htmlBody = false); void SendEmail(EmailSettings settings, string subject, string body, bool htmlBody = false, List<string> attachmentUrls = null);
ValidationFailure Test(EmailSettings settings); ValidationFailure Test(EmailSettings settings);
} }
@ -21,17 +23,27 @@ public EmailService(Logger logger)
_logger = logger; _logger = logger;
} }
public void SendEmail(EmailSettings settings, string subject, string body, bool htmlBody = false) public void SendEmail(EmailSettings settings, string subject, string body, bool htmlBody = false, List<string> attachmentUrls = null)
{ {
var email = new MailMessage(); var email = new MailMessage();
email.From = new MailAddress(settings.From); email.From = new MailAddress(settings.From);
email.To.Add(settings.To); settings.To.ToList().ForEach(x => email.To.Add(x));
settings.CC.ToList().ForEach(x => email.CC.Add(x));
settings.Bcc.ToList().ForEach(x => email.Bcc.Add(x));
email.Subject = subject; email.Subject = subject;
email.Body = body; email.Body = body;
email.IsBodyHtml = htmlBody; email.IsBodyHtml = htmlBody;
if (attachmentUrls != null)
{
foreach (var url in attachmentUrls)
{
email.Attachments.Add(new Attachment(url));
}
}
NetworkCredential credentials = null; NetworkCredential credentials = null;
if (!string.IsNullOrWhiteSpace(settings.Username)) if (!string.IsNullOrWhiteSpace(settings.Username))

View file

@ -1,4 +1,5 @@
using FluentValidation; using System.Collections.Generic;
using FluentValidation;
using NzbDrone.Core.Annotations; using NzbDrone.Core.Annotations;
using NzbDrone.Core.ThingiProvider; using NzbDrone.Core.ThingiProvider;
using NzbDrone.Core.Validation; using NzbDrone.Core.Validation;
@ -23,6 +24,10 @@ public class EmailSettings : IProviderConfig
public EmailSettings() public EmailSettings()
{ {
Port = 25; Port = 25;
To = new string[] { };
CC = new string[] { };
Bcc = new string[] { };
} }
[FieldDefinition(0, Label = "Server", HelpText = "Hostname or IP of Email server")] [FieldDefinition(0, Label = "Server", HelpText = "Hostname or IP of Email server")]
@ -43,8 +48,17 @@ public EmailSettings()
[FieldDefinition(5, Label = "From Address")] [FieldDefinition(5, Label = "From Address")]
public string From { get; set; } public string From { get; set; }
[FieldDefinition(6, Label = "Recipient Address")] [FieldDefinition(6, Label = "Recipient Address(es)", HelpText = "Comma seperated list of email recipients")]
public string To { get; set; } public IEnumerable<string> To { get; set; }
[FieldDefinition(7, Label = "CC Address(es)", HelpText = "Comma seperated list of email cc recipients", Advanced = true)]
public IEnumerable<string> CC { get; set; }
[FieldDefinition(8, Label = "BCC Address(es)", HelpText = "Comma seperated list of email bcc recipients", Advanced = true)]
public IEnumerable<string> Bcc { get; set; }
[FieldDefinition(9, Label = "Attach Books", HelpText = "Add books as an attachment on import", Type = FieldType.Checkbox)]
public bool AttachFiles { get; set; }
public NzbDroneValidationResult Validate() public NzbDroneValidationResult Validate()
{ {

View file

@ -21,12 +21,12 @@ public Gotify(IGotifyProxy proxy, Logger logger)
public override void OnGrab(GrabMessage grabMessage) public override void OnGrab(GrabMessage grabMessage)
{ {
_proxy.SendNotification(ALBUM_GRABBED_TITLE, grabMessage.Message, Settings); _proxy.SendNotification(BOOK_GRABBED_TITLE, grabMessage.Message, Settings);
} }
public override void OnReleaseImport(AlbumDownloadMessage message) public override void OnReleaseImport(AlbumDownloadMessage message)
{ {
_proxy.SendNotification(ALBUM_DOWNLOADED_TITLE, message.Message, Settings); _proxy.SendNotification(BOOK_DOWNLOADED_TITLE, message.Message, Settings);
} }
public override void OnHealthIssue(HealthCheck.HealthCheck healthCheck) public override void OnHealthIssue(HealthCheck.HealthCheck healthCheck)

View file

@ -19,12 +19,12 @@ public Join(IJoinProxy proxy)
public override void OnGrab(GrabMessage message) public override void OnGrab(GrabMessage message)
{ {
_proxy.SendNotification(ALBUM_GRABBED_TITLE_BRANDED, message.Message, Settings); _proxy.SendNotification(BOOK_GRABBED_TITLE_BRANDED, message.Message, Settings);
} }
public override void OnReleaseImport(AlbumDownloadMessage message) public override void OnReleaseImport(AlbumDownloadMessage message)
{ {
_proxy.SendNotification(ALBUM_DOWNLOADED_TITLE_BRANDED, message.Message, Settings); _proxy.SendNotification(BOOK_DOWNLOADED_TITLE_BRANDED, message.Message, Settings);
} }
public override void OnHealthIssue(HealthCheck.HealthCheck message) public override void OnHealthIssue(HealthCheck.HealthCheck message)

View file

@ -9,19 +9,19 @@ namespace NzbDrone.Core.Notifications
public abstract class NotificationBase<TSettings> : INotification public abstract class NotificationBase<TSettings> : INotification
where TSettings : IProviderConfig, new() where TSettings : IProviderConfig, new()
{ {
protected const string ALBUM_GRABBED_TITLE = "Album Grabbed"; protected const string BOOK_GRABBED_TITLE = "Book Grabbed";
protected const string ALBUM_DOWNLOADED_TITLE = "Album Downloaded"; protected const string BOOK_DOWNLOADED_TITLE = "Book Downloaded";
protected const string HEALTH_ISSUE_TITLE = "Health Check Failure"; protected const string HEALTH_ISSUE_TITLE = "Health Check Failure";
protected const string DOWNLOAD_FAILURE_TITLE = "Download Failed"; protected const string DOWNLOAD_FAILURE_TITLE = "Download Failed";
protected const string IMPORT_FAILURE_TITLE = "Import Failed"; protected const string IMPORT_FAILURE_TITLE = "Import Failed";
protected const string TRACK_RETAGGED_TITLE = "Track File Tags Updated"; protected const string BOOK_RETAGGED_TITLE = "Book File Tags Updated";
protected const string ALBUM_GRABBED_TITLE_BRANDED = "Readarr - " + ALBUM_GRABBED_TITLE; protected const string BOOK_GRABBED_TITLE_BRANDED = "Readarr - " + BOOK_GRABBED_TITLE;
protected const string ALBUM_DOWNLOADED_TITLE_BRANDED = "Readarr - " + ALBUM_DOWNLOADED_TITLE; protected const string BOOK_DOWNLOADED_TITLE_BRANDED = "Readarr - " + BOOK_DOWNLOADED_TITLE;
protected const string HEALTH_ISSUE_TITLE_BRANDED = "Readarr - " + HEALTH_ISSUE_TITLE; protected const string HEALTH_ISSUE_TITLE_BRANDED = "Readarr - " + HEALTH_ISSUE_TITLE;
protected const string DOWNLOAD_FAILURE_TITLE_BRANDED = "Readarr - " + DOWNLOAD_FAILURE_TITLE; protected const string DOWNLOAD_FAILURE_TITLE_BRANDED = "Readarr - " + DOWNLOAD_FAILURE_TITLE;
protected const string IMPORT_FAILURE_TITLE_BRANDED = "Readarr - " + IMPORT_FAILURE_TITLE; protected const string IMPORT_FAILURE_TITLE_BRANDED = "Readarr - " + IMPORT_FAILURE_TITLE;
protected const string TRACK_RETAGGED_TITLE_BRANDED = "Readarr - " + TRACK_RETAGGED_TITLE; protected const string BOOK_RETAGGED_TITLE_BRANDED = "Readarr - " + BOOK_RETAGGED_TITLE;
public abstract string Name { get; } public abstract string Name { get; }

View file

@ -21,12 +21,12 @@ public PushBullet(IPushBulletProxy proxy)
public override void OnGrab(GrabMessage grabMessage) public override void OnGrab(GrabMessage grabMessage)
{ {
_proxy.SendNotification(ALBUM_GRABBED_TITLE_BRANDED, grabMessage.Message, Settings); _proxy.SendNotification(BOOK_GRABBED_TITLE_BRANDED, grabMessage.Message, Settings);
} }
public override void OnReleaseImport(AlbumDownloadMessage message) public override void OnReleaseImport(AlbumDownloadMessage message)
{ {
_proxy.SendNotification(ALBUM_DOWNLOADED_TITLE_BRANDED, message.Message, Settings); _proxy.SendNotification(BOOK_DOWNLOADED_TITLE_BRANDED, message.Message, Settings);
} }
public override void OnHealthIssue(HealthCheck.HealthCheck healthCheck) public override void OnHealthIssue(HealthCheck.HealthCheck healthCheck)

View file

@ -18,12 +18,12 @@ public Pushover(IPushoverProxy proxy)
public override void OnGrab(GrabMessage grabMessage) public override void OnGrab(GrabMessage grabMessage)
{ {
_proxy.SendNotification(ALBUM_GRABBED_TITLE, grabMessage.Message, Settings); _proxy.SendNotification(BOOK_GRABBED_TITLE, grabMessage.Message, Settings);
} }
public override void OnReleaseImport(AlbumDownloadMessage message) public override void OnReleaseImport(AlbumDownloadMessage message)
{ {
_proxy.SendNotification(ALBUM_DOWNLOADED_TITLE, message.Message, Settings); _proxy.SendNotification(BOOK_DOWNLOADED_TITLE, message.Message, Settings);
} }
public override void OnHealthIssue(HealthCheck.HealthCheck healthCheck) public override void OnHealthIssue(HealthCheck.HealthCheck healthCheck)

View file

@ -92,12 +92,12 @@ public override void OnTrackRetag(TrackRetagMessage message)
{ {
new Attachment new Attachment
{ {
Title = TRACK_RETAGGED_TITLE, Title = BOOK_RETAGGED_TITLE,
Text = message.Message Text = message.Message
} }
}; };
var payload = CreatePayload(TRACK_RETAGGED_TITLE, attachments); var payload = CreatePayload(BOOK_RETAGGED_TITLE, attachments);
_proxy.SendPayload(payload, Settings); _proxy.SendPayload(payload, Settings);
} }

View file

@ -47,7 +47,7 @@ public override void OnHealthIssue(HealthCheck.HealthCheck healthCheck)
public override void OnTrackRetag(TrackRetagMessage message) public override void OnTrackRetag(TrackRetagMessage message)
{ {
Notify(Settings, TRACK_RETAGGED_TITLE_BRANDED, message.Message); Notify(Settings, BOOK_RETAGGED_TITLE_BRANDED, message.Message);
} }
public override string Name => "Subsonic"; public override string Name => "Subsonic";

View file

@ -18,12 +18,12 @@ public Telegram(ITelegramProxy proxy)
public override void OnGrab(GrabMessage grabMessage) public override void OnGrab(GrabMessage grabMessage)
{ {
_proxy.SendNotification(ALBUM_GRABBED_TITLE, grabMessage.Message, Settings); _proxy.SendNotification(BOOK_GRABBED_TITLE, grabMessage.Message, Settings);
} }
public override void OnReleaseImport(AlbumDownloadMessage message) public override void OnReleaseImport(AlbumDownloadMessage message)
{ {
_proxy.SendNotification(ALBUM_DOWNLOADED_TITLE, message.Message, Settings); _proxy.SendNotification(BOOK_DOWNLOADED_TITLE, message.Message, Settings);
} }
public override void OnHealthIssue(HealthCheck.HealthCheck healthCheck) public override void OnHealthIssue(HealthCheck.HealthCheck healthCheck)