Procházet zdrojové kódy

use email.utils.parseaddr and formataddr instead of get_email_name

Son NK před 5 roky
rodič
revize
6b6fca2281
4 změnil soubory, kde provedl 15 přidání a 37 odebrání
  1. 0 11
      app/email_utils.py
  2. 8 6
      app/models.py
  3. 7 7
      email_handler.py
  4. 0 13
      tests/test_email_utils.py

+ 0 - 11
app/email_utils.py

@@ -233,17 +233,6 @@ def send_email(
     smtp.sendmail(SUPPORT_EMAIL, to_email, msg_raw)
     smtp.sendmail(SUPPORT_EMAIL, to_email, msg_raw)
 
 
 
 
-def get_email_name(email_from):
-    """parse email from header and return the name part
-    First Last <ab@cd.com> -> First Last
-    ab@cd.com -> ""
-    """
-    if "<" in email_from:
-        return email_from[: email_from.find("<")].strip()
-
-    return ""
-
-
 def get_email_part(email_from):
 def get_email_part(email_from):
     """parse email from header and return the email part
     """parse email from header and return the email part
     First Last <ab@cd.com> -> ab@cd.com
     First Last <ab@cd.com> -> ab@cd.com

+ 8 - 6
app/models.py

@@ -1,6 +1,7 @@
 import enum
 import enum
 import random
 import random
 import uuid
 import uuid
+from email.utils import parseaddr, formataddr
 
 
 import arrow
 import arrow
 import bcrypt
 import bcrypt
@@ -17,7 +18,6 @@ from app.config import (
     AVATAR_URL_EXPIRATION,
     AVATAR_URL_EXPIRATION,
     JOB_ONBOARDING_1,
     JOB_ONBOARDING_1,
 )
 )
-
 from app.extensions import db
 from app.extensions import db
 from app.log import LOG
 from app.log import LOG
 from app.oauth_models import Scope
 from app.oauth_models import Scope
@@ -729,14 +729,16 @@ class ForwardEmail(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"""
-        from app.email_utils import get_email_name
 
 
         if self.website_from:
         if self.website_from:
-            name = get_email_name(self.website_from)
-            if name:
-                return name + " " + self.website_email + f" <{self.reply_email}>"
+            website_name, _ = parseaddr(self.website_from)
+
+            if website_name:
+                return formataddr(
+                    (website_name + " " + self.website_email, self.reply_email)
+                )
 
 
-        return self.website_email.replace("@", " at ") + f" <{self.reply_email}>"
+        return formataddr((self.website_email.replace("@", " at "), self.reply_email))
 
 
     def last_reply(self) -> "ForwardEmailLog":
     def last_reply(self) -> "ForwardEmailLog":
         """return the most recent reply"""
         """return the most recent reply"""

+ 7 - 7
email_handler.py

@@ -30,14 +30,15 @@ It should contain the following info:
 
 
 
 
 """
 """
-import uuid
 import time
 import time
+import uuid
 from email import encoders
 from email import encoders
 from email.message import Message
 from email.message import Message
 from email.mime.application import MIMEApplication
 from email.mime.application import MIMEApplication
 from email.mime.multipart import MIMEMultipart
 from email.mime.multipart import MIMEMultipart
 from email.parser import Parser
 from email.parser import Parser
 from email.policy import SMTPUTF8
 from email.policy import SMTPUTF8
+from email.utils import parseaddr, formataddr
 from io import BytesIO
 from io import BytesIO
 from smtplib import SMTP
 from smtplib import SMTP
 from typing import Optional
 from typing import Optional
@@ -53,7 +54,6 @@ from app.config import (
     POSTFIX_SUBMISSION_TLS,
     POSTFIX_SUBMISSION_TLS,
 )
 )
 from app.email_utils import (
 from app.email_utils import (
-    get_email_name,
     get_email_part,
     get_email_part,
     send_email,
     send_email,
     add_dkim_signature,
     add_dkim_signature,
@@ -333,13 +333,13 @@ def handle_forward(envelope, smtp: SMTP, msg: Message, rcpt_to: str) -> str:
         # so it can pass DMARC check
         # so it can pass DMARC check
         # replace the email part in from: header
         # replace the email part in from: header
         website_from_header = msg["From"]
         website_from_header = msg["From"]
-        website_email = get_email_part(website_from_header)
-        from_header = (
-            get_email_name(website_from_header)
-            + ("" if get_email_name(website_from_header) == "" else " - ")
+        website_name, website_email = parseaddr(website_from_header)
+        new_website_name = (
+            website_name
+            + (" - " if website_name else "")
             + website_email.replace("@", " at ")
             + website_email.replace("@", " at ")
-            + f" <{forward_email.reply_email}>"
         )
         )
+        from_header = formataddr((new_website_name, forward_email.reply_email))
         add_or_replace_header(msg, "From", from_header)
         add_or_replace_header(msg, "From", from_header)
         LOG.d("new from header:%s", from_header)
         LOG.d("new from header:%s", from_header)
 
 

+ 0 - 13
tests/test_email_utils.py

@@ -1,9 +1,7 @@
 from email.message import EmailMessage
 from email.message import EmailMessage
 
 
 from app.email_utils import (
 from app.email_utils import (
-    get_email_name,
     get_email_part,
     get_email_part,
-    get_email_local_part,
     get_email_domain_part,
     get_email_domain_part,
     email_belongs_to_alias_domains,
     email_belongs_to_alias_domains,
     can_be_used_as_personal_email,
     can_be_used_as_personal_email,
@@ -14,13 +12,6 @@ from app.extensions import db
 from app.models import User, CustomDomain
 from app.models import User, CustomDomain
 
 
 
 
-def test_get_email_name():
-    assert get_email_name("First Last <ab@cd.com>") == "First Last"
-    assert get_email_name("First Last<ab@cd.com>") == "First Last"
-    assert get_email_name("  First Last   <ab@cd.com>") == "First Last"
-    assert get_email_name("ab@cd.com") == ""
-
-
 def test_get_email_part():
 def test_get_email_part():
     assert get_email_part("First Last <ab@cd.com>") == "ab@cd.com"
     assert get_email_part("First Last <ab@cd.com>") == "ab@cd.com"
     assert get_email_part("First Last<ab@cd.com>") == "ab@cd.com"
     assert get_email_part("First Last<ab@cd.com>") == "ab@cd.com"
@@ -28,10 +19,6 @@ def test_get_email_part():
     assert get_email_part("ab@cd.com") == "ab@cd.com"
     assert get_email_part("ab@cd.com") == "ab@cd.com"
 
 
 
 
-def test_get_email_local_part():
-    assert get_email_local_part("ab@cd.com") == "ab"
-
-
 def test_get_email_domain_part():
 def test_get_email_domain_part():
     assert get_email_domain_part("ab@cd.com") == "cd.com"
     assert get_email_domain_part("ab@cd.com") == "cd.com"