Parcourir la source

add: date header

Mikael Koli il y a 3 ans
Parent
commit
e8491801fb

+ 3 - 0
docs/tutorials/testing.rst

@@ -44,6 +44,7 @@ in tests:
     subject: Some news
     to: you@example.com
     Message-ID: <167294165062.31860.1664530310632362057@example.com>
+    Date: Dec, 31 Jan 2021 06:56:46 -0000
     Content-Type: text/plain; charset="utf-8"
     Content-Transfer-Encoding: 7bit
     MIME-Version: 1.0
@@ -113,6 +114,7 @@ Then to use this mock:
     subject: Some news
     to: you@example.com
     Message-ID: <167294165062.31860.1664530310632362057@example.com>
+    Date: Dec, 31 Jan 2021 06:56:46 -0000
     Content-Type: text/plain; charset="utf-8"
     Content-Transfer-Encoding: 7bit
     MIME-Version: 1.0
@@ -161,6 +163,7 @@ Then to use this class:
     subject: Some news
     to: you@example.com
     Message-ID: <167294165062.31860.1664530310632362057@example.com>
+    Date: Dec, 31 Jan 2021 06:56:46 -0000
     Content-Type: text/plain; charset="utf-8"
     Content-Transfer-Encoding: 7bit
     MIME-Version: 1.0

+ 3 - 1
redmail/email/sender.py

@@ -1,7 +1,7 @@
 
 from copy import copy
 from email.message import EmailMessage
-from email.utils import make_msgid
+from email.utils import make_msgid, formatdate
 from typing import TYPE_CHECKING, Any, Callable, Dict, List, Optional, Union
 import warnings
 
@@ -415,6 +415,8 @@ 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)
+
+        msg['Date'] = formatdate()
         return msg
 
     def _set_content_type(self, msg:EmailMessage, has_text, has_html, has_attachments):

+ 14 - 8
redmail/test/email/test_body.py

@@ -8,7 +8,7 @@ from convert import remove_extra_lines, payloads_to_dict
 from getpass import getpass, getuser
 from platform import node
 
-from convert import remove_email_extra, remove_email_content_id, remove_email_message_id
+from convert import remove_email_extra, remove_email_content_id, prune_generated_headers
 
 import platform
 PYTHON_VERSION = platform.sys.version_info
@@ -23,12 +23,13 @@ def test_text_message():
         subject="Some news",
         text="Hi, nice to meet you.",
     )
-    msg = remove_email_message_id(str(msg))
+    msg = prune_generated_headers(str(msg))
     assert str(msg) == dedent("""
     from: me@example.com
     subject: Some news
     to: you@example.com
     Message-ID: <<message_id>>
+    Date: <date>
     Content-Type: text/plain; charset="utf-8"
     Content-Transfer-Encoding: 7bit
     MIME-Version: 1.0
@@ -46,12 +47,13 @@ def test_html_message():
         subject="Some news",
         html="<h3>Hi,</h3><p>Nice to meet you</p>",
     )
-    msg = remove_email_message_id(str(msg))
+    msg = prune_generated_headers(str(msg))
     assert remove_email_content_id(str(msg)) == dedent("""
     from: me@example.com
     subject: Some news
     to: you@example.com
     Message-ID: <<message_id>>
+    Date: <date>
     Content-Type: multipart/mixed; boundary="===============<ID>=="
 
     --===============<ID>==
@@ -81,12 +83,13 @@ def test_text_and_html_message():
         html="<h3>Hi,</h3><p>nice to meet you.</p>",
         text="Hi, nice to meet you.",
     )
-    msg = remove_email_message_id(str(msg))
+    msg = prune_generated_headers(str(msg))
     assert remove_email_content_id(str(msg)) == dedent("""
     from: me@example.com
     subject: Some news
     to: you@example.com
     Message-ID: <<message_id>>
+    Date: <date>
     MIME-Version: 1.0
     Content-Type: multipart/mixed; boundary="===============<ID>=="
 
@@ -195,6 +198,7 @@ def test_without_jinja(use_jinja_obj, use_jinja):
     subject: Some news
     to: you@example.com
     Message-ID: <<message_id>>
+    Date: <date>
     MIME-Version: 1.0
     Content-Type: multipart/mixed; boundary="===============<ID>=="
 
@@ -223,7 +227,7 @@ def test_without_jinja(use_jinja_obj, use_jinja):
     """)[1:]
     if IS_PY37:
         expected = expected.replace('sender.full_n=\n', 'sender.full_n')
-    msg = remove_email_message_id(str(msg))
+    msg = prune_generated_headers(str(msg))
     assert remove_email_content_id(msg) == expected
 
 
@@ -262,7 +266,7 @@ def test_set_defaults():
     email.subject = "Some email"
     msg = email.get_message(text="Hi, an email")
     headers = {
-        key: val if key not in ('Message-ID',) else '<ID>'
+        key: val if key not in ('Message-ID', 'Date') else '<ID>'
         for key, val in msg.items()
     }
     assert {
@@ -273,18 +277,20 @@ def test_set_defaults():
         'Content-Transfer-Encoding': '7bit', 
         'MIME-Version': '1.0',
         'Message-ID': '<ID>',
+        'Date': '<ID>',
     } == headers
 
 def test_cc_bcc():
     email = EmailSender(host=None, port=1234)
     msg = email.get_message(sender="me@example.com", subject="Some email", cc=['you@example.com'], bcc=['he@example.com', 'she@example.com'])
