sendmail: grag recipient from environ (#88821)
gitea/docbow/pipeline/head This commit looks good Details

Alse grab sender from environ (only in pfwb sendmail).
This commit is contained in:
Emmanuel Cazenave 2024-03-28 14:32:19 +01:00
parent 42e5b05fb4
commit ee9f9c3396
4 changed files with 30 additions and 22 deletions

View File

@ -4,6 +4,7 @@ import email.header
import email.utils
import logging
import mailbox
import os
import re
import sys
import time
@ -52,12 +53,10 @@ In case of failure the following return value is returned:
message_id = None
def add_arguments(self, parser):
parser.add_argument('recipient', type=str)
parser.add_argument('--sender')
parser.add_argument('--file')
def handle(self, *args, **options):
if not options.get('sender'):
if not os.environ.get('SENDER'):
self.error('7.7.1 No sender', exit_code=8)
self.setup_mailing_list_dict()
try:
@ -74,7 +73,7 @@ In case of failure the following return value is returned:
except Exception:
logger.exception('mbox exception')
try:
self.handle_mail(mail, (options['recipient'],), **options)
self.handle_mail(mail, (os.environ['RECIPIENT'],), **options)
except Exception:
logger.exception('Unknown exception')
self.error('7.7.1 Internal error when handling the mail', exit_code=5)
@ -123,7 +122,7 @@ In case of failure the following return value is returned:
recipients = []
mailing_list_recipients = []
description = ''
from_email = email.utils.parseaddr(options['sender'])[1]
from_email = email.utils.parseaddr(os.environ['SENDER'])[1]
if not from_email:
self.error('7.7.1 No sender', exit_code=8)
if from_email == app_settings.PFWB_SENDMAIL_TABELLIO_EXPEDITION_EMAIL:

View File

@ -4,6 +4,7 @@ import email.header
import email.utils
import logging
import mailbox
import os
import re
import sys
import time
@ -54,7 +55,6 @@ In case of failure the following return value is returned:
subject = ''
def add_arguments(self, parser):
parser.add_argument('recipient', type=str)
parser.add_argument('--sender')
parser.add_argument('--file')
@ -76,7 +76,7 @@ In case of failure the following return value is returned:
except Exception:
logger.exception('mbox exception')
try:
self.handle_mail(mail, (options['recipient'],), **options)
self.handle_mail(mail, (os.environ['RECIPIENT'],), **options)
except Exception:
logger.exception('Unknown exception')
self.error('5.6.0 Internal error when handling the mail', exit_code=5)

View File

@ -5,6 +5,7 @@ when you run "manage.py test".
Replace this with more appropriate tests for your application.
"""
import os
import sys
import tempfile
from contextlib import contextmanager
@ -110,7 +111,10 @@ class SendMailTestCase(TestCase):
with tempfile.NamedTemporaryFile() as f:
f.write(force_bytes(content))
f.flush()
management.call_command('sendmail', recipient_email, file=f.name, sender=expedition_email)
with mock.patch.dict(
os.environ, {'RECIPIENT': recipient_email, 'SENDER': expedition_email}, clear=True
):
management.call_command('sendmail', file=f.name)
def send_tabellio_doc(self, expedition_email, recipient_email, doc_type, subject):
content = '''\
@ -133,9 +137,11 @@ Coucou
@stderr_output('7.7.1 No sender\n7.7.1 No sender\n')
def test_fail_sender(self):
with self.assertRaises(SystemExit):
management.call_command('sendmail', 'yyy')
with mock.patch.dict(os.environ, {'RECIPIENT': 'yyy'}, clear=True):
management.call_command('sendmail')
with self.assertRaises(SystemExit):
management.call_command('sendmail', 'yyy', sender='')
with mock.patch.dict(os.environ, {'RECIPIENT': 'yyy', 'SENDER': ''}, clear=True):
management.call_command('sendmail')
@stderr_output('7.7.1 Mail is missing a Message-ID\n')
def test_fail_on_missing_message_id(self):
@ -282,6 +288,7 @@ class SendMailAttachedFileTestCase(TestCase):
return force_bytes(message.as_string())
@stderr_output('')
@mock.patch.dict(os.environ, {'RECIPIENT': RECIPIENT_EMAIL, 'SENDER': EXPEDITION_EMAIL}, clear=True)
def test_attached_file1(self):
with tempfile.NamedTemporaryFile() as f:
f.write(
@ -294,7 +301,7 @@ class SendMailAttachedFileTestCase(TestCase):
)
)
f.flush()
management.call_command('sendmail', RECIPIENT_EMAIL, file=f.name, sender=EXPEDITION_EMAIL)
management.call_command('sendmail', file=f.name)
self.assertEqual(Document.objects.count(), 1)
document = Document.objects.get()
assert document.attached_files.count() == 1
@ -455,6 +462,9 @@ Coucou
f.write(force_bytes(content))
f.flush()
with mock.patch('docbow_project.pfwb.management.commands.sendmail.urlopen', mockurllib.urlopen):
management.call_command('sendmail', RECIPIENT_EMAIL, file=f.name, sender=EXPEDITION_EMAIL)
with mock.patch.dict(
os.environ, {'RECIPIENT': RECIPIENT_EMAIL, 'SENDER': EXPEDITION_EMAIL}, clear=True
):
management.call_command('sendmail', file=f.name)
assert Document.objects.count() == 1

View File

@ -5,11 +5,13 @@ when you run "manage.py test".
Replace this with more appropriate tests for your application.
"""
import os
import sys
import tempfile
from contextlib import contextmanager
from functools import wraps
from io import StringIO
from unittest import mock
from django.contrib.auth.models import User
from django.core import management
@ -120,6 +122,7 @@ class SendMailAttachedFileTestCase(TestCase):
self.to_list.members.add(self.to_user)
@stderr_output('')
@mock.patch.dict(os.environ, {'RECIPIENT': RECIPIENT_EMAIL}, clear=True)
def test_attached_file_with_forced_sender(self):
with MessageFile(
self.pjd_filetype,
@ -128,9 +131,7 @@ class SendMailAttachedFileTestCase(TestCase):
'coucou',
(('attached-file', 'content'),),
) as f:
management.call_command(
'sendmail', RECIPIENT_EMAIL, file=f.name, sender=self.expedition_user.username
)
management.call_command('sendmail', file=f.name, sender=self.expedition_user.username)
self.assertEqual(Document.objects.count(), 1)
document = Document.objects.get()
assert document.comment == 'coucou'
@ -142,6 +143,7 @@ class SendMailAttachedFileTestCase(TestCase):
assert document.to_user.get() == self.to_user
@stderr_output('')
@mock.patch.dict(os.environ, {'RECIPIENT': RECIPIENT_EMAIL}, clear=True)
def test_attached_file_with_forced_sender_and_private_header(self):
with MessageFile(
self.pjd_filetype,
@ -151,9 +153,7 @@ class SendMailAttachedFileTestCase(TestCase):
(('attached-file', 'content'),),
headers={'Private': '1'},
) as f:
management.call_command(
'sendmail', RECIPIENT_EMAIL, file=f.name, sender=self.expedition_user.username
)
management.call_command('sendmail', file=f.name, sender=self.expedition_user.username)
self.assertEqual(Document.objects.count(), 1)
document = Document.objects.get()
assert document.private is True
@ -166,6 +166,7 @@ class SendMailAttachedFileTestCase(TestCase):
assert document.to_user.get() == self.to_user
@stderr_output('')
@mock.patch.dict(os.environ, {'RECIPIENT': PRIVATE_RECIPIENT_EMAIL}, clear=True)
def test_attached_file_with_forced_sender_and_private_email(self):
with MessageFile(
self.pjd_filetype,
@ -174,9 +175,7 @@ class SendMailAttachedFileTestCase(TestCase):
'coucou',
(('attached-file', 'content'),),
) as f:
management.call_command(
'sendmail', PRIVATE_RECIPIENT_EMAIL, file=f.name, sender=self.expedition_user.username
)
management.call_command('sendmail', file=f.name, sender=self.expedition_user.username)
self.assertEqual(Document.objects.count(), 1)
document = Document.objects.get()
assert document.private is True
@ -189,6 +188,7 @@ class SendMailAttachedFileTestCase(TestCase):
assert document.to_user.get() == self.to_user
@mock.patch.dict(os.environ, {'RECIPIENT': RECIPIENT_EMAIL}, clear=True)
def test_email_wrong_encoding(db, settings):
settings.MEDIA_ROOT = MEDIA_ROOT
expedition_user = User.objects.create(username='expedition', id=1)
@ -196,7 +196,6 @@ def test_email_wrong_encoding(db, settings):
FileType.objects.create(name='QE-Question', id=2)
management.call_command(
'sendmail',
RECIPIENT_EMAIL,
file='tests/data/email-encoded-iso-8859-15-but-says-utf-8',
sender=expedition_user.username,
)