Fix website_send_to: prefer using name instead of website_from
This commit is contained in:
parent
fbcac59c7f
commit
6c68b3cda7
|
@ -447,4 +447,3 @@ def parseaddr_unicode(addr) -> (str, str):
|
||||||
return decoded_string.decode(charset), email
|
return decoded_string.decode(charset), email
|
||||||
else:
|
else:
|
||||||
return decoded_string, email
|
return decoded_string, email
|
||||||
|
|
||||||
|
|
|
@ -728,7 +728,9 @@ class Contact(db.Model, ModelMixin):
|
||||||
user_id = db.Column(db.ForeignKey(User.id, ondelete="cascade"), nullable=False)
|
user_id = db.Column(db.ForeignKey(User.id, ondelete="cascade"), nullable=False)
|
||||||
alias_id = db.Column(db.ForeignKey(Alias.id, ondelete="cascade"), nullable=False)
|
alias_id = db.Column(db.ForeignKey(Alias.id, ondelete="cascade"), nullable=False)
|
||||||
|
|
||||||
name = db.Column(db.String(512), nullable=True, default=None, server_default=text("NULL"))
|
name = db.Column(
|
||||||
|
db.String(512), nullable=True, default=None, server_default=text("NULL")
|
||||||
|
)
|
||||||
|
|
||||||
# used to be envelope header, should be mail header from instead
|
# used to be envelope header, should be mail header from instead
|
||||||
website_email = db.Column(db.String(512), nullable=False)
|
website_email = db.Column(db.String(512), nullable=False)
|
||||||
|
@ -750,21 +752,38 @@ class Contact(db.Model, ModelMixin):
|
||||||
|
|
||||||
def website_send_to(self):
|
def website_send_to(self):
|
||||||
"""return the email address with name.
|
"""return the email address with name.
|
||||||
to use when user wants to send an email from the alias"""
|
to use when user wants to send an email from the alias
|
||||||
|
Return
|
||||||
|
"First Last | email at example.com" <ra+random_string@SL>
|
||||||
|
"""
|
||||||
|
|
||||||
|
# Prefer using contact name if possible
|
||||||
|
name = self.name
|
||||||
|
|
||||||
|
# if no name, try to parse it from website_from
|
||||||
|
if not name and self.website_from:
|
||||||
|
try:
|
||||||
|
from app.email_utils import parseaddr_unicode
|
||||||
|
|
||||||
|
name, _ = parseaddr_unicode(self.website_from)
|
||||||
|
except Exception:
|
||||||
|
# Skip if website_from is wrongly formatted
|
||||||
|
LOG.warning(
|
||||||
|
"Cannot parse contact %s website_from %s", self, self.website_from
|
||||||
|
)
|
||||||
|
name = ""
|
||||||
|
|
||||||
|
# remove all double quote
|
||||||
|
if name:
|
||||||
|
name = name.replace('"', "")
|
||||||
|
|
||||||
|
if name:
|
||||||
|
name = name + " | " + self.website_email.replace("@", " at ")
|
||||||
|
else:
|
||||||
name = self.website_email.replace("@", " at ")
|
name = self.website_email.replace("@", " at ")
|
||||||
|
|
||||||
if self.website_from:
|
|
||||||
website_name, _ = parseaddr(self.website_from)
|
|
||||||
|
|
||||||
if website_name:
|
|
||||||
# remove all double quote
|
|
||||||
website_name = website_name.replace('"', "")
|
|
||||||
name = website_name + " | " + name
|
|
||||||
|
|
||||||
return f'"{name}" <{self.reply_email}>'
|
|
||||||
# cannot use formataddr here as this field is for email client, not for MTA
|
# cannot use formataddr here as this field is for email client, not for MTA
|
||||||
# return formataddr((self.website_email.replace("@", " at "), self.reply_email))
|
return f'"{name}" <{self.reply_email}>'
|
||||||
|
|
||||||
def last_reply(self) -> "EmailLog":
|
def last_reply(self) -> "EmailLog":
|
||||||
"""return the most recent reply"""
|
"""return the most recent reply"""
|
||||||
|
|
|
@ -6,7 +6,8 @@ from app.email_utils import (
|
||||||
can_be_used_as_personal_email,
|
can_be_used_as_personal_email,
|
||||||
delete_header,
|
delete_header,
|
||||||
add_or_replace_header,
|
add_or_replace_header,
|
||||||
parseaddr_unicode)
|
parseaddr_unicode,
|
||||||
|
)
|
||||||
from app.extensions import db
|
from app.extensions import db
|
||||||
from app.models import User, CustomDomain
|
from app.models import User, CustomDomain
|
||||||
|
|
||||||
|
@ -65,13 +66,25 @@ def test_add_or_replace_header():
|
||||||
|
|
||||||
def test_parseaddr_unicode():
|
def test_parseaddr_unicode():
|
||||||
# ascii address
|
# ascii address
|
||||||
assert parseaddr_unicode("First Last <abcd@gmail.com>") == ("First Last", "abcd@gmail.com")
|
assert parseaddr_unicode("First Last <abcd@gmail.com>") == (
|
||||||
|
"First Last",
|
||||||
|
"abcd@gmail.com",
|
||||||
|
)
|
||||||
|
|
||||||
# Handle quote
|
# Handle quote
|
||||||
assert parseaddr_unicode('"First Last" <abcd@gmail.com>') == ("First Last", "abcd@gmail.com")
|
assert parseaddr_unicode('"First Last" <abcd@gmail.com>') == (
|
||||||
|
"First Last",
|
||||||
|
"abcd@gmail.com",
|
||||||
|
)
|
||||||
|
|
||||||
# UTF-8 charset
|
# UTF-8 charset
|
||||||
assert parseaddr_unicode("=?UTF-8?B?TmjGoW4gTmd1eeG7hW4=?= <abcd@gmail.com>") == ('Nhơn Nguyễn', "abcd@gmail.com")
|
assert parseaddr_unicode("=?UTF-8?B?TmjGoW4gTmd1eeG7hW4=?= <abcd@gmail.com>") == (
|
||||||
|
"Nhơn Nguyễn",
|
||||||
|
"abcd@gmail.com",
|
||||||
|
)
|
||||||
|
|
||||||
# iso-8859-1 charset
|
# iso-8859-1 charset
|
||||||
assert parseaddr_unicode("=?iso-8859-1?q?p=F6stal?= <abcd@gmail.com>") == ('pöstal', "abcd@gmail.com")
|
assert parseaddr_unicode("=?iso-8859-1?q?p=F6stal?= <abcd@gmail.com>") == (
|
||||||
|
"pöstal",
|
||||||
|
"abcd@gmail.com",
|
||||||
|
)
|
||||||
|
|
|
@ -5,7 +5,7 @@ import pytest
|
||||||
|
|
||||||
from app.config import EMAIL_DOMAIN, MAX_NB_EMAIL_FREE_PLAN
|
from app.config import EMAIL_DOMAIN, MAX_NB_EMAIL_FREE_PLAN
|
||||||
from app.extensions import db
|
from app.extensions import db
|
||||||
from app.models import generate_email, User, Alias
|
from app.models import generate_email, User, Alias, Contact
|
||||||
|
|
||||||
|
|
||||||
def test_generate_email(flask_client):
|
def test_generate_email(flask_client):
|
||||||
|
@ -63,3 +63,33 @@ def test_alias_create_random(flask_client):
|
||||||
|
|
||||||
alias = Alias.create_new_random(user)
|
alias = Alias.create_new_random(user)
|
||||||
assert alias.email.endswith(EMAIL_DOMAIN)
|
assert alias.email.endswith(EMAIL_DOMAIN)
|
||||||
|
|
||||||
|
|
||||||
|
def test_website_send_to(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()
|
||||||
|
|
||||||
|
# non-empty name
|
||||||
|
c1 = Contact.create(
|
||||||
|
user_id=user.id,
|
||||||
|
alias_id=alias.id,
|
||||||
|
website_email="abcd@example.com",
|
||||||
|
reply_email="rep@SL",
|
||||||
|
name="First Last",
|
||||||
|
)
|
||||||
|
assert c1.website_send_to() == '"First Last | abcd at example.com" <rep@SL>'
|
||||||
|
|
||||||
|
# empty name, ascii website_from, easy case
|
||||||
|
c1.name = None
|
||||||
|
c1.website_from = "First Last <abcd@example.com>"
|
||||||
|
assert c1.website_send_to() == '"First Last | abcd at example.com" <rep@SL>'
|
||||||
|
|
||||||
|
# empty name, RFC 2047 website_from
|
||||||
|
c1.name = None
|
||||||
|
c1.website_from = "=?UTF-8?B?TmjGoW4gTmd1eeG7hW4=?= <abcd@example.com>"
|
||||||
|
assert c1.website_send_to() == '"Nhơn Nguyễn | abcd at example.com" <rep@SL>'
|
||||||
|
|
Loading…
Reference in a new issue