From cb4c30c7c3d7307a23eb1091c2f435b7f59be120 Mon Sep 17 00:00:00 2001 From: Christian Merten Date: Sat, 8 Jun 2019 18:34:37 +0200 Subject: [PATCH 1/2] allow multiple reply-to members on mails --- jdav_web/mailer/admin.py | 2 +- jdav_web/mailer/mailutils.py | 5 ++-- .../mailer/management/commands/reply_addrs.py | 26 +++++++++++++++++++ jdav_web/mailer/models.py | 13 +++++----- 4 files changed, 36 insertions(+), 10 deletions(-) create mode 100644 jdav_web/mailer/management/commands/reply_addrs.py diff --git a/jdav_web/mailer/admin.py b/jdav_web/mailer/admin.py index cf44d54..312c9f2 100644 --- a/jdav_web/mailer/admin.py +++ b/jdav_web/mailer/admin.py @@ -30,7 +30,7 @@ class MessageAdmin(admin.ModelAdmin): inlines = [AttachmentInline] actions = ['send_message'] form = MessageForm - filter_horizontal = ('to_members',) + filter_horizontal = ('to_members','reply_to') def send_message(self, request, queryset): if request.POST.get('confirmed'): diff --git a/jdav_web/mailer/mailutils.py b/jdav_web/mailer/mailutils.py index 14e05c4..3251316 100644 --- a/jdav_web/mailer/mailutils.py +++ b/jdav_web/mailer/mailutils.py @@ -7,7 +7,7 @@ NOT_SENT, SENT, PARTLY_SENT = 0, 1, 2 HOST = os.environ.get('DJANGO_ALLOWED_HOST', 'localhost:8000').split(",")[0] -def send(subject, content, sender, recipients, reply_to=None, +def send(subject, content, sender, recipients, message_id, reply_to=None, attachments=None): failed, succeeded = False, False if type(recipients) != list: @@ -19,7 +19,8 @@ def send(subject, content, sender, recipients, reply_to=None, with mail.get_connection() as connection: for recipient in set(recipients): email = EmailMessage(subject, content, sender, [recipient], - connection=connection, **kwargs) + connection=connection, **kwargs, + headers={'Message-ID': message_id}) if attachments is not None: for attach in attachments: email.attach_file(attach) diff --git a/jdav_web/mailer/management/commands/reply_addrs.py b/jdav_web/mailer/management/commands/reply_addrs.py new file mode 100644 index 0000000..0a3f493 --- /dev/null +++ b/jdav_web/mailer/management/commands/reply_addrs.py @@ -0,0 +1,26 @@ +from django.core.management.base import BaseCommand +from mailer.models import Message +from members.models import Member + + +class Command(BaseCommand): + help = 'Shows reply-to addresses' + + def add_arguments(self, parser): + parser.add_argument('message_id', type=int) + + def handle(self, *args, **options): + replies = [] + try: + message = Message.objects.get(pk=options['message_id']) + if message.reply_to: + replies = message.reply_to.all() + except Message.DoesNotExist: + pass + + if not replies: + # send mail to all jugendleiters + replies = Member.objects.filter(group__name='Jugendleiter', + gets_newsletter=True) + response = "\n".join([l.email for l in replies]) + self.stdout.write(response) diff --git a/jdav_web/mailer/models.py b/jdav_web/mailer/models.py index 94276f5..3b9e103 100644 --- a/jdav_web/mailer/models.py +++ b/jdav_web/mailer/models.py @@ -28,11 +28,10 @@ class Message(models.Model): to_members = models.ManyToManyField('members.Member', verbose_name=_('to member'), blank=True) - reply_to = models.ForeignKey('members.Member', - verbose_name=_('reply to'), - blank=True, - null=True, - related_name='reply_to') + reply_to = models.ManyToManyField('members.Member', + verbose_name=_('reply to'), + blank=True, + related_name='reply_to') sent = models.BooleanField(_('sent'), default=False) def __str__(self): @@ -77,8 +76,8 @@ class Message(models.Model): success = send(self.subject, get_content(self.content), SENDING_ADDRESS, emails, - attachments=attach, - reply_to=self.reply_to.email if self.reply_to else None) + message_id=self.pk, + attachments=attach) if success == SENT or success == PARTLY_SENT: self.sent = True for a in Attachment.objects.filter(msg__id=self.pk): From 3304554ad96b2927520fc9686fec8a9c487e1f7d Mon Sep 17 00:00:00 2001 From: Christian Merten Date: Sat, 15 Jun 2019 12:15:18 +0200 Subject: [PATCH 2/2] use system forward call to redirect mails --- jdav_web/mailer/management/commands/reply_addrs.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/jdav_web/mailer/management/commands/reply_addrs.py b/jdav_web/mailer/management/commands/reply_addrs.py index 0a3f493..f547b39 100644 --- a/jdav_web/mailer/management/commands/reply_addrs.py +++ b/jdav_web/mailer/management/commands/reply_addrs.py @@ -1,6 +1,7 @@ from django.core.management.base import BaseCommand from mailer.models import Message from members.models import Member +import subprocess class Command(BaseCommand): @@ -22,5 +23,7 @@ class Command(BaseCommand): # send mail to all jugendleiters replies = Member.objects.filter(group__name='Jugendleiter', gets_newsletter=True) - response = "\n".join([l.email for l in replies]) - self.stdout.write(response) + forwards = [l.email for l in replies] + subprocess.call(["forward"] + forwards) + + self.stdout.write("forwarded email to {}".format(forwards))