Skip to content
Snippets Groups Projects
Select Git revision
  • cbf59c05f1d88e8604289bd02432f7a27e034666
  • master default protected
2 results

mail.py

Blame
  • Forked from Video AG Infrastruktur / website
    Source project has a limited visibility.
    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])