test_send.py 6.9 KB

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