This repository has been archived on 2026-03-30. You can view files and clone it, but cannot push or open issues or pull requests.
RepApp/rc_hip/repapp/mail_interface.py

101 lines
3.2 KiB
Python

import os
import re
import logging
from imap_tools import MailBox, AND, MailMessage
from django.core.mail import send_mail
from .models import Guest, Message, Question, Organisator
logger = logging.getLogger(__name__)
def send_message_notification(message: Message, guest: Guest):
"""
Send new message notification.
"""
organizers = []
for organizer in Organisator.objects.all():
organizers.append(organizer.mail)
subject = f'Neue Nachricht von Gast {guest.name} ({guest.mail})'
text = f'Hallo,\n'
f'der Gast {guest.name} ({guest.mail}) hat folgende Nachricht gesendet:\n\n'
f'{message.message}'
# TODO: HTML message
# TODO: add attachments
# TODO: add link to message
send_mail(
subject=subject,
message=text,
from_email=os.getenv("DJANGO_SENDER_ADDRESS", ""),
recipient_list=organizers,
fail_silently=True
)
def process_message(message: MailMessage, guest: Guest):
"""
Process a valid message from a guest.
"""
content = message.text
if message.html:
content = message.html
result = re.search('Q#([0-9]+):', message.subject)
if result:
question_pk = result.group(1)
question = Question.objects.filter(pk=question_pk).first()
if question:
if question.device.guest.mail == message.from_:
question.answer = content
question.answered = True
question.save()
# TODO: save attachments and add to message
logger.info(
'Valid answer for Question %s from %s received.'
% (question_pk, message.from_))
# TODO: send notifications
else:
logger.warning(
'Answer for Question %s from %s received,'
' but the question was not for this guest. Message was ignored.'
% (question_pk, message.from_))
# TODO: send reply that mail address was wrong
else:
logger.warning(
'Answer for Question %s from %s received,'
' but there is no such question. Message was ignored.'
% (question_pk, message.from_))
else:
db_message = Message(
message=content,
guest=guest,
)
db_message.save()
send_message_notification(message, guest)
def process_mails():
"""
Check for new messages and handle valid messages.
"""
host = os.getenv("DJANGO_EMAIL_HOST", "")
user = os.getenv("DJANGO_EMAIL_HOST_USER", None)
password = os.getenv("DJANGO_EMAIL_HOST_PASSWORD", None)
mailbox = MailBox(host).login(user, password)
messages = mailbox.fetch(criteria=AND(seen=False),
mark_seen=True, bulk=True)
message_count = 0
for message in messages:
message_count += 1
sender = message.from_
guest = Guest.objects.filter(mail=sender).first()
if guest:
process_message(message, guest)
else:
logger.warning(
'Mail form unknown sender %s with subject %s ignored.'
% (sender, message.subject))
return message_count