test_send.py 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. import argparse
  2. import os, time
  3. import base64, logging
  4. from pathlib import Path
  5. from redmail import EmailSender, EmailHandler, MultiEmailHandler
  6. from dotenv import load_dotenv
  7. load_dotenv()
  8. email = EmailSender(
  9. host=os.environ['EMAIL_HOST'],
  10. port=int(os.environ['EMAIL_PORT']),
  11. username=os.environ['EMAIL_USERNAME'],
  12. password=os.environ['EMAIL_PASSWORD']
  13. )
  14. logger = logging.getLogger(__name__)
  15. logger.setLevel(logging.DEBUG)
  16. def send_empty():
  17. msg = email.send(
  18. sender=os.environ['EMAIL_SENDER'],
  19. receivers=os.environ['EMAIL_RECEIVERS'].split(","),
  20. subject="Empty email",
  21. )
  22. def send_text():
  23. msg = email.send(
  24. sender=os.environ['EMAIL_SENDER'],
  25. receivers=os.environ['EMAIL_RECEIVERS'].split(","),
  26. subject="Email with text",
  27. text="Hi, this is an example email.",
  28. )
  29. def send_html():
  30. msg = email.send(
  31. sender=os.environ['EMAIL_SENDER'],
  32. receivers=os.environ['EMAIL_RECEIVERS'].split(","),
  33. subject="Email with HTML",
  34. html="<h2>This is HTML.</h2>",
  35. )
  36. def send_test_and_html():
  37. msg = email.send(
  38. sender=os.environ['EMAIL_SENDER'],
  39. receivers=os.environ['EMAIL_RECEIVERS'].split(","),
  40. subject="Email with text and HTML",
  41. text="This is text (with HTML).",
  42. html="<h2>This is HTML (with text).</h2>",
  43. )
  44. def send_attachments():
  45. msg = email.send(
  46. sender=os.environ['EMAIL_SENDER'],
  47. receivers=os.environ['EMAIL_RECEIVERS'].split(","),
  48. subject="Email with attachment",
  49. attachments={"a_file.html": (Path(__file__).parent / "file.html")}
  50. )
  51. def send_attachments_with_text():
  52. msg = email.send(
  53. sender=os.environ['EMAIL_SENDER'],
  54. receivers=os.environ['EMAIL_RECEIVERS'].split(","),
  55. subject="Email with attachment and text",
  56. text="This contains an attachment.",
  57. attachments={"a_file.html": (Path(__file__).parent / "file.html")}
  58. )
  59. def send_attachments_with_html():
  60. msg = email.send(
  61. sender=os.environ['EMAIL_SENDER'],
  62. receivers=os.environ['EMAIL_RECEIVERS'].split(","),
  63. subject="Email with attachment and HTML",
  64. html="<h1>This contains an attachment.</h1>",
  65. attachments={"a_file.html": (Path(__file__).parent / "file.html")}
  66. )
  67. def send_attachments_with_html_and_image():
  68. msg = email.send(
  69. sender=os.environ['EMAIL_SENDER'],
  70. receivers=os.environ['EMAIL_RECEIVERS'].split(","),
  71. subject="Email with attachment, HTML and inline image",
  72. html="<h1>This contains an attachment and image.</h1>{{ path_image }}",
  73. body_images={
  74. "path_image": Path(__file__).parent.parent / "docs/imgs/email_emb_img.png",
  75. },
  76. attachments={"a_file.html": (Path(__file__).parent / "file.html")}
  77. )
  78. def send_full_features():
  79. msg = email.send(
  80. sender=os.environ['EMAIL_SENDER'],
  81. receivers=os.environ['EMAIL_RECEIVERS'].split(","),
  82. subject="Email with full features",
  83. text="Hi, this contains an attachment and image.",
  84. html="<h1>This contains text, HTML, an attachment and inline image.</h1>{{ path_image }}",
  85. body_images={
  86. "path_image": Path(__file__).parent.parent / "docs/imgs/email_emb_img.png",
  87. },
  88. attachments={"a_file.html": (Path(__file__).parent / "file.html")}
  89. )
  90. def send_images():
  91. img_data = '/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAIBAQIBAQICAgICAgICAwUDAwMDAwYEBAMFBwYHBwcGBwcICQsJCAgKCAcHCg0KCgsMDAwMBwkODw0MDgsMDAz/2wBDAQICAgMDAwYDAwYMCAcIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz/wAARCAABAAEDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD5rooor8DP9oD/2Q=='
  92. img_bytes = base64.b64decode(img_data)
  93. import matplotlib.pyplot as plt
  94. fig = plt.figure()
  95. plt.plot([1,2,3,2,3])
  96. email.send(
  97. sender=f"An Alias <{os.environ['EMAIL_SENDER']}>",
  98. receivers=[os.environ['EMAIL_RECEIVERS']],
  99. subject="Embedded images",
  100. html='''
  101. <p>Dict image (JPEG):</p>
  102. <br>{{ dict_image }}
  103. <p>Plot image:</p>
  104. <br>{{ plot_image }}
  105. <p>Path image:</p>
  106. <br>{{ path_image }}
  107. ''',
  108. body_images={
  109. 'dict_image': {
  110. "content": img_bytes,
  111. 'subtype': 'jpg',
  112. },
  113. "plot_image": fig,
  114. "path_image": Path(__file__).parent.parent / "docs/imgs/email_emb_img.png",
  115. "path_image_str": str((Path(__file__).parent.parent / "docs/imgs/email_emb_img.png").absolute()),
  116. }
  117. )
  118. def send_tables():
  119. import pandas as pd
  120. df_empty = pd.DataFrame()
  121. df_simple = pd.DataFrame({"col 1": [1,2,3], "col 2": ["a", "b", "c"]})
  122. df_multi_index = pd.DataFrame({"col 1": [1,2,3], "col 2": ["a", "b", "c"]})
  123. email.send(
  124. receivers=[os.environ['EMAIL_RECEIVER']],
  125. subject="Embedded tables",
  126. html='''
  127. <p>Empty:</p>
  128. <br>{{ empty }}
  129. <p>Simple:</p>
  130. <br>{{ simple }}
  131. <p>Multi-index:</p>
  132. <br>{{ multi_index }}
  133. <p>Multi-index:</p>
  134. <br>{{ multi_index_and_columns }}
  135. ''',
  136. body_tables={
  137. 'empty': pd.DataFrame(),
  138. }
  139. )
  140. def log_multi():
  141. logger.handlers = []
  142. hdlr = MultiEmailHandler(
  143. capacity=4,
  144. email=email,
  145. subject="Log records: {min_level_name} - {max_level_name}",
  146. receivers=os.environ["EMAIL_RECEIVERS"].split(","),
  147. html="""
  148. {% for record in records %}
  149. <h2>A log record</h2>
  150. <ul>
  151. <li>Logging level: {{ record.levelname }}</li>
  152. <li>Message: {{ record.msg }}</li>
  153. </ul>
  154. {% endfor %}
  155. """,
  156. )
  157. logger.addHandler(hdlr)
  158. logger.debug("A debug record")
  159. logger.info("An info record")
  160. logger.warning("A warning record")
  161. try:
  162. raise RuntimeError("Oops")
  163. except:
  164. logger.exception("An exception record")
  165. logger.handlers = []
  166. def log_simple():
  167. logger.handlers = []
  168. hdlr = EmailHandler(
  169. email=email,
  170. subject="A log record: {record.levelname}",
  171. receivers=os.environ["EMAIL_RECEIVERS"].split(","),
  172. html="""
  173. <h2>A log record</h2>
  174. <ul>
  175. <li>Logging level: {{ record.levelname }}</li>
  176. <li>Message: {{ record.msg }}</li>
  177. </ul>
  178. """,
  179. )
  180. logger.addHandler(hdlr)
  181. logger.info("An info record")
  182. logger.handlers = []
  183. def main():
  184. funcs = {
  185. "empty": send_empty,
  186. "body_with_text": send_text,
  187. "body_with_html": send_html,
  188. "body_with_html_and_text": send_test_and_html,
  189. "full": send_full_features,
  190. "images": send_images,
  191. "with_attachments": send_attachments,
  192. "body_with_text_and_attachments": send_attachments_with_text,
  193. "body_with_html_and_attachments": send_attachments_with_html,
  194. "log": log_simple,
  195. "log_multi": log_multi,
  196. }
  197. parser = argparse.ArgumentParser(prog="Redmail tester")
  198. parser.add_argument(
  199. 'funcs', type=str, nargs='+',
  200. help=f"Test functions to run. Allowed: {list(funcs)}"
  201. )
  202. args = parser.parse_args()
  203. for func_name in args.funcs:
  204. func = funcs[func_name]
  205. func()
  206. time.sleep(1)
  207. if __name__ == "__main__":
  208. main()