Compare commits
2 commits
fe15939f06
...
c19ef0991b
Author | SHA1 | Date | |
---|---|---|---|
c19ef0991b | |||
7443e27e68 |
4 changed files with 19 additions and 22 deletions
|
@ -1,16 +0,0 @@
|
|||
"""
|
||||
WSGI config for core project.
|
||||
|
||||
It exposes the WSGI callable as a module-level variable named ``application``.
|
||||
|
||||
For more information on this file, see
|
||||
https://docs.djangoproject.com/en/4.2/howto/deployment/wsgi/
|
||||
"""
|
||||
|
||||
import os
|
||||
|
||||
from django.core.wsgi import get_wsgi_application
|
||||
|
||||
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'core.settings')
|
||||
|
||||
application = get_wsgi_application()
|
|
@ -29,13 +29,13 @@ class Email(SoftDeleteModel):
|
|||
self.save()
|
||||
|
||||
def train_spam(self):
|
||||
if ACTIVE_SPAM_TRAINING:
|
||||
if ACTIVE_SPAM_TRAINING and self.raw_file.path:
|
||||
import subprocess
|
||||
path = self.raw_file.path
|
||||
subprocess.run(["rspamc", "learn_spam", path])
|
||||
|
||||
def train_ham(self):
|
||||
if ACTIVE_SPAM_TRAINING:
|
||||
if ACTIVE_SPAM_TRAINING and self.raw_file.path:
|
||||
import subprocess
|
||||
path = self.raw_file.path
|
||||
subprocess.run(["rspamc", "learn_ham", path])
|
||||
|
|
|
@ -91,7 +91,7 @@ async def send_smtp(message):
|
|||
await aiosmtplib.send(message, hostname="127.0.0.1", port=25, use_tls=False, start_tls=False)
|
||||
|
||||
|
||||
def find_active_issue_thread(in_reply_to, address, subject):
|
||||
def find_active_issue_thread(in_reply_to, address, subject, event):
|
||||
from re import match
|
||||
uuid_match = match(r'^ticket\+([a-f0-9-]{36})@', address)
|
||||
if uuid_match:
|
||||
|
@ -102,7 +102,7 @@ def find_active_issue_thread(in_reply_to, address, subject):
|
|||
if reply_to.exists():
|
||||
return reply_to.first().issue_thread, False
|
||||
else:
|
||||
issue = IssueThread.objects.create(name=subject)
|
||||
issue = IssueThread.objects.create(name=subject, event=event)
|
||||
return issue, True
|
||||
|
||||
|
||||
|
@ -200,13 +200,19 @@ def receive_email(envelope, log=None):
|
|||
subject = "No subject"
|
||||
subject = unescape_and_decode_quoted_printable(subject)
|
||||
subject = unescape_and_decode_base64(subject)
|
||||
log.info("search for {}".format(recipient))
|
||||
log.info("known {}".format(["{} -> {}".format(x.address, x.event.slug) for x in EventAddress.objects.all()]))
|
||||
target_event = find_target_event(recipient)
|
||||
log.info("found {}".format(target_event))
|
||||
|
||||
active_issue_thread, new = find_active_issue_thread(header_in_reply_to, recipient, subject)
|
||||
active_issue_thread, new = find_active_issue_thread(header_in_reply_to, recipient, subject, target_event)
|
||||
|
||||
from hashlib import sha256
|
||||
random_filename = 'mail-' + sha256(envelope.content).hexdigest()
|
||||
|
||||
email = Email.objects.create(
|
||||
sender=sender, recipient=recipient, body=body, subject=subject, reference=header_message_id,
|
||||
in_reply_to=header_in_reply_to, raw_file=ContentFile(envelope.content), event=target_event,
|
||||
in_reply_to=header_in_reply_to, raw_file=ContentFile(envelope.content, name=random_filename), event=target_event,
|
||||
issue_thread=active_issue_thread)
|
||||
for attachment in attachments:
|
||||
email.attachments.add(attachment)
|
||||
|
@ -255,6 +261,7 @@ class LMTPHandler:
|
|||
log.setLevel(logging.DEBUG)
|
||||
log.info('Message from %s' % envelope.mail_from)
|
||||
log.info('Message for %s' % envelope.rcpt_tos)
|
||||
log.info('CTX for {}, {}'.format(server, session))
|
||||
log.info('Message data:\n')
|
||||
|
||||
content = None
|
||||
|
|
|
@ -142,6 +142,7 @@ class LMTPHandlerTestCase(TestCase): # TODO replace with less hacky test
|
|||
aiosmtplib.send.assert_called_once()
|
||||
self.assertEqual('test ä', Email.objects.all()[0].subject)
|
||||
self.assertEqual('Text mit Quoted-Printable-Kodierung: äöüß', Email.objects.all()[0].body)
|
||||
self.assertTrue( Email.objects.all()[0].raw_file.path)
|
||||
|
||||
def test_handle_quoted_printable_2(self):
|
||||
from aiosmtpd.smtp import Envelope
|
||||
|
@ -162,6 +163,7 @@ class LMTPHandlerTestCase(TestCase): # TODO replace with less hacky test
|
|||
aiosmtplib.send.assert_called_once()
|
||||
self.assertEqual('suche_Mütze', Email.objects.all()[0].subject)
|
||||
self.assertEqual('Text mit Quoted-Printable-Kodierung: äöüß', Email.objects.all()[0].body)
|
||||
self.assertTrue( Email.objects.all()[0].raw_file.path)
|
||||
|
||||
def test_handle_base64(self):
|
||||
from aiosmtpd.smtp import Envelope
|
||||
|
@ -182,6 +184,7 @@ class LMTPHandlerTestCase(TestCase): # TODO replace with less hacky test
|
|||
aiosmtplib.send.assert_called_once()
|
||||
self.assertEqual('test', Email.objects.all()[0].subject)
|
||||
self.assertEqual('Text mit Base64-Kodierung: äöüß', Email.objects.all()[0].body)
|
||||
self.assertTrue( Email.objects.all()[0].raw_file.path)
|
||||
|
||||
def test_handle_client_reply(self):
|
||||
issue_thread = IssueThread.objects.create(
|
||||
|
@ -229,6 +232,7 @@ class LMTPHandlerTestCase(TestCase): # TODO replace with less hacky test
|
|||
self.assertEqual(IssueThread.objects.all()[0].name, 'test')
|
||||
self.assertEqual(IssueThread.objects.all()[0].state, 'pending_new')
|
||||
self.assertEqual(IssueThread.objects.all()[0].assigned_to, None)
|
||||
self.assertTrue( Email.objects.all()[2].raw_file.path)
|
||||
|
||||
def test_handle_client_reply_2(self):
|
||||
issue_thread = IssueThread.objects.create(
|
||||
|
@ -281,6 +285,7 @@ class LMTPHandlerTestCase(TestCase): # TODO replace with less hacky test
|
|||
self.assertEqual(IssueThread.objects.all()[0].name, 'test')
|
||||
self.assertEqual(IssueThread.objects.all()[0].state, 'pending_open')
|
||||
self.assertEqual(IssueThread.objects.all()[0].assigned_to, None)
|
||||
self.assertTrue( Email.objects.all()[2].raw_file.path)
|
||||
|
||||
def test_mail_reply(self):
|
||||
issue_thread = IssueThread.objects.create(
|
||||
|
@ -384,6 +389,7 @@ class LMTPHandlerTestCase(TestCase): # TODO replace with less hacky test
|
|||
states = StateChange.objects.filter(issue_thread=IssueThread.objects.all()[0])
|
||||
self.assertEqual(1, len(states))
|
||||
self.assertEqual('pending_new', states[0].state)
|
||||
self.assertEqual(event, IssueThread.objects.all()[0].event)
|
||||
|
||||
def test_mail_html_body(self):
|
||||
from aiosmtpd.smtp import Envelope
|
||||
|
|
Loading…
Reference in a new issue