-    msg = remove_email_message_id(str(msg))
+    msg = prune_generated_headers(str(msg))
     assert remove_email_content_id(msg) == dedent("""
     from: me@example.com
     subject: Some email
     cc: you@example.com
     bcc: he@example.com, she@example.com
     Message-ID: <<message_id>>
+    Date: <date>
 
     """)[1:]
 
@@ -312,7 +318,7 @@ def test_no_table_templates():
     headers = {
         key: val
         for key, val in msg.items()
-        if key not in ('Message-ID',)
+        if key not in ('Message-ID', 'Date')
     }
     assert headers == {
         'from': 'me@gmail.com', 

+ 3 - 2
redmail/test/email/test_cookbook.py

@@ -3,7 +3,7 @@ from typing import Union
 from textwrap import dedent
 from redmail import EmailSender
 
-from convert import remove_email_content_id, remove_email_message_id
+from convert import remove_email_content_id, prune_generated_headers
 
 def test_distributions():
     class DistrSender(EmailSender):
@@ -40,7 +40,7 @@ def test_distributions():
         cc="group2",
         subject="Some email",
     )
-    msg = remove_email_message_id(str(msg))
+    msg = prune_generated_headers(str(msg))
     msg = remove_email_content_id(str(msg))
     assert msg == dedent("""
     from: me@example.com
@@ -48,5 +48,6 @@ def test_distributions():
     to: me@example.com, you@example.com
     cc: he@example.com, she@example.com
     Message-ID: <<message_id>>
+    Date: <date>
     
     """)[1:]

+ 3 - 3
redmail/test/email/test_inline_media.py

@@ -65,7 +65,7 @@ def test_with_image_file(get_image_obj, dummy_png):
     headers = {
         key: val
         for key, val in msg.items()
-        if key not in ('Message-ID',)
+        if key not in ('Message-ID', 'Date')
     }
     assert {
         'from': 'me@gmail.com', 
@@ -117,7 +117,7 @@ def test_with_image_dict_jpeg():
     headers = {
         key: val
         for key, val in msg.items()
-        if key not in ('Message-ID',)
+        if key not in ('Message-ID', 'Date')
     }
     assert {
         'from': 'me@gmail.com', 
@@ -159,7 +159,7 @@ def test_with_image_obj(get_image_obj):
     headers = {
         key: val
         for key, val in msg.items()
-        if key not in ('Message-ID',)
+        if key not in ('Message-ID', 'Date')
     }
     assert {
         'from': 'me@gmail.com', 

+ 3 - 2
redmail/test/email/test_template.py

@@ -4,7 +4,7 @@ from redmail import EmailSender
 
 import pytest
 
-from convert import remove_email_extra, remove_email_content_id, remove_email_message_id
+from convert import remove_email_extra, remove_email_content_id, prune_generated_headers
 from getpass import getpass, getuser
 from platform import node
 
@@ -66,13 +66,14 @@ def test_jinja_env(tmpdir):
         html="<h1>A param: {{ my_param }}</h1>"
     )
     content = str(msg)
-    content = remove_email_message_id(content)
+    content = prune_generated_headers(content)
     content = remove_email_content_id(content)
     assert content == dedent("""
     from: me@example.com
     subject: Some news
     to: you@example.com
     Message-ID: <<message_id>>
+    Date: <date>
     MIME-Version: 1.0
     Content-Type: multipart/mixed; boundary="===============<ID>=="
 

+ 14 - 0
redmail/test/helpers/convert.py

@@ -16,6 +16,20 @@ def remove_email_content_id(s:str, repl="<ID>"):
 def remove_email_message_id(s:str, repl="<message_id>"):
     return re.sub(r"(?<=Message-ID: <).+?(?=>)", repl, s)
 
+def remove_date(s:str, repl="<date>"):
+    regex = r'(?<=Date: )[A-Za-z]{3}, [0-9]{2} [A-Za-z]{3} [0-9]{4} [0-9]{2}:[0-9]{2}:[0-9]{2}( [+-][0-9]{4})?'
+    return re.sub(regex, repl, s)
+
+def prune_generated_headers(s:str):
+    transformers = (
+        remove_email_content_id,
+        remove_email_message_id,
+        remove_date
+    )
+    for transf in transformers:
+        s = transf(s)
+    return s
+
 def payloads_to_dict(*parts):
     data = {}
     for part in parts:

+ 1 - 1
redmail/test/log/test_handler.py

@@ -170,7 +170,7 @@ def test_emit(logger, kwargs, exp_headers, exp_payload):
     headers = {
         key: val
         for key, val in msg.items()
-        if key not in ('Message-ID',)
+        if key not in ('Message-ID', 'Date')
     }
     payload = msg.get_payload()
 

+ 3 - 3
redmail/test/log/test_handler_multi.py

@@ -180,7 +180,7 @@ def test_emit(logger, kwargs, exp_headers, exp_payload):
     headers = {
         key: val
         for key, val in msg.items()
-        if key not in ('Message-ID',)
+        if key not in ('Message-ID', 'Date')
     }
     payload = msg.get_payload()
 
@@ -213,7 +213,7 @@ def test_flush_multiple(logger):
     headers = {
         key: val
         for key, val in msg.items()
-        if key not in ('Message-ID',)
+        if key not in ('Message-ID', 'Date')
     }
     text = msg.get_payload()
 
@@ -249,7 +249,7 @@ def test_flush_none():
     headers = {
         key: val
         for key, val in msg.items()
-        if key not in ('Message-ID',)
+        if key not in ('Message-ID', 'Date')
     }
     text = msg.get_payload()