Select Git revision
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
mail.py 2.64 KiB
from email.message import EmailMessage
import smtplib
import traceback
from server import *
def send_message(msgtype, recipients, **kwargs):
msg = EmailMessage()
msg['From'] = config['MAIL_FROM']
msg['To'] = ', '.join([r.replace(',', '') for r in recipients])
cc = kwargs.pop('cc', []) #pylint: disable=invalid-name
if cc:
msg['Cc'] = ', '.join([r.replace(',', '') for r in cc])
try:
msg['Subject'] = render_template('mails/'+msgtype+'.subject', **kwargs)
msg.set_content(render_template('mails/'+msgtype+'.body', **kwargs))
if not config.get('MAIL_SERVER'):
return
mailserver = smtplib.SMTP(config['MAIL_SERVER'])
if config.get('MAIL_ADDRESS_OVERWRITE'):
mailserver.send_message(msg, to_addrs=[config['MAIL_ADDRESS_OVERWRITE']])
else:
mailserver.send_message(msg)
mailserver.quit()
except: #pylint: disable=bare-except
# we musst not raise an exception here, else we would send another mail, rinse and repeat
traceback.print_exc()
def notify_users(msgtype, uids, **kwargs):
recipients = []
exclude = kwargs.pop('exclude_uids', [])
for uid in uids:
user = query('SELECT * FROM users WHERE id = ?', uid)
if not user or user[0]['id'] in exclude:
continue
if not user[0]['fsacc'] or not user[0]['mail_notifications']:
continue
if 'notify_'+msgtype in user[0] and not user[0]['notify_'+msgtype]:
continue
if user[0]['realname']:
recipients.append('%s <%s@%s>'%(user[0]['realname'], user[0]['fsacc'],
config['MAIL_SUFFIX']))
else:
recipients.append('%s@%s'%(user[0]['fsacc'], config['MAIL_SUFFIX']))
cc = kwargs.get('cc', []) #pylint: disable=invalid-name
if kwargs.pop('importend', False):
cc.append(config['MAIL_DEFAULT'])
if kwargs.pop('notify_admins', False):
cc.append(config['MAIL_ADMINS'])
if not recipients:
recipients = cc
cc = [] #pylint: disable=invalid-name
if not recipients:
return
kwargs['cc'] = cc
send_message(msgtype, recipients, **kwargs)
def notify_mods(msgtype, course_id, **kwargs):
users = query('SELECT * FROM responsible WHERE course_id = ?', course_id)
uids = []
for user in users:
uids.append(user['user_id'])
notify_users(msgtype, uids, **kwargs)
def notify_admins(msgtype, **kwargs):
try:
send_message(msgtype, [config['MAIL_ADMINS']], **kwargs)
except: #pylint: disable=bare-except
# we musst not raise an exception here, else we would send another mail, rinse and repeat
traceback.print_exc()
@app.route('/internal/user/<int:user>/notifications')
@register_navbar('Benachrichtigungen', icon='bell', userendpoint=True)
@mod_required
def user_notifications(user):
return render_template('notifications.html', user=query('SELECT * FROM users WHERE id = ?', user)[0])