test_send.py 7.4 KB

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