mirror of
https://github.com/Tautulli/Tautulli.git
synced 2025-07-11 15:56:07 -07:00
Add option for threaded newsletter emails
This commit is contained in:
parent
1b216a35d4
commit
0821c14aae
5 changed files with 66 additions and 10 deletions
|
@ -218,6 +218,13 @@
|
||||||
<input type="hidden" id="newsletter_config_formatted" name="newsletter_config_formatted" value="${newsletter['config']['formatted']}">
|
<input type="hidden" id="newsletter_config_formatted" name="newsletter_config_formatted" value="${newsletter['config']['formatted']}">
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group" id="email_notifier_select">
|
<div class="form-group" id="email_notifier_select">
|
||||||
|
<div class="checkbox">
|
||||||
|
<label>
|
||||||
|
<input type="checkbox" id="newsletter_config_threaded_checkbox" data-id="newsletter_config_threaded" class="checkboxes" value="1" ${checked(newsletter['config']['threaded'])}> Enable Grouped Email Thread
|
||||||
|
</label>
|
||||||
|
<p class="help-block">Enable to group this newsletter together in a single Email thread. Disable to send a new Email for each newsletter.</p>
|
||||||
|
<input type="hidden" id="newsletter_config_threaded" name="newsletter_config_threaded" value="${newsletter['config']['threaded']}">
|
||||||
|
</div>
|
||||||
<label for="newsletter_email_notifier_id">Email Notification Agent</label>
|
<label for="newsletter_email_notifier_id">Email Notification Agent</label>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-md-12">
|
<div class="col-md-12">
|
||||||
|
|
|
@ -668,7 +668,8 @@ def dbcheck():
|
||||||
'CREATE TABLE IF NOT EXISTS newsletter_log (id INTEGER PRIMARY KEY AUTOINCREMENT, timestamp INTEGER, '
|
'CREATE TABLE IF NOT EXISTS newsletter_log (id INTEGER PRIMARY KEY AUTOINCREMENT, timestamp INTEGER, '
|
||||||
'newsletter_id INTEGER, agent_id INTEGER, agent_name TEXT, notify_action TEXT, '
|
'newsletter_id INTEGER, agent_id INTEGER, agent_name TEXT, notify_action TEXT, '
|
||||||
'subject_text TEXT, body_text TEXT, message_text TEXT, start_date TEXT, end_date TEXT, '
|
'subject_text TEXT, body_text TEXT, message_text TEXT, start_date TEXT, end_date TEXT, '
|
||||||
'start_time INTEGER, end_time INTEGER, uuid TEXT UNIQUE, filename TEXT, success INTEGER DEFAULT 0)'
|
'start_time INTEGER, end_time INTEGER, uuid TEXT UNIQUE, filename TEXT, email_msg_id TEXT, '
|
||||||
|
'success INTEGER DEFAULT 0)'
|
||||||
)
|
)
|
||||||
|
|
||||||
# recently_added table :: This table keeps record of recently added items
|
# recently_added table :: This table keeps record of recently added items
|
||||||
|
@ -1563,6 +1564,15 @@ def dbcheck():
|
||||||
'ALTER TABLE newsletter_log ADD COLUMN filename TEXT'
|
'ALTER TABLE newsletter_log ADD COLUMN filename TEXT'
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# Upgrade newsletter_log table from earlier versions
|
||||||
|
try:
|
||||||
|
c_db.execute('SELECT email_msg_id FROM newsletter_log')
|
||||||
|
except sqlite3.OperationalError:
|
||||||
|
logger.debug(u"Altering database. Updating database table newsletter_log.")
|
||||||
|
c_db.execute(
|
||||||
|
'ALTER TABLE newsletter_log ADD COLUMN email_msg_id TEXT'
|
||||||
|
)
|
||||||
|
|
||||||
# Upgrade newsletters table from earlier versions
|
# Upgrade newsletters table from earlier versions
|
||||||
try:
|
try:
|
||||||
c_db.execute('SELECT id_name FROM newsletters')
|
c_db.execute('SELECT id_name FROM newsletters')
|
||||||
|
|
|
@ -18,6 +18,7 @@ import time
|
||||||
|
|
||||||
from apscheduler.schedulers.background import BackgroundScheduler
|
from apscheduler.schedulers.background import BackgroundScheduler
|
||||||
from apscheduler.triggers.cron import CronTrigger
|
from apscheduler.triggers.cron import CronTrigger
|
||||||
|
import email.utils
|
||||||
|
|
||||||
import plexpy
|
import plexpy
|
||||||
import database
|
import database
|
||||||
|
@ -86,6 +87,9 @@ def notify(newsletter_id=None, notify_action=None, **kwargs):
|
||||||
body = newsletter_config['body']
|
body = newsletter_config['body']
|
||||||
message = newsletter_config['message']
|
message = newsletter_config['message']
|
||||||
|
|
||||||
|
email_msg_id = email.utils.make_msgid()
|
||||||
|
email_reply_msg_id = get_last_newsletter_email_msg_id(newsletter_id=newsletter_id, notify_action=notify_action)
|
||||||
|
|
||||||
newsletter_agent = newsletters.get_agent_class(newsletter_id=newsletter_id,
|
newsletter_agent = newsletters.get_agent_class(newsletter_id=newsletter_id,
|
||||||
newsletter_id_name=newsletter_config['id_name'],
|
newsletter_id_name=newsletter_config['id_name'],
|
||||||
agent_id=newsletter_config['agent_id'],
|
agent_id=newsletter_config['agent_id'],
|
||||||
|
@ -93,7 +97,9 @@ def notify(newsletter_id=None, notify_action=None, **kwargs):
|
||||||
email_config=newsletter_config['email_config'],
|
email_config=newsletter_config['email_config'],
|
||||||
subject=subject,
|
subject=subject,
|
||||||
body=body,
|
body=body,
|
||||||
message=message
|
message=message,
|
||||||
|
email_msg_id=email_msg_id,
|
||||||
|
email_reply_msg_id=email_reply_msg_id
|
||||||
)
|
)
|
||||||
|
|
||||||
# Set the newsletter state in the db
|
# Set the newsletter state in the db
|
||||||
|
@ -107,7 +113,8 @@ def notify(newsletter_id=None, notify_action=None, **kwargs):
|
||||||
end_date=newsletter_agent.end_date.format('YYYY-MM-DD'),
|
end_date=newsletter_agent.end_date.format('YYYY-MM-DD'),
|
||||||
start_time=newsletter_agent.start_time,
|
start_time=newsletter_agent.start_time,
|
||||||
end_time=newsletter_agent.end_time,
|
end_time=newsletter_agent.end_time,
|
||||||
newsletter_uuid=newsletter_agent.uuid)
|
newsletter_uuid=newsletter_agent.uuid,
|
||||||
|
email_msg_id=email_msg_id)
|
||||||
|
|
||||||
# Send the notification
|
# Send the notification
|
||||||
success = newsletter_agent.send()
|
success = newsletter_agent.send()
|
||||||
|
@ -118,7 +125,7 @@ def notify(newsletter_id=None, notify_action=None, **kwargs):
|
||||||
|
|
||||||
|
|
||||||
def set_notify_state(newsletter, notify_action, subject, body, message, filename,
|
def set_notify_state(newsletter, notify_action, subject, body, message, filename,
|
||||||
start_date, end_date, start_time, end_time, newsletter_uuid):
|
start_date, end_date, start_time, end_time, newsletter_uuid, email_msg_id):
|
||||||
|
|
||||||
if newsletter and notify_action:
|
if newsletter and notify_action:
|
||||||
db = database.MonitorDatabase()
|
db = database.MonitorDatabase()
|
||||||
|
@ -137,6 +144,7 @@ def set_notify_state(newsletter, notify_action, subject, body, message, filename
|
||||||
'end_date': end_date,
|
'end_date': end_date,
|
||||||
'start_time': start_time,
|
'start_time': start_time,
|
||||||
'end_time': end_time,
|
'end_time': end_time,
|
||||||
|
'email_msg_id': email_msg_id,
|
||||||
'filename': filename}
|
'filename': filename}
|
||||||
|
|
||||||
db.upsert(table_name='newsletter_log', key_dict=keys, value_dict=values)
|
db.upsert(table_name='newsletter_log', key_dict=keys, value_dict=values)
|
||||||
|
@ -153,6 +161,16 @@ def set_notify_success(newsletter_log_id):
|
||||||
db.upsert(table_name='newsletter_log', key_dict=keys, value_dict=values)
|
db.upsert(table_name='newsletter_log', key_dict=keys, value_dict=values)
|
||||||
|
|
||||||
|
|
||||||
|
def get_last_newsletter_email_msg_id(newsletter_id, notify_action):
|
||||||
|
db = database.MonitorDatabase()
|
||||||
|
|
||||||
|
result = db.select_single('SELECT email_msg_id FROM newsletter_log '
|
||||||
|
'WHERE newsletter_id = ? AND notify_action = ? AND success = 1 '
|
||||||
|
'ORDER BY timestamp DESC LIMIT 1', [newsletter_id, notify_action])
|
||||||
|
|
||||||
|
return result.get('email_msg_id')
|
||||||
|
|
||||||
|
|
||||||
def get_newsletter(newsletter_uuid=None, newsletter_id_name=None):
|
def get_newsletter(newsletter_uuid=None, newsletter_id_name=None):
|
||||||
db = database.MonitorDatabase()
|
db = database.MonitorDatabase()
|
||||||
|
|
||||||
|
|
|
@ -65,7 +65,8 @@ def available_notification_actions():
|
||||||
|
|
||||||
|
|
||||||
def get_agent_class(newsletter_id=None, newsletter_id_name=None, agent_id=None, config=None, email_config=None,
|
def get_agent_class(newsletter_id=None, newsletter_id_name=None, agent_id=None, config=None, email_config=None,
|
||||||
start_date=None, end_date=None, subject=None, body=None, message=None):
|
start_date=None, end_date=None, subject=None, body=None, message=None,
|
||||||
|
email_msg_id=None, email_reply_msg_id=None):
|
||||||
if str(agent_id).isdigit():
|
if str(agent_id).isdigit():
|
||||||
agent_id = int(agent_id)
|
agent_id = int(agent_id)
|
||||||
|
|
||||||
|
@ -77,7 +78,9 @@ def get_agent_class(newsletter_id=None, newsletter_id_name=None, agent_id=None,
|
||||||
'end_date': end_date,
|
'end_date': end_date,
|
||||||
'subject': subject,
|
'subject': subject,
|
||||||
'body': body,
|
'body': body,
|
||||||
'message': message}
|
'message': message,
|
||||||
|
'email_msg_id': email_msg_id,
|
||||||
|
'email_reply_msg_id': email_reply_msg_id}
|
||||||
|
|
||||||
if agent_id == 0:
|
if agent_id == 0:
|
||||||
return RecentlyAdded(**kwargs)
|
return RecentlyAdded(**kwargs)
|
||||||
|
@ -326,6 +329,7 @@ class Newsletter(object):
|
||||||
'time_frame': 7,
|
'time_frame': 7,
|
||||||
'time_frame_units': 'days',
|
'time_frame_units': 'days',
|
||||||
'formatted': 1,
|
'formatted': 1,
|
||||||
|
'threaded': 0,
|
||||||
'notifier_id': 0,
|
'notifier_id': 0,
|
||||||
'filename': '',
|
'filename': '',
|
||||||
'save_only': 0}
|
'save_only': 0}
|
||||||
|
@ -339,11 +343,15 @@ class Newsletter(object):
|
||||||
_TEMPLATE = ''
|
_TEMPLATE = ''
|
||||||
|
|
||||||
def __init__(self, newsletter_id=None, newsletter_id_name=None, config=None, email_config=None,
|
def __init__(self, newsletter_id=None, newsletter_id_name=None, config=None, email_config=None,
|
||||||
start_date=None, end_date=None, subject=None, body=None, message=None):
|
start_date=None, end_date=None, subject=None, body=None, message=None,
|
||||||
|
email_msg_id=None, email_reply_msg_id=None):
|
||||||
self.config = self.set_config(config=config, default=self._DEFAULT_CONFIG)
|
self.config = self.set_config(config=config, default=self._DEFAULT_CONFIG)
|
||||||
self.email_config = self.set_config(config=email_config, default=self._DEFAULT_EMAIL_CONFIG)
|
self.email_config = self.set_config(config=email_config, default=self._DEFAULT_EMAIL_CONFIG)
|
||||||
self.uuid = generate_newsletter_uuid()
|
self.uuid = generate_newsletter_uuid()
|
||||||
|
|
||||||
|
self.email_msg_id = email_msg_id
|
||||||
|
self.email_reply_msg_id = email_reply_msg_id
|
||||||
|
|
||||||
self.newsletter_id = newsletter_id
|
self.newsletter_id = newsletter_id
|
||||||
self.newsletter_id_name = newsletter_id_name or ''
|
self.newsletter_id_name = newsletter_id_name or ''
|
||||||
self.start_date = None
|
self.start_date = None
|
||||||
|
@ -516,12 +524,16 @@ class Newsletter(object):
|
||||||
if plexpy.CONFIG.NEWSLETTER_SELF_HOSTED and plexpy.CONFIG.HTTP_BASE_URL:
|
if plexpy.CONFIG.NEWSLETTER_SELF_HOSTED and plexpy.CONFIG.HTTP_BASE_URL:
|
||||||
plaintext += self._DEFAULT_BODY.format(**self.parameters)
|
plaintext += self._DEFAULT_BODY.format(**self.parameters)
|
||||||
|
|
||||||
|
email_reply_msg_id = self.email_reply_msg_id if self.config['threaded'] else None
|
||||||
|
|
||||||
if self.email_config['notifier_id']:
|
if self.email_config['notifier_id']:
|
||||||
return send_notification(
|
return send_notification(
|
||||||
notifier_id=self.email_config['notifier_id'],
|
notifier_id=self.email_config['notifier_id'],
|
||||||
subject=self.subject_formatted,
|
subject=self.subject_formatted,
|
||||||
body=newsletter_stripped,
|
body=newsletter_stripped,
|
||||||
plaintext=plaintext
|
plaintext=plaintext,
|
||||||
|
msg_id=self.email_msg_id,
|
||||||
|
reply_msg_id=email_reply_msg_id
|
||||||
)
|
)
|
||||||
|
|
||||||
else:
|
else:
|
||||||
|
@ -529,7 +541,9 @@ class Newsletter(object):
|
||||||
return email.notify(
|
return email.notify(
|
||||||
subject=self.subject_formatted,
|
subject=self.subject_formatted,
|
||||||
body=newsletter_stripped,
|
body=newsletter_stripped,
|
||||||
plaintext=plaintext
|
plaintext=plaintext,
|
||||||
|
msg_id=self.email_msg_id,
|
||||||
|
reply_msg_id=email_reply_msg_id
|
||||||
)
|
)
|
||||||
elif self.config['notifier_id']:
|
elif self.config['notifier_id']:
|
||||||
return send_notification(
|
return send_notification(
|
||||||
|
|
|
@ -1302,13 +1302,20 @@ class EMAIL(Notifier):
|
||||||
msg.replace_header('Content-Transfer-Encoding', 'quoted-printable')
|
msg.replace_header('Content-Transfer-Encoding', 'quoted-printable')
|
||||||
msg.set_payload(body, 'utf-8')
|
msg.set_payload(body, 'utf-8')
|
||||||
|
|
||||||
msg['Message-ID'] = email.utils.make_msgid()
|
msg_id = kwargs.get('msg_id', email.utils.make_msgid())
|
||||||
|
reply_msg_id = kwargs.get('reply_msg_id')
|
||||||
|
|
||||||
|
msg['Message-ID'] = msg_id
|
||||||
msg['Date'] = email.utils.formatdate(localtime=True)
|
msg['Date'] = email.utils.formatdate(localtime=True)
|
||||||
msg['Subject'] = subject
|
msg['Subject'] = subject
|
||||||
msg['From'] = email.utils.formataddr((self.config['from_name'], self.config['from']))
|
msg['From'] = email.utils.formataddr((self.config['from_name'], self.config['from']))
|
||||||
msg['To'] = ','.join(self.config['to'])
|
msg['To'] = ','.join(self.config['to'])
|
||||||
msg['CC'] = ','.join(self.config['cc'])
|
msg['CC'] = ','.join(self.config['cc'])
|
||||||
|
|
||||||
|
if reply_msg_id:
|
||||||
|
msg["In-Reply-To"] = reply_msg_id
|
||||||
|
msg["References"] = reply_msg_id
|
||||||
|
|
||||||
recipients = self.config['to'] + self.config['cc'] + self.config['bcc']
|
recipients = self.config['to'] + self.config['cc'] + self.config['bcc']
|
||||||
|
|
||||||
mailserver = None
|
mailserver = None
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue