diff --git a/core/core/settings.py b/core/core/settings.py
index db23180..a6f7ce6 100644
--- a/core/core/settings.py
+++ b/core/core/settings.py
@@ -133,9 +133,6 @@ else:
'NAME': os.getenv('DB_NAME', 'system3'),
'USER': os.getenv('DB_USER', 'system3'),
'PASSWORD': os.getenv('DB_PASSWORD', 'system3'),
- 'OPTIONS': {
- 'charset': 'utf8mb4'
- }
}
}
diff --git a/core/mail/protocol.py b/core/mail/protocol.py
index 405b790..27c8407 100644
--- a/core/mail/protocol.py
+++ b/core/mail/protocol.py
@@ -145,17 +145,7 @@ def parse_email_body(raw, log=None):
else:
log.info("Attachment", ctype, cdispo)
else:
- if parsed.get_content_type() == 'text/plain':
- body = parsed.get_payload(decode=True).decode('utf-8')
- elif parsed.get_content_type() == 'text/html':
- from bs4 import BeautifulSoup
- import re
- body = parsed.get_payload(decode=True).decode('utf-8')
- soup = BeautifulSoup(body, 'html.parser')
- body = re.sub(r'([\r\n]+.?)*[\r\n]', r'\n', soup.get_text()).strip('\n')
- else:
- log.warning("Unknown content type", parsed.get_content_type())
- body = "Unknown content type"
+ body = parsed.get_payload(decode=True).decode('utf-8')
body = unescape_and_decode_quoted_printable(body)
body = unescape_and_decode_base64(body)
log.debug(body)
@@ -260,5 +250,5 @@ class LMTPHandler:
return '250 Message accepted for delivery'
except Exception as e:
- log.error(type(e), e)
+ log.error(e)
return '451 Internal server error'
diff --git a/core/mail/tests/v2/test_mails.py b/core/mail/tests/v2/test_mails.py
index b045b91..e21f4cd 100644
--- a/core/mail/tests/v2/test_mails.py
+++ b/core/mail/tests/v2/test_mails.py
@@ -385,63 +385,6 @@ class LMTPHandlerTestCase(TestCase): # TODO replace with less hacky test
self.assertEqual(1, len(states))
self.assertEqual('pending_new', states[0].state)
- def test_mail_html_body(self):
- from aiosmtpd.smtp import Envelope
- from asgiref.sync import async_to_sync
- import aiosmtplib
-
- aiosmtplib.send = make_mocked_coro()
-
- handler = LMTPHandler()
- server = mock.Mock()
- session = mock.Mock()
- envelope = Envelope()
-
- envelope.mail_from = 'test1@test'
- envelope.rcpt_tos = ['test2@test']
-
- envelope.content = b'''Subject: test
-From: test1@test
-To: test2@test
-Message-ID: <1@test>
-Content-Type: text/html; charset=utf-8
-
-
'''
-
- result = async_to_sync(handler.handle_DATA)(server, session, envelope)
- self.assertEqual(result, '250 Message accepted for delivery')
- self.assertEqual(len(Email.objects.all()), 2)
- self.assertEqual(len(IssueThread.objects.all()), 1)
- self.assertEqual(len(EmailAttachment.objects.all()), 0)
- aiosmtplib.send.assert_called_once()
- self.assertEqual('test', Email.objects.all()[0].subject)
- self.assertEqual('test1@test', Email.objects.all()[0].sender)
- self.assertEqual('test2@test', Email.objects.all()[0].recipient)
- self.assertEqual('test', Email.objects.all()[0].body)
- self.assertEqual(IssueThread.objects.all()[0], Email.objects.all()[0].issue_thread)
- self.assertEqual('<1@test>', Email.objects.all()[0].reference)
- self.assertEqual(None, Email.objects.all()[0].in_reply_to)
- self.assertEqual(expected_auto_reply_subject.format('test', IssueThread.objects.all()[0].short_uuid()),
- Email.objects.all()[1].subject)
- self.assertEqual('test2@test', Email.objects.all()[1].sender)
- self.assertEqual('test1@test', Email.objects.all()[1].recipient)
- self.assertEqual(expected_auto_reply.format(IssueThread.objects.all()[0].short_uuid()),
- Email.objects.all()[1].body)
- self.assertEqual(IssueThread.objects.all()[0], Email.objects.all()[1].issue_thread)
- self.assertTrue(Email.objects.all()[1].reference.startswith("<"))
- self.assertTrue(Email.objects.all()[1].reference.endswith("@localhost>"))
- self.assertEqual("<1@test>", Email.objects.all()[1].in_reply_to)
- self.assertEqual('test', IssueThread.objects.all()[0].name)
- self.assertEqual('pending_new', IssueThread.objects.all()[0].state)
- self.assertEqual(None, IssueThread.objects.all()[0].assigned_to)
- states = StateChange.objects.filter(issue_thread=IssueThread.objects.all()[0])
- self.assertEqual(1, len(states))
- self.assertEqual('pending_new', states[0].state)
-
def test_split_text_inline_image(self):
from aiosmtpd.smtp import Envelope
from asgiref.sync import async_to_sync
@@ -776,55 +719,3 @@ dGVzdGltYWdl
self.assertEqual('test subject', IssueThread.objects.all()[0].name)
self.assertEqual('pending_new', IssueThread.objects.all()[0].state)
self.assertEqual(None, IssueThread.objects.all()[0].assigned_to)
-
- def test_mail_4byte_unicode_emoji(self):
- from aiosmtpd.smtp import Envelope
- from asgiref.sync import async_to_sync
- import aiosmtplib
-
- aiosmtplib.send = make_mocked_coro()
-
- handler = LMTPHandler()
- server = mock.Mock()
- session = mock.Mock()
- envelope = Envelope()
-
- envelope.mail_from = 'test1@test'
- envelope.rcpt_tos = ['test2@test']
-
- envelope.content = b'''Subject: test
-From: test1@test
-To: test2@test
-Message-ID: <1@test>
-Content-Type: text/html; charset=utf-8
-
-thank you =?utf-8?Q?=F0=9F=98=8A?=''' # thank you 😊
-
- result = async_to_sync(handler.handle_DATA)(server, session, envelope)
- self.assertEqual('250 Message accepted for delivery', result)
- self.assertEqual(2, len(Email.objects.all()))
- self.assertEqual(1, len(IssueThread.objects.all()))
- aiosmtplib.send.assert_called_once()
- self.assertEqual('test', Email.objects.all()[0].subject)
- self.assertEqual('test1@test', Email.objects.all()[0].sender)
- self.assertEqual('test2@test', Email.objects.all()[0].recipient)
- self.assertEqual('thank you 😊', Email.objects.all()[0].body)
- self.assertEqual(IssueThread.objects.all()[0], Email.objects.all()[0].issue_thread)
- self.assertEqual('<1@test>', Email.objects.all()[0].reference)
- self.assertEqual(None, Email.objects.all()[0].in_reply_to)
- self.assertEqual(expected_auto_reply_subject.format('test', IssueThread.objects.all()[0].short_uuid()),
- Email.objects.all()[1].subject)
- self.assertEqual('test2@test', Email.objects.all()[1].sender)
- self.assertEqual('test1@test', Email.objects.all()[1].recipient)
- self.assertEqual(expected_auto_reply.format(IssueThread.objects.all()[0].short_uuid()),
- Email.objects.all()[1].body)
- self.assertEqual(IssueThread.objects.all()[0], Email.objects.all()[1].issue_thread)
- self.assertTrue(Email.objects.all()[1].reference.startswith("<"))
- self.assertTrue(Email.objects.all()[1].reference.endswith("@localhost>"))
- self.assertEqual("<1@test>", Email.objects.all()[1].in_reply_to)
- self.assertEqual('test', IssueThread.objects.all()[0].name)
- self.assertEqual('pending_new', IssueThread.objects.all()[0].state)
- self.assertEqual(None, IssueThread.objects.all()[0].assigned_to)
- states = StateChange.objects.filter(issue_thread=IssueThread.objects.all()[0])
- self.assertEqual(1, len(states))
- self.assertEqual('pending_new', states[0].state)
diff --git a/core/requirements.dev.txt b/core/requirements.dev.txt
index 8e68f67..0c39d90 100644
--- a/core/requirements.dev.txt
+++ b/core/requirements.dev.txt
@@ -7,8 +7,6 @@ atpublic==4.0
attrs==23.1.0
autobahn==23.6.2
Automat==22.10.0
-beautifulsoup4==4.12.2
-bs4==0.0.1
certifi==2023.11.17
cffi==1.16.0
channels==4.0.0
@@ -55,7 +53,6 @@ service-identity==23.1.0
setproctitle==1.3.3
six==1.16.0
sniffio==1.3.0
-soupsieve==2.5
sqlparse==0.4.4
Twisted==23.10.0
txaio==23.1.1
diff --git a/core/requirements.prod.txt b/core/requirements.prod.txt
index 6a4f32a..835dede 100644
--- a/core/requirements.prod.txt
+++ b/core/requirements.prod.txt
@@ -2,8 +2,6 @@ aiosmtpd==1.4.4.post2
aiosmtplib==3.0.1
asgiref==3.7.2
attrs==23.1.0
-beautifulsoup4==4.12.2
-bs4==0.0.1
certifi==2023.11.17
channels==4.0.0
channels-redis==4.1.0
@@ -30,7 +28,6 @@ requests==2.31.0
sdnotify==0.3.2
setproctitle==1.3.3
sniffio==1.3.0
-soupsieve==2.5
sqlparse==0.4.4
typing_extensions==4.8.0
uritemplate==4.1.1