Преглед изворни кода

add: option to add custom email headers

Mikael Koli пре 3 година
родитељ
комит
a293ae910a
1 измењених фајлова са 18 додато и 1 уклоњено
  1. 18 1
      redmail/email/sender.py

+ 18 - 1
redmail/email/sender.py

@@ -158,6 +158,7 @@ class EmailSender:
         self.cc = None
         self.bcc = None
         self.subject = None
+        self.headers = None
 
         self.text = None
         self.html = None
@@ -177,6 +178,7 @@ class EmailSender:
              receivers:Union[List[str], str, None]=None,
              cc:Union[List[str], str, None]=None,
              bcc:Union[List[str], str, None]=None,
+             headers:Optional[Dict[str, str]]=None,
              html:Optional[str]=None,
              text:Optional[str]=None,
              html_template:Optional[str]=None,
@@ -205,6 +207,9 @@ class EmailSender:
             Blind Carbon Copy of the email.
             Additional recipients of the email that
             don't see who else got the email.
+        headers : dict, optional
+            Additional email headers. Can be used to 
+            override already set headers.
         html : str, optional
             HTML body of the email. This is processed
             by Jinja and may contain loops, parametrization
@@ -280,6 +285,7 @@ class EmailSender:
             receivers=receivers,
             cc=cc,
             bcc=bcc,
+            headers=headers,
             html=html,
             text=text,
             html_template=html_template,
@@ -306,6 +312,7 @@ class EmailSender:
                   body_tables:Optional[Dict[str, 'pd.DataFrame']]=None, 
                   body_params:Optional[Dict[str, Any]]=None,
                   attachments:Optional[Dict[str, Union[str, os.PathLike, 'pd.DataFrame', bytes]]]=None,
+                  headers:Optional[Dict[str, str]]=None,
                   use_jinja=None) -> EmailMessage:
         """Get the email message"""
 
@@ -315,6 +322,7 @@ class EmailSender:
         receivers = self.get_receivers(receivers)
         cc = self.get_cc(cc)
         bcc = self.get_bcc(bcc)
+        headers = self.get_headers(headers)
 
         html = html or self.html
         text = text or self.text
@@ -331,6 +339,7 @@ class EmailSender:
             receivers=receivers,
             cc=cc,
             bcc=bcc,
+            headers=headers 
         )
         has_text = text is not None or text_template is not None
         has_html = html is not None or html_template is not None
@@ -388,6 +397,10 @@ class EmailSender:
         """Get blind carbon copy (bcc) of the email"""
         return bcc or self.bcc
 
+    def get_headers(self, headers:Union[Dict[str, str], None]):
+        """Get additional headers"""
+        return headers or self.headers
+
     def get_sender(self, sender:Union[str, None]) -> str:
         """Get sender of the email"""
         return sender or self.sender or self.username
@@ -398,7 +411,7 @@ class EmailSender:
             domain = sender.split("@")[1]
         return make_msgid(domain=domain)
 
-    def _create_body(self, subject, sender, receivers=None, cc=None, bcc=None) -> EmailMessage:
+    def _create_body(self, subject, sender, receivers=None, cc=None, bcc=None, headers=None) -> EmailMessage:
         msg = EmailMessage()
         msg["From"] = sender
         msg["Subject"] = subject
@@ -415,6 +428,10 @@ class EmailSender:
         # or the program sending the email (as we are doing now).
         # Apparently Gmail might require it as of 2022
         msg['Message-ID'] = self.create_message_id(sender)
+
+        if headers:
+            for key, val in headers.items():
+                msg[key] = val
         return msg
 
     def _set_content_type(self, msg:EmailMessage, has_text, has_html, has_attachments):