From afceabeef5a3ef90b772870f00736d50e28e33a6 Mon Sep 17 00:00:00 2001 From: Son NK <> Date: Sun, 5 Apr 2020 15:21:04 +0200 Subject: [PATCH] add Contact.new_addr() --- app/email_utils.py | 19 ------------------- app/models.py | 22 ++++++++++++++++++++++ tests/test_models.py | 41 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 63 insertions(+), 19 deletions(-) diff --git a/app/email_utils.py b/app/email_utils.py index ed44c56b..30ed1670 100644 --- a/app/email_utils.py +++ b/app/email_utils.py @@ -381,25 +381,6 @@ def get_orig_message_from_spamassassin_report(msg: Message) -> Message: return part -def new_addr(old_addr, new_email, user: User) -> str: - """replace First Last by - first@example.com by SimpleLogin - - `new_email` is a special reply address - """ - name, old_email = parseaddr(old_addr) - if user.use_via_format_for_sender: - new_name = f"{old_email} via SimpleLogin" - else: - name = name or "" - new_name = ( - name + (" - " if name else "") + old_email.replace("@", " at ") - ).strip() - - new_addr = formataddr((new_name, new_email)).strip() - return new_addr.strip() - - def get_addrs_from_header(msg: Message, header) -> [str]: """Get all addresses contained in `header` Used for To or CC header. diff --git a/app/models.py b/app/models.py index 5727fa17..e5cd7b43 100644 --- a/app/models.py +++ b/app/models.py @@ -749,6 +749,7 @@ class Contact(db.Model, ModelMixin): is_cc = db.Column(db.Boolean, nullable=False, default=False, server_default="0") alias = db.relationship(Alias, backref="contacts") + user = db.relationship(User) def website_send_to(self): """return the email address with name. @@ -785,6 +786,27 @@ class Contact(db.Model, ModelMixin): # cannot use formataddr here as this field is for email client, not for MTA return f'"{name}" <{self.reply_email}>' + def new_addr(self): + """ + Replace original email by reply_email. 2 possible formats: + - first@example.com by SimpleLogin OR + - First Last - first at example.com + And return new address with RFC 2047 format + + `new_email` is a special reply address + """ + user = self.user + if user.use_via_format_for_sender: + new_name = f"{self.website_email} via SimpleLogin" + else: + name = self.name or "" + new_name = ( + name + (" - " if name else "") + self.website_email.replace("@", " at ") + ).strip() + + new_addr = formataddr((new_name, self.reply_email)).strip() + return new_addr.strip() + def last_reply(self) -> "EmailLog": """return the most recent reply""" return ( diff --git a/tests/test_models.py b/tests/test_models.py index 7d61997b..ec6d8865 100644 --- a/tests/test_models.py +++ b/tests/test_models.py @@ -4,6 +4,7 @@ import arrow import pytest from app.config import EMAIL_DOMAIN, MAX_NB_EMAIL_FREE_PLAN +from app.email_utils import parseaddr_unicode from app.extensions import db from app.models import generate_email, User, Alias, Contact @@ -93,3 +94,43 @@ def test_website_send_to(flask_client): c1.name = None c1.website_from = "=?UTF-8?B?TmjGoW4gTmd1eeG7hW4=?= " assert c1.website_send_to() == '"Nhơn Nguyễn | abcd at example.com" ' + + +def test_new_addr(flask_client): + user = User.create( + email="a@b.c", password="password", name="Test User", activated=True + ) + db.session.commit() + + alias = Alias.create_new_random(user) + db.session.commit() + + # use_via_format_for_sender is by default + c1 = Contact.create( + user_id=user.id, + alias_id=alias.id, + website_email="abcd@example.com", + reply_email="rep@SL", + name="First Last", + ) + db.session.commit() + assert c1.new_addr() == '"abcd@example.com via SimpleLogin" ' + + # use_via_format_for_sender = False + user.use_via_format_for_sender = False + db.session.commit() + assert c1.new_addr() == '"First Last - abcd at example.com" ' + + # unicode name + c1.name = "Nhơn Nguyễn" + db.session.commit() + assert ( + c1.new_addr() + == "=?utf-8?q?Nh=C6=A1n_Nguy=E1=BB=85n_-_abcd_at_example=2Ecom?= " + ) + + # sanity check for parseaddr_unicode + assert parseaddr_unicode(c1.new_addr()) == ( + "Nhơn Nguyễn - abcd at example.com", + "rep@sl", + )