test_headers.py 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. import datetime
  2. import socket
  3. from textwrap import dedent
  4. import sys
  5. import re
  6. from redmail import EmailSender
  7. from convert import remove_email_content_id, prune_generated_headers
  8. import platform
  9. PYTHON_VERSION = sys.version_info
  10. IS_PY37 = sys.version_info < (3, 8)
  11. def test_date():
  12. format = "%a, %d %b %Y %H:%M:%S -0000"
  13. email = EmailSender(host=None, port=1234)
  14. before = datetime.datetime.now(datetime.timezone.utc)
  15. msg = email.get_message(sender="me@example.com", subject="Some email")
  16. after = datetime.datetime.now(datetime.timezone.utc)
  17. date_strings = re.findall(r'(?<=Date: ).+', str(msg))
  18. assert len(date_strings) == 1
  19. for dt_string in date_strings:
  20. # Validate the Date fits to the format
  21. datetime.datetime.strptime(dt_string, format)
  22. # It should not take longer than second to generate the email
  23. assert dt_string in (before.strftime(format), after.strftime(format))
  24. def test_message_id():
  25. domain = socket.getfqdn()
  26. email = EmailSender(host=None, port=1234)
  27. if IS_PY37:
  28. # Python <=3.7 has problems with domain names with UTF-8
  29. # This is mostly problem with CI.
  30. # We simulate realistic domain name
  31. domain = "REDMAIL-1234.mail.com"
  32. email.domain = domain
  33. msg = email.get_message(sender="me@example.com", subject="Some email")
  34. msg2 = email.get_message(sender="me@example.com", subject="Some email")
  35. message_ids = re.findall(r'(?<=Message-ID: ).+', str(msg))
  36. assert len(message_ids) == 1
  37. message_id = message_ids[0]
  38. # [0-9]{{12}}[.][0-9]{{5}}[.][0-9]{{20}}
  39. assert bool(re.search(fr'<[0-9.]+@{domain}>', message_id))
  40. # Check another email has not the same Message-ID
  41. message_id_2 = re.findall(r'(?<=Message-ID: ).+', str(msg2))[0]
  42. assert message_id != message_id_2
  43. def test_cc_bcc():
  44. email = EmailSender(host=None, port=1234)
  45. if IS_PY37:
  46. # CI has FQDN that has UTF-8 chars and goes to new line
  47. # for Python <=3.7. We set a realistic looking domain
  48. # name for easier testing
  49. email.domain = "REDMAIL-1234.mail.com"
  50. msg = email.get_message(sender="me@example.com", subject="Some email", cc=['you@example.com'], bcc=['he@example.com', 'she@example.com'])
  51. msg = prune_generated_headers(str(msg))
  52. assert remove_email_content_id(msg) == dedent("""
  53. From: me@example.com
  54. Subject: Some email
  55. Cc: you@example.com
  56. Bcc: he@example.com, she@example.com
  57. Message-ID: <<message_id>>
  58. Date: <date>
  59. """)[1:]