mirror of
https://github.com/Ombi-app/Ombi.git
synced 2025-07-13 00:32:57 -07:00
Merge pull request #1047 from dhruvb14/dev
Implement Basic Mass Email Functionality
This commit is contained in:
commit
7f85f3f50f
11 changed files with 499 additions and 47 deletions
|
@ -124,6 +124,7 @@
|
||||||
<Compile Include="SettingModels\AuthenticationSettings.cs" />
|
<Compile Include="SettingModels\AuthenticationSettings.cs" />
|
||||||
<Compile Include="SettingModels\DiscordNotificationSettings.cs" />
|
<Compile Include="SettingModels\DiscordNotificationSettings.cs" />
|
||||||
<Compile Include="SettingModels\EmbySettings.cs" />
|
<Compile Include="SettingModels\EmbySettings.cs" />
|
||||||
|
<Compile Include="SettingModels\MassEmailSettings.cs" />
|
||||||
<Compile Include="SettingModels\RadarrSettings.cs" />
|
<Compile Include="SettingModels\RadarrSettings.cs" />
|
||||||
<Compile Include="SettingModels\WatcherSettings.cs" />
|
<Compile Include="SettingModels\WatcherSettings.cs" />
|
||||||
<Compile Include="SettingModels\ExternalSettings.cs" />
|
<Compile Include="SettingModels\ExternalSettings.cs" />
|
||||||
|
|
35
Ombi.Core/SettingModels/MassEmailSettings.cs
Normal file
35
Ombi.Core/SettingModels/MassEmailSettings.cs
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
#region Copyright
|
||||||
|
// /************************************************************************
|
||||||
|
// Copyright (c) 2016 Jamie Rees
|
||||||
|
// File: EmailNotificationSettings.cs
|
||||||
|
// Created By: Jamie Rees
|
||||||
|
//
|
||||||
|
// Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
// a copy of this software and associated documentation files (the
|
||||||
|
// "Software"), to deal in the Software without restriction, including
|
||||||
|
// without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
|
// permit persons to whom the Software is furnished to do so, subject to
|
||||||
|
// the following conditions:
|
||||||
|
//
|
||||||
|
// The above copyright notice and this permission notice shall be
|
||||||
|
// included in all copies or substantial portions of the Software.
|
||||||
|
//
|
||||||
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||||
|
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||||
|
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||||
|
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
|
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
// ************************************************************************/
|
||||||
|
#endregion
|
||||||
|
namespace Ombi.Core.SettingModels
|
||||||
|
{
|
||||||
|
public sealed class MassEmailSettings : NotificationSettings
|
||||||
|
{
|
||||||
|
public string Users { get; set; }
|
||||||
|
public string Subject { get; set; }
|
||||||
|
public string Body { get; set; }
|
||||||
|
}
|
||||||
|
}
|
12
Ombi.Services/Interfaces/IMassEmail.cs
Normal file
12
Ombi.Services/Interfaces/IMassEmail.cs
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
using Quartz;
|
||||||
|
|
||||||
|
namespace Ombi.Services.Jobs
|
||||||
|
{
|
||||||
|
public interface IMassEmail
|
||||||
|
{
|
||||||
|
void Execute(IJobExecutionContext context);
|
||||||
|
void MassEmailAdminTest(string html, string subject);
|
||||||
|
void SendMassEmail(string html, string subject);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -5,7 +5,7 @@ namespace Ombi.Services.Jobs
|
||||||
public interface IRecentlyAdded
|
public interface IRecentlyAdded
|
||||||
{
|
{
|
||||||
void Execute(IJobExecutionContext context);
|
void Execute(IJobExecutionContext context);
|
||||||
void Test();
|
void RecentlyAddedAdminTest();
|
||||||
void Start();
|
void Start();
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -48,7 +48,7 @@ using Quartz;
|
||||||
|
|
||||||
namespace Ombi.Services.Jobs
|
namespace Ombi.Services.Jobs
|
||||||
{
|
{
|
||||||
public class RecentlyAdded : HtmlTemplateGenerator, IJob, IRecentlyAdded
|
public class RecentlyAdded : HtmlTemplateGenerator, IJob, IRecentlyAdded, IMassEmail
|
||||||
{
|
{
|
||||||
public RecentlyAdded(IPlexApi api, ISettingsService<PlexSettings> plexSettings,
|
public RecentlyAdded(IPlexApi api, ISettingsService<PlexSettings> plexSettings,
|
||||||
ISettingsService<EmailNotificationSettings> email, IJobRecord rec,
|
ISettingsService<EmailNotificationSettings> email, IJobRecord rec,
|
||||||
|
@ -105,12 +105,30 @@ namespace Ombi.Services.Jobs
|
||||||
Start();
|
Start();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Test()
|
public void RecentlyAddedAdminTest()
|
||||||
{
|
{
|
||||||
Log.Debug("Starting Test Newsletter");
|
Log.Debug("Starting Recently Added Newsletter Test");
|
||||||
var settings = NewsletterSettings.GetSettings();
|
var settings = NewsletterSettings.GetSettings();
|
||||||
Start(settings, true);
|
Start(settings, true);
|
||||||
}
|
}
|
||||||
|
public void MassEmailAdminTest(string html, string subject)
|
||||||
|
{
|
||||||
|
Log.Debug("Starting Mass Email Test");
|
||||||
|
var settings = NewsletterSettings.GetSettings();
|
||||||
|
var plexSettings = PlexSettings.GetSettings();
|
||||||
|
var template = new MassEmailTemplate();
|
||||||
|
var body = template.LoadTemplate(html);
|
||||||
|
Send(settings, body, plexSettings, true, subject);
|
||||||
|
}
|
||||||
|
public void SendMassEmail(string html, string subject)
|
||||||
|
{
|
||||||
|
Log.Debug("Starting Mass Email Test");
|
||||||
|
var settings = NewsletterSettings.GetSettings();
|
||||||
|
var plexSettings = PlexSettings.GetSettings();
|
||||||
|
var template = new MassEmailTemplate();
|
||||||
|
var body = template.LoadTemplate(html);
|
||||||
|
Send(settings, body, plexSettings, false, subject);
|
||||||
|
}
|
||||||
|
|
||||||
private void Start(NewletterSettings newletterSettings, bool testEmail = false)
|
private void Start(NewletterSettings newletterSettings, bool testEmail = false)
|
||||||
{
|
{
|
||||||
|
@ -439,7 +457,7 @@ namespace Ombi.Services.Jobs
|
||||||
sb.Append("</table><br /><br />");
|
sb.Append("</table><br /><br />");
|
||||||
}
|
}
|
||||||
|
|
||||||
private void Send(NewletterSettings newletterSettings, string html, PlexSettings plexSettings, bool testEmail = false)
|
private void Send(NewletterSettings newletterSettings, string html, PlexSettings plexSettings, bool testEmail = false, string subject = "New Content on Plex!")
|
||||||
{
|
{
|
||||||
Log.Debug("Entering Send");
|
Log.Debug("Entering Send");
|
||||||
var settings = EmailSettings.GetSettings();
|
var settings = EmailSettings.GetSettings();
|
||||||
|
@ -454,7 +472,7 @@ namespace Ombi.Services.Jobs
|
||||||
var message = new MimeMessage
|
var message = new MimeMessage
|
||||||
{
|
{
|
||||||
Body = body.ToMessageBody(),
|
Body = body.ToMessageBody(),
|
||||||
Subject = "New Content on Plex!",
|
Subject = subject
|
||||||
};
|
};
|
||||||
Log.Debug("Created Plain/HTML MIME body");
|
Log.Debug("Created Plain/HTML MIME body");
|
||||||
|
|
||||||
|
|
58
Ombi.Services/Jobs/Templates/MassEmailTemplate.cs
Normal file
58
Ombi.Services/Jobs/Templates/MassEmailTemplate.cs
Normal file
|
@ -0,0 +1,58 @@
|
||||||
|
#region Copyright
|
||||||
|
// /************************************************************************
|
||||||
|
// Copyright (c) 2016 Jamie Rees
|
||||||
|
// File: RecentlyAddedTemplate.cs
|
||||||
|
// Created By: Jamie Rees
|
||||||
|
//
|
||||||
|
// Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
// a copy of this software and associated documentation files (the
|
||||||
|
// "Software"), to deal in the Software without restriction, including
|
||||||
|
// without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
|
// permit persons to whom the Software is furnished to do so, subject to
|
||||||
|
// the following conditions:
|
||||||
|
//
|
||||||
|
// The above copyright notice and this permission notice shall be
|
||||||
|
// included in all copies or substantial portions of the Software.
|
||||||
|
//
|
||||||
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||||
|
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||||
|
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||||
|
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
|
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
// ************************************************************************/
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.IO;
|
||||||
|
using System.Text;
|
||||||
|
using System.Windows.Forms;
|
||||||
|
using NLog;
|
||||||
|
|
||||||
|
namespace Ombi.Services.Jobs.Templates
|
||||||
|
{
|
||||||
|
public class MassEmailTemplate
|
||||||
|
{
|
||||||
|
public string TemplateLocation => Path.Combine(Path.GetDirectoryName(Application.ExecutablePath) ?? string.Empty, "Jobs", "Templates", "MassEmailTemplate.html");
|
||||||
|
private static readonly Logger Log = LogManager.GetCurrentClassLogger();
|
||||||
|
|
||||||
|
private const string RecentlyAddedKey = "{@MASSEMAIL}";
|
||||||
|
|
||||||
|
public string LoadTemplate(string html)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var sb = new StringBuilder(File.ReadAllText(TemplateLocation));
|
||||||
|
sb.Replace(RecentlyAddedKey, html);
|
||||||
|
return sb.ToString();
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
Log.Error(e);
|
||||||
|
return string.Empty;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
181
Ombi.Services/Jobs/Templates/MassEmailTemplate.html
Normal file
181
Ombi.Services/Jobs/Templates/MassEmailTemplate.html
Normal file
|
@ -0,0 +1,181 @@
|
||||||
|
<!doctype html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta name="viewport" content="width=device-width" />
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
|
||||||
|
<title>Ombi</title>
|
||||||
|
<style media="all" type="text/css">
|
||||||
|
@media all {
|
||||||
|
.btn-primary table td:hover {
|
||||||
|
background-color: #34495e !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-primary a:hover {
|
||||||
|
background-color: #34495e !important;
|
||||||
|
border-color: #34495e !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media all {
|
||||||
|
.btn-secondary a:hover {
|
||||||
|
border-color: #34495e !important;
|
||||||
|
color: #34495e !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media only screen and (max-width: 620px) {
|
||||||
|
table[class=body] h1 {
|
||||||
|
font-size: 28px !important;
|
||||||
|
margin-bottom: 10px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
table[class=body] h2 {
|
||||||
|
font-size: 22px !important;
|
||||||
|
margin-bottom: 10px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
table[class=body] h3 {
|
||||||
|
font-size: 16px !important;
|
||||||
|
margin-bottom: 10px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
table[class=body] p,
|
||||||
|
table[class=body] ul,
|
||||||
|
table[class=body] ol,
|
||||||
|
table[class=body] td,
|
||||||
|
table[class=body] span,
|
||||||
|
table[class=body] a {
|
||||||
|
font-size: 16px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
table[class=body] .wrapper,
|
||||||
|
table[class=body] .article {
|
||||||
|
padding: 10px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
table[class=body] .content {
|
||||||
|
padding: 0 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
table[class=body] .container {
|
||||||
|
padding: 0 !important;
|
||||||
|
width: 100% !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
table[class=body] .header {
|
||||||
|
margin-bottom: 10px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
table[class=body] .main {
|
||||||
|
border-left-width: 0 !important;
|
||||||
|
border-radius: 0 !important;
|
||||||
|
border-right-width: 0 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
table[class=body] .btn table {
|
||||||
|
width: 100% !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
table[class=body] .btn a {
|
||||||
|
width: 100% !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
table[class=body] .img-responsive {
|
||||||
|
height: auto !important;
|
||||||
|
max-width: 100% !important;
|
||||||
|
width: auto !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
table[class=body] .alert td {
|
||||||
|
border-radius: 0 !important;
|
||||||
|
padding: 10px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
table[class=body] .span-2,
|
||||||
|
table[class=body] .span-3 {
|
||||||
|
max-width: none !important;
|
||||||
|
width: 100% !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
table[class=body] .receipt {
|
||||||
|
width: 100% !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media all {
|
||||||
|
.ExternalClass {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ExternalClass,
|
||||||
|
.ExternalClass p,
|
||||||
|
.ExternalClass span,
|
||||||
|
.ExternalClass font,
|
||||||
|
.ExternalClass td,
|
||||||
|
.ExternalClass div {
|
||||||
|
line-height: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.apple-link a {
|
||||||
|
color: inherit !important;
|
||||||
|
font-family: inherit !important;
|
||||||
|
font-size: inherit !important;
|
||||||
|
font-weight: inherit !important;
|
||||||
|
line-height: inherit !important;
|
||||||
|
text-decoration: none !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body class="" style="font-family: sans-serif; -webkit-font-smoothing: antialiased; font-size: 14px; line-height: 1.4; -ms-text-size-adjust: 100%; -webkit-text-size-adjust: 100%; background-color: #f6f6f6; margin: 0; padding: 0;">
|
||||||
|
<table border="0" cellpadding="0" cellspacing="0" class="body" style="border-collapse: separate; mso-table-lspace: 0pt; mso-table-rspace: 0pt; width: 100%; background-color: #f6f6f6;" width="100%" bgcolor="#f6f6f6">
|
||||||
|
<tr>
|
||||||
|
<td style="font-family: sans-serif; font-size: 14px; vertical-align: top;" valign="top"> </td>
|
||||||
|
<td class="container" style="font-family: sans-serif; font-size: 14px; vertical-align: top; display: block; Margin: 0 auto !important; max-width: 580px; padding: 10px; width: 580px;" width="580" valign="top">
|
||||||
|
<div class="content" style="box-sizing: border-box; display: block; Margin: 0 auto; max-width: 580px; padding: 10px;">
|
||||||
|
|
||||||
|
<!-- START CENTERED WHITE CONTAINER -->
|
||||||
|
<span class="preheader" style="color: transparent; display: none; height: 0; max-height: 0; max-width: 0; opacity: 0; overflow: hidden; mso-hide: all; visibility: hidden; width: 0;">Ombi Recently Added</span>
|
||||||
|
<table class="main" style="border-collapse: separate; mso-table-lspace: 0pt; mso-table-rspace: 0pt; width: 100%; background: #fff; border-radius: 3px;" width="100%">
|
||||||
|
|
||||||
|
<!-- START MAIN CONTENT AREA -->
|
||||||
|
<tr>
|
||||||
|
<td class="wrapper" style="font-family: sans-serif; font-size: 14px; vertical-align: top; box-sizing: border-box; padding: 20px;" valign="top">
|
||||||
|
<table border="0" cellpadding="0" cellspacing="0" style="border-collapse: separate; mso-table-lspace: 0pt; mso-table-rspace: 0pt; width: 100%;" width="100%">
|
||||||
|
<tr>
|
||||||
|
<td align="center">
|
||||||
|
<img src="http://i.imgur.com/ROTp8mn.png" text-align="center" />
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="left">
|
||||||
|
{@MASSEMAIL}
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
<!-- END MAIN CONTENT AREA -->
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<!-- START FOOTER -->
|
||||||
|
<div class="footer" style="clear: both; padding-top: 10px; text-align: center; width: 100%;">
|
||||||
|
<table border="0" cellpadding="0" cellspacing="0" style="border-collapse: separate; mso-table-lspace: 0pt; mso-table-rspace: 0pt; width: 100%;" width="100%">
|
||||||
|
<tr>
|
||||||
|
<td class="content-block powered-by" style="font-family: sans-serif; vertical-align: top; padding-top: 10px; padding-bottom: 10px; font-size: 12px; color: #999999; text-align: center;" valign="top" align="center">
|
||||||
|
Powered by <a href="https://github.com/tidusjar/Ombi" style="color: #999999; font-size: 12px; text-align: center; text-decoration: underline;">Ombi</a>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- END FOOTER -->
|
||||||
|
<!-- END CENTERED WHITE CONTAINER -->
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
<td style="font-family: sans-serif; font-size: 14px; vertical-align: top;" valign="top"> </td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -87,6 +87,7 @@
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Compile Include="Interfaces\IEmbyNotificationEngine.cs" />
|
<Compile Include="Interfaces\IEmbyNotificationEngine.cs" />
|
||||||
|
<Compile Include="Interfaces\IMassEmail.cs" />
|
||||||
<Compile Include="Interfaces\IPlexNotificationEngine.cs" />
|
<Compile Include="Interfaces\IPlexNotificationEngine.cs" />
|
||||||
<Compile Include="Interfaces\IRadarrCacher.cs" />
|
<Compile Include="Interfaces\IRadarrCacher.cs" />
|
||||||
<Compile Include="Interfaces\IWatcherCacher.cs" />
|
<Compile Include="Interfaces\IWatcherCacher.cs" />
|
||||||
|
@ -107,6 +108,7 @@
|
||||||
<Compile Include="Jobs\EmbyEpisodeCacher.cs" />
|
<Compile Include="Jobs\EmbyEpisodeCacher.cs" />
|
||||||
<Compile Include="Jobs\EmbyUserChecker.cs" />
|
<Compile Include="Jobs\EmbyUserChecker.cs" />
|
||||||
<Compile Include="Jobs\RadarrCacher.cs" />
|
<Compile Include="Jobs\RadarrCacher.cs" />
|
||||||
|
<Compile Include="Jobs\Templates\MassEmailTemplate.cs" />
|
||||||
<Compile Include="Jobs\WatcherCacher.cs" />
|
<Compile Include="Jobs\WatcherCacher.cs" />
|
||||||
<Compile Include="Jobs\HtmlTemplateGenerator.cs" />
|
<Compile Include="Jobs\HtmlTemplateGenerator.cs" />
|
||||||
<Compile Include="Interfaces\IPlexContentCacher.cs" />
|
<Compile Include="Interfaces\IPlexContentCacher.cs" />
|
||||||
|
@ -180,6 +182,9 @@
|
||||||
</ProjectReference>
|
</ProjectReference>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<Content Include="Jobs\Templates\MassEmailTemplate.html">
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
</Content>
|
||||||
<Content Include="Jobs\Templates\RecentlyAddedTemplate.html">
|
<Content Include="Jobs\Templates\RecentlyAddedTemplate.html">
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
</Content>
|
</Content>
|
||||||
|
|
|
@ -92,6 +92,7 @@ namespace Ombi.UI.Modules.Admin
|
||||||
private IJobRecord JobRecorder { get; }
|
private IJobRecord JobRecorder { get; }
|
||||||
private IAnalytics Analytics { get; }
|
private IAnalytics Analytics { get; }
|
||||||
private IRecentlyAdded RecentlyAdded { get; }
|
private IRecentlyAdded RecentlyAdded { get; }
|
||||||
|
private IMassEmail MassEmail { get; }
|
||||||
private ISettingsService<NotificationSettingsV2> NotifySettings { get; }
|
private ISettingsService<NotificationSettingsV2> NotifySettings { get; }
|
||||||
private ISettingsService<DiscordNotificationSettings> DiscordSettings { get; }
|
private ISettingsService<DiscordNotificationSettings> DiscordSettings { get; }
|
||||||
private IDiscordApi DiscordApi { get; }
|
private IDiscordApi DiscordApi { get; }
|
||||||
|
@ -123,7 +124,7 @@ namespace Ombi.UI.Modules.Admin
|
||||||
ICacheProvider cache, ISettingsService<SlackNotificationSettings> slackSettings,
|
ICacheProvider cache, ISettingsService<SlackNotificationSettings> slackSettings,
|
||||||
ISlackApi slackApi, ISettingsService<LandingPageSettings> lp,
|
ISlackApi slackApi, ISettingsService<LandingPageSettings> lp,
|
||||||
ISettingsService<ScheduledJobsSettings> scheduler, IJobRecord rec, IAnalytics analytics,
|
ISettingsService<ScheduledJobsSettings> scheduler, IJobRecord rec, IAnalytics analytics,
|
||||||
ISettingsService<NotificationSettingsV2> notifyService, IRecentlyAdded recentlyAdded,
|
ISettingsService<NotificationSettingsV2> notifyService, IRecentlyAdded recentlyAdded, IMassEmail massEmail,
|
||||||
ISettingsService<WatcherSettings> watcherSettings ,
|
ISettingsService<WatcherSettings> watcherSettings ,
|
||||||
ISettingsService<DiscordNotificationSettings> discord,
|
ISettingsService<DiscordNotificationSettings> discord,
|
||||||
IDiscordApi discordapi, ISettingsService<RadarrSettings> settings, IRadarrApi radarrApi,
|
IDiscordApi discordapi, ISettingsService<RadarrSettings> settings, IRadarrApi radarrApi,
|
||||||
|
@ -158,6 +159,7 @@ namespace Ombi.UI.Modules.Admin
|
||||||
Analytics = analytics;
|
Analytics = analytics;
|
||||||
NotifySettings = notifyService;
|
NotifySettings = notifyService;
|
||||||
RecentlyAdded = recentlyAdded;
|
RecentlyAdded = recentlyAdded;
|
||||||
|
MassEmail = massEmail;
|
||||||
WatcherSettings = watcherSettings;
|
WatcherSettings = watcherSettings;
|
||||||
DiscordSettings = discord;
|
DiscordSettings = discord;
|
||||||
DiscordApi = discordapi;
|
DiscordApi = discordapi;
|
||||||
|
@ -222,6 +224,9 @@ namespace Ombi.UI.Modules.Admin
|
||||||
|
|
||||||
Get["/newsletter", true] = async (x, ct) => await Newsletter();
|
Get["/newsletter", true] = async (x, ct) => await Newsletter();
|
||||||
Post["/newsletter", true] = async (x, ct) => await SaveNewsletter();
|
Post["/newsletter", true] = async (x, ct) => await SaveNewsletter();
|
||||||
|
Post["/testnewsletteradminemail"] = x => TestNewsletterAdminEmail();
|
||||||
|
Post["/testmassadminemail"] = x => TestMassAdminEmail();
|
||||||
|
Post["/sendmassemail"] = x => SendMassEmail();
|
||||||
|
|
||||||
Post["/createapikey"] = x => CreateApiKey();
|
Post["/createapikey"] = x => CreateApiKey();
|
||||||
|
|
||||||
|
@ -246,7 +251,6 @@ namespace Ombi.UI.Modules.Admin
|
||||||
Get["/notificationsettings", true] = async (x, ct) => await NotificationSettings();
|
Get["/notificationsettings", true] = async (x, ct) => await NotificationSettings();
|
||||||
Post["/notificationsettings"] = x => SaveNotificationSettings();
|
Post["/notificationsettings"] = x => SaveNotificationSettings();
|
||||||
|
|
||||||
Post["/recentlyAddedTest"] = x => RecentlyAddedTest();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task<Negotiator> Authentication()
|
private async Task<Negotiator> Authentication()
|
||||||
|
@ -1229,13 +1233,13 @@ namespace Ombi.UI.Modules.Admin
|
||||||
var model = this.Bind<NotificationSettingsV2>();
|
var model = this.Bind<NotificationSettingsV2>();
|
||||||
return View["NotificationSettings", model];
|
return View["NotificationSettings", model];
|
||||||
}
|
}
|
||||||
|
|
||||||
private Response RecentlyAddedTest()
|
private Response TestNewsletterAdminEmail()
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
Log.Debug("Clicked TEST");
|
Log.Debug("Clicked Admin Newsletter Email Test");
|
||||||
RecentlyAdded.Test();
|
RecentlyAdded.RecentlyAddedAdminTest();
|
||||||
return Response.AsJson(new JsonResponseModel { Result = true, Message = "Sent email to administrator" });
|
return Response.AsJson(new JsonResponseModel { Result = true, Message = "Sent email to administrator" });
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
|
@ -1244,5 +1248,50 @@ namespace Ombi.UI.Modules.Admin
|
||||||
return Response.AsJson(new JsonResponseModel { Result = false, Message = e.Message });
|
return Response.AsJson(new JsonResponseModel { Result = false, Message = e.Message });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
private Response TestMassAdminEmail()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var settings = this.Bind<MassEmailSettings>();
|
||||||
|
Log.Debug("Clicked Admin Mass Email Test");
|
||||||
|
if (settings.Subject == null) {
|
||||||
|
return Response.AsJson(new JsonResponseModel { Result = false, Message = "Please Set a Subject" });
|
||||||
|
}
|
||||||
|
if (settings.Body == null)
|
||||||
|
{
|
||||||
|
return Response.AsJson(new JsonResponseModel { Result = false, Message = "Please Set a Body" });
|
||||||
|
}
|
||||||
|
MassEmail.MassEmailAdminTest(settings.Body.Replace("\n", "<br/>"), settings.Subject);
|
||||||
|
return Response.AsJson(new JsonResponseModel { Result = true, Message = "Sent email to administrator" });
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
Log.Error(e);
|
||||||
|
return Response.AsJson(new JsonResponseModel { Result = false, Message = e.Message });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
private Response SendMassEmail()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var settings = this.Bind<MassEmailSettings>();
|
||||||
|
Log.Debug("Clicked Admin Mass Email Test");
|
||||||
|
if (settings.Subject == null)
|
||||||
|
{
|
||||||
|
return Response.AsJson(new JsonResponseModel { Result = false, Message = "Please Set a Subject" });
|
||||||
|
}
|
||||||
|
if (settings.Body == null)
|
||||||
|
{
|
||||||
|
return Response.AsJson(new JsonResponseModel { Result = false, Message = "Please Set a Body" });
|
||||||
|
}
|
||||||
|
MassEmail.SendMassEmail(settings.Body.Replace("\n", "<br/>"), settings.Subject);
|
||||||
|
return Response.AsJson(new JsonResponseModel { Result = true, Message = "Sent email to All users" });
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
Log.Error(e);
|
||||||
|
return Response.AsJson(new JsonResponseModel { Result = false, Message = e.Message });
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -49,6 +49,7 @@ namespace Ombi.UI.NinjectModules
|
||||||
Bind<ISonarrCacher>().To<SonarrCacher>();
|
Bind<ISonarrCacher>().To<SonarrCacher>();
|
||||||
Bind<ISickRageCacher>().To<SickRageCacher>();
|
Bind<ISickRageCacher>().To<SickRageCacher>();
|
||||||
Bind<IRecentlyAdded>().To<RecentlyAdded>();
|
Bind<IRecentlyAdded>().To<RecentlyAdded>();
|
||||||
|
Bind<IMassEmail>().To<RecentlyAdded>();
|
||||||
Bind<IRadarrCacher>().To<RadarrCacher>();
|
Bind<IRadarrCacher>().To<RadarrCacher>();
|
||||||
Bind<IPlexContentCacher>().To<PlexContentCacher>();
|
Bind<IPlexContentCacher>().To<PlexContentCacher>();
|
||||||
Bind<IJobFactory>().To<CustomJobFactory>();
|
Bind<IJobFactory>().To<CustomJobFactory>();
|
||||||
|
|
|
@ -7,46 +7,48 @@
|
||||||
<form class="form-horizontal" method="POST" id="mainForm">
|
<form class="form-horizontal" method="POST" id="mainForm">
|
||||||
<fieldset>
|
<fieldset>
|
||||||
<legend>Newsletter Settings</legend>
|
<legend>Newsletter Settings</legend>
|
||||||
|
<div style="padding:10px">
|
||||||
|
|
||||||
<!-- Email Nofication Section -->
|
<!-- Email Nofication Section -->
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<div class="checkbox">
|
<div class="checkbox">
|
||||||
|
|
||||||
<small>Note: This will require you to setup your email notifications</small>
|
<small>Note: This will require you to setup your email notifications</small>
|
||||||
<br />
|
<br />
|
||||||
@if (Model.SendRecentlyAddedEmail)
|
@if (Model.SendRecentlyAddedEmail)
|
||||||
{
|
{
|
||||||
<input type="checkbox" id="SendRecentlyAddedEmail" name="SendRecentlyAddedEmail" checked="checked"><label for="SendRecentlyAddedEmail">Enable newsletter</label>
|
<input type="checkbox" id="SendRecentlyAddedEmail" name="SendRecentlyAddedEmail" checked="checked"><label for="SendRecentlyAddedEmail">Enable newsletter</label>
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
<input type="checkbox" id="SendRecentlyAddedEmail" name="SendRecentlyAddedEmail"><label for="SendRecentlyAddedEmail">Enable newsletter</label>
|
<input type="checkbox" id="SendRecentlyAddedEmail" name="SendRecentlyAddedEmail"><label for="SendRecentlyAddedEmail">Enable newsletter</label>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
<div class="form-group">
|
||||||
<div class="form-group">
|
|
||||||
|
|
||||||
<br>
|
<br>
|
||||||
<label for="CustomUsers" class="control-label">Email Addresses to Send to (For users that are not in your User Management section)</label>
|
<label for="CustomUsers" class="control-label">Email Addresses to Send to (For users that are not in your User Management section)</label>
|
||||||
<small>You can add multiple email addresses by using the ; delimiter</small>
|
<small>You can add multiple email addresses by using the ; delimiter</small>
|
||||||
<div>
|
<div>
|
||||||
<input type="text" class="form-control form-control-custom " placeholder="first@address.com;second@address.com" id="CustomUsers" name="CustomUsers" value="@Model.CustomUsers">
|
<input type="text" class="form-control form-control-custom " placeholder="first@address.com;second@address.com" id="CustomUsers" name="CustomUsers" value="@Model.CustomUsers">
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<div>
|
<div>
|
||||||
<button id="recentlyAddedBtn" class="btn btn-primary-outline">Send test email to Admin <div id="spinner"></div></button>
|
<button id="recentlyAddedBtn" class="btn btn-primary-outline">Send test email to Admin <div id="testEmailSpinner"></div></button>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
|
|
||||||
<br />
|
<br />
|
||||||
<br />
|
<br />
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<div>
|
<div>
|
||||||
<button type="submit" id="save" class="btn btn-primary-outline">Submit</button>
|
<button type="submit" id="save" class="btn btn-primary-outline">Save</button>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<!-- Email Nofication Section -->
|
<!-- Email Nofication Section -->
|
||||||
|
@ -54,6 +56,39 @@
|
||||||
</fieldset>
|
</fieldset>
|
||||||
|
|
||||||
</form>
|
</form>
|
||||||
|
<form id="massemail" class="form-horizontal">
|
||||||
|
<fieldset>
|
||||||
|
<legend>Mass Email</legend>
|
||||||
|
<div style="padding:10px">
|
||||||
|
<div class="form-group">
|
||||||
|
<small>Note: This will require you to setup your email notifications</small>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="massEmailSubject" class="control-label">Subject</label>
|
||||||
|
<div>
|
||||||
|
<input type="text" class="form-control form-control-custom " placeholder="A Message from Plex Admin" id="massEmailSubject" name="massEmailSubject" value="">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="massEmailBody" class="control-label">Body</label>
|
||||||
|
|
||||||
|
<textarea id="massEmailBody" class="form-control" rows="5"></textarea>
|
||||||
|
<small>Supports HTML</small>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<div>
|
||||||
|
<button id="testSendMassEmailBtn" class="btn btn-primary-outline">Send Test to Admin<div id="testSendMassEmailSpinner"></div></button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<div>
|
||||||
|
<button id="sendMassEmailBtn" class="btn btn-primary-outline">Send To All Users<div id="sendMassEmailSpinner"></div></button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</fieldset>
|
||||||
|
</form>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
@ -90,8 +125,8 @@
|
||||||
$('#recentlyAddedBtn').click(function (e) {
|
$('#recentlyAddedBtn').click(function (e) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
var base = '@Html.GetBaseUrl()';
|
var base = '@Html.GetBaseUrl()';
|
||||||
var url = createBaseUrl(base, '/admin/recentlyAddedTest');
|
var url = createBaseUrl(base, '/admin/testnewsletteradminemail');
|
||||||
$('#spinner').attr("class", "fa fa-spinner fa-spin");
|
$('#testEmailSpinner').attr("class", "fa fa-spinner fa-spin");
|
||||||
$.ajax({
|
$.ajax({
|
||||||
type: "post",
|
type: "post",
|
||||||
url: url,
|
url: url,
|
||||||
|
@ -99,17 +134,74 @@
|
||||||
success: function (response) {
|
success: function (response) {
|
||||||
if (response) {
|
if (response) {
|
||||||
generateNotify(response.message, "success");
|
generateNotify(response.message, "success");
|
||||||
$('#spinner').attr("class", "fa fa-check");
|
$('#testSendMassEmailSpinner').attr("class", "fa fa-check");
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
generateNotify(response.message, "danger");
|
generateNotify(response.message, "danger");
|
||||||
$('#spinner').attr("class", "fa fa-times");
|
$('#testSendMassEmailSpinner').attr("class", "fa fa-times");
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
error: function (e) {
|
error: function (e) {
|
||||||
console.log(e);
|
console.log(e);
|
||||||
generateNotify("Something went wrong!", "danger");
|
generateNotify("Something went wrong!", "danger");
|
||||||
$('#spinner').attr("class", "fa fa-times");
|
$('#testSendMassEmailSpinner').attr("class", "fa fa-times");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#testSendMassEmailBtn').click(function (e) {
|
||||||
|
e.preventDefault();
|
||||||
|
var base = '@Html.GetBaseUrl()';
|
||||||
|
var url = createBaseUrl(base, '/admin/testmassadminemail');
|
||||||
|
$('#testSendMassEmailSpinner').attr("class", "fa fa-spinner fa-spin");
|
||||||
|
var data = { "Users": "", "Body": $("#massEmailBody").val(), "Subject": $("#massEmailSubject").val() };
|
||||||
|
$.ajax({
|
||||||
|
type: "post",
|
||||||
|
url: url,
|
||||||
|
data: data,
|
||||||
|
dataType: "json",
|
||||||
|
success: function (response) {
|
||||||
|
if (response.result) {
|
||||||
|
generateNotify(response.message, "success");
|
||||||
|
$('#testSendMassEmailSpinner').attr("class", "fa fa-check");
|
||||||
|
} else {
|
||||||
|
|
||||||
|
generateNotify(response.message, "danger");
|
||||||
|
$('#testSendMassEmailSpinner').attr("class", "fa fa-times");
|
||||||
|
}
|
||||||
|
},
|
||||||
|
error: function (e) {
|
||||||
|
console.log(e);
|
||||||
|
generateNotify("Something went wrong!", "danger");
|
||||||
|
$('#testSendMassEmailSpinner').attr("class", "fa fa-times");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
$('#sendMassEmailBtn').click(function (e) {
|
||||||
|
e.preventDefault();
|
||||||
|
var base = '@Html.GetBaseUrl()';
|
||||||
|
var url = createBaseUrl(base, '/admin/sendmassemail');
|
||||||
|
$('#sendMassEmailSpinner').attr("class", "fa fa-spinner fa-spin");
|
||||||
|
var data = { "Users": "", "Body": $("#massEmailBody").val(), "Subject": $("#massEmailSubject").val() };
|
||||||
|
$.ajax({
|
||||||
|
type: "post",
|
||||||
|
url: url,
|
||||||
|
data: data,
|
||||||
|
dataType: "json",
|
||||||
|
success: function (response) {
|
||||||
|
if (response.result) {
|
||||||
|
generateNotify(response.message, "success");
|
||||||
|
$('#sendMassEmailSpinner').attr("class", "fa fa-check");
|
||||||
|
} else {
|
||||||
|
|
||||||
|
generateNotify(response.message, "danger");
|
||||||
|
$('#sendMassEmailSpinner').attr("class", "fa fa-times");
|
||||||
|
}
|
||||||
|
},
|
||||||
|
error: function (e) {
|
||||||
|
console.log(e);
|
||||||
|
generateNotify("Something went wrong!", "danger");
|
||||||
|
$('#sendMassEmailSpinner').attr("class", "fa fa-times");
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue