diff --git a/app/api/views/alias.py b/app/api/views/alias.py index dd840750..27153f55 100644 --- a/app/api/views/alias.py +++ b/app/api/views/alias.py @@ -409,7 +409,7 @@ def create_contact_route(alias_id): contact_name, contact_email = full_address.display_name, full_address.address - contact_email = sanitize_email(contact_email) + contact_email = sanitize_email(contact_email, not_lower=True) # already been added contact = Contact.get_by(alias_id=alias.id, website_email=contact_email) diff --git a/app/utils.py b/app/utils.py index d90acfdf..6c884da0 100644 --- a/app/utils.py +++ b/app/utils.py @@ -66,9 +66,11 @@ def encode_url(url): return urllib.parse.quote(url, safe="") -def sanitize_email(email_address: str) -> str: +def sanitize_email(email_address: str, not_lower=False) -> str: if email_address: - return email_address.lower().strip().replace(" ", "").replace("\n", " ") + email_address = email_address.strip().replace(" ", "").replace("\n", " ") + if not not_lower: + email_address = email_address.lower() return email_address diff --git a/cron.py b/cron.py index ad91525a..2670bd99 100644 --- a/cron.py +++ b/cron.py @@ -656,7 +656,8 @@ def sanity_check(): LOG.e("Contact %s reply-email not sanitized", contact) if ( - sanitize_email(contact.website_email) != contact.website_email + sanitize_email(contact.website_email, not_lower=True) + != contact.website_email and contact.created_at > contact_email_sanity_date ): LOG.e("Contact %s website-email not sanitized", contact) diff --git a/email_handler.py b/email_handler.py index afedd912..4acd4b3f 100644 --- a/email_handler.py +++ b/email_handler.py @@ -180,7 +180,7 @@ def get_or_create_contact(from_header: str, mail_from: str, alias: Alias) -> Con # either reuse a contact with empty email or create a new contact with empty email contact_email = "" - contact_email = sanitize_email(contact_email) + contact_email = sanitize_email(contact_email, not_lower=True) if contact_name and "\x00" in contact_name: LOG.w("issue with contact name %s", contact_name) @@ -300,10 +300,10 @@ def replace_header_when_forward(msg: Message, alias: Alias, header: str): full_addresses += address.parse_list(h) for full_address in full_addresses: - contact_email = sanitize_email(full_address.address) + contact_email = sanitize_email(full_address.address, not_lower=True) # no transformation when alias is already in the header - if contact_email == alias.email: + if contact_email.lower() == alias.email: new_addrs.append(full_address.full_spec()) continue @@ -1545,13 +1545,15 @@ def handle_bounce_reply_phase(envelope, msg: Message, email_log: EmailLog): bounce_info = get_mailbox_bounce_info(msg) if bounce_info: Bounce.create( - email=sanitize_email(contact.website_email), + email=sanitize_email(contact.website_email, not_lower=True), info=bounce_info.as_bytes().decode(), commit=True, ) else: LOG.w("cannot get bounce info, debug at %s", save_email_for_debugging(msg)) - Bounce.create(email=sanitize_email(contact.website_email), commit=True) + Bounce.create( + email=sanitize_email(contact.website_email, not_lower=True), commit=True + ) # Store the bounced email # generate a name for the email