test_headers.py 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. import datetime
  2. import socket
  3. from textwrap import dedent
  4. import sys
  5. import re
  6. import pytest
  7. from redmail import EmailSender
  8. from convert import remove_email_content_id, prune_generated_headers
  9. import platform
  10. PYTHON_VERSION = sys.version_info
  11. IS_PY37 = sys.version_info < (3, 8)
  12. def test_date():
  13. format = "%a, %d %b %Y %H:%M:%S -0000"
  14. email = EmailSender(host=None, port=1234)
  15. before = datetime.datetime.now(datetime.timezone.utc)
  16. msg = email.get_message(sender="me@example.com", subject="Some email")
  17. after = datetime.datetime.now(datetime.timezone.utc)
  18. date_strings = re.findall(r'(?<=Date: ).+', msg.as_string(policy=msg.policy.clone(linesep=)))
  19. assert len(date_strings) == 1
  20. for dt_string in date_strings:
  21. # Validate the Date fits to the format
  22. datetime.datetime.strptime(dt_string, format)
  23. # It should not take longer than second to generate the email
  24. assert dt_string in (before.strftime(format), after.strftime(format))
  25. def test_message_id():
  26. domain = socket.getfqdn()
  27. email = EmailSender(host=None, port=1234)
  28. if IS_PY37:
  29. # Python <=3.7 has problems with domain names with UTF-8
  30. # This is mostly problem with CI.
  31. # We simulate realistic domain name
  32. domain = "REDMAIL-1234.mail.com"
  33. email.domain = domain
  34. msg = email.get_message(sender="me@example.com", subject="Some email")
  35. msg2 = email.get_message(sender="me@example.com", subject="Some email")
  36. message_ids = re.findall(r'(?<=Message-ID: )[^\r\n]+', str(msg))
  37. assert len(message_ids) == 1
  38. message_id = message_ids[0]
  39. # [0-9]{{12}}[.][0-9]{{5}}[.][0-9]{{20}}
  40. assert bool(re.search(fr'<[0-9.]+@{domain}>', message_id))
  41. # Check another email has not the same Message-ID
  42. message_id_2 = re.findall(r'(?<=Message-ID: ).+', str(msg2))[0]
  43. assert message_id != message_id_2
  44. def test_cc_bcc():
  45. email = EmailSender(host=None, port=1234)
  46. if IS_PY37:
  47. # CI has FQDN that has UTF-8 chars and goes to new line
  48. # for Python <=3.7. We set a realistic looking domain
  49. # name for easier testing
  50. email.domain = "REDMAIL-1234.mail.com"
  51. msg = email.get_message(sender="me@example.com", subject="Some email", cc=['you@example.com'], bcc=['he@example.com', 'she@example.com'])
  52. msg = prune_generated_headers(str(msg))
  53. assert remove_email_content_id(msg) == dedent("""
  54. From: me@example.com
  55. Subject: Some email
  56. Cc: you@example.com
  57. Bcc: he@example.com, she@example.com
  58. Message-ID: <<message_id>>
  59. Date: <date>
  60. """)[1:].replace('\n', '\r\n')
  61. @pytest.mark.parametrize("how", ["instance", "email"])
  62. def test_custom_headers(how):
  63. email = EmailSender(host=None, port=1234)
  64. headers = {"Importance": "high"}
  65. if IS_PY37:
  66. # Python <=3.7 has problems with domain names with UTF-8
  67. # This is mostly problem with CI.
  68. # We simulate realistic domain name
  69. domain = "REDMAIL-1234.mail.com"
  70. email.domain = domain
  71. if how == "email":
  72. msg = email.get_message(
  73. sender="me@example.com",
  74. subject="Some email",
  75. headers=headers
  76. )
  77. elif how == "instance":
  78. email.headers = headers
  79. msg = email.get_message(
  80. sender="me@example.com",
  81. subject="Some email",
  82. )
  83. msg = prune_generated_headers(str(msg))
  84. assert remove_email_content_id(msg) == dedent("""
  85. From: me@example.com
  86. Subject: Some email
  87. Message-ID: <<message_id>>
  88. Date: <date>
  89. Importance: high
  90. """)[1:].replace('\n', '\r\n')
  91. @pytest.mark.parametrize("how", ["instance", "email"])
  92. def test_custom_headers_override(how):
  93. email = EmailSender(host=None, port=1234)
  94. headers = {
  95. "Date": datetime.datetime(2021, 1, 31, 6, 56, 46, tzinfo=datetime.timezone.utc),
  96. "Message-ID": "<167294165062.31860.1664530310632362057@LAPTOP-1234GML0>"
  97. }
  98. if how == "email":
  99. msg = email.get_message(
  100. sender="me@example.com",
  101. subject="Some email",
  102. headers=headers
  103. )
  104. elif how == "instance":
  105. email.headers = headers
  106. msg = email.get_message(
  107. sender="me@example.com",
  108. subject="Some email",
  109. )
  110. assert str(msg) == dedent("""
  111. From: me@example.com
  112. Subject: Some email
  113. Message-ID: <167294165062.31860.1664530310632362057@LAPTOP-1234GML0>
  114. Date: Sun, 31 Jan 2021 06:56:46 +0000
  115. """)[1:].replace('\n', '\r\n')