1
0

test_send.py 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  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_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. sender=f"An Alias <{os.environ['EMAIL_SENDER']}>",
  97. receivers=[os.environ['EMAIL_RECEIVERS']],
  98. subject="Embedded images",
  99. html='''
  100. <p>Dict image (JPEG):</p>
  101. <br>{{ dict_image }}
  102. <p>Plot image:</p>
  103. <br>{{ plot_image }}
  104. <p>Path image:</p>
  105. <br>{{ path_image }}
  106. ''',
  107. body_images={
  108. 'dict_image': {
  109. "content": img_bytes,
  110. 'subtype': 'jpg',
  111. },
  112. "plot_image": fig,
  113. "path_image": Path(__file__).parent.parent / "docs/imgs/email_emb_img.png",
  114. "path_image_str": str((Path(__file__).parent.parent / "docs/imgs/email_emb_img.png").absolute()),
  115. }
  116. )
  117. def send_tables():
  118. import pandas as pd
  119. df_empty = pd.DataFrame()
  120. df_simple = pd.DataFrame({"col 1": [1,2,3], "col 2": ["a", "b", "c"]})
  121. df_multi_index = pd.DataFrame({"col 1": [1,2,3], "col 2": ["a", "b", "c"]})
  122. email.send(
  123. receivers=[os.environ['EMAIL_RECEIVER']],
  124. subject="Embedded tables",
  125. html='''
  126. <p>Empty:</p>
  127. <br>{{ empty }}
  128. <p>Simple:</p>
  129. <br>{{ simple }}
  130. <p>Multi-index:</p>
  131. <br>{{ multi_index }}
  132. <p>Multi-index:</p>
  133. <br>{{ multi_index_and_columns }}
  134. ''',
  135. body_tables={
  136. 'empty': pd.DataFrame(),
  137. }
  138. )
  139. def log_multi():
  140. logger.handlers = []
  141. hdlr = MultiEmailHandler(
  142. capacity=4,
  143. email=email,
  144. subject="Log records: {min_level_name} - {max_level_name}",
  145. receivers=os.environ["EMAIL_RECEIVERS"].split(","),
  146. html="""
  147. {% for record in records %}
  148. <h2>A log record</h2>
  149. <ul>
  150. <li>Logging level: {{ record.levelname }}</li>
  151. <li>Message: {{ record.msg }}</li>
  152. </ul>
  153. {% endfor %}
  154. """,
  155. )
  156. logger.addHandler(hdlr)
  157. logger.debug("A debug record")
  158. logger.info("An info record")
  159. logger.warning("A warning record")
  160. try:
  161. raise RuntimeError("Oops")
  162. except:
  163. logger.exception("An exception record")
  164. logger.handlers = []
  165. def log_simple():
  166. logger.handlers = []
  167. hdlr = EmailHandler(
  168. email=email,
  169. subject="A log record: {record.levelname}",
  170. receivers=os.environ["EMAIL_RECEIVERS"].split(","),
  171. html="""
  172. <h2>A log record</h2>
  173. <ul>
  174. <li>Logging level: {{ record.levelname }}</li>
  175. <li>Message: {{ record.msg }}</li>
  176. </ul>
  177. """,
  178. )
  179. logger.addHandler(hdlr)
  180. logger.info("An info record")
  181. logger.handlers = []
  182. if __name__ == "__main__":
  183. fn_bodies = [send_empty, send_text, send_html, send_test_and_html, send_full_features]
  184. fn_attachments = [send_attachments, send_attachments_with_text, send_attachments_with_html]
  185. fn_log = [log_simple, log_multi]
  186. funcs = {
  187. "minimal": fn_bodies[0],
  188. "bodies": fn_bodies,
  189. "full": fn_bodies + fn_attachments + fn_log,
  190. "logging": fn_log,
  191. "images": fn_imgs,
  192. }[os.environ.get("EMAIL_FUNCS", "full")]
  193. for func in funcs:
  194. print("Running:", func.__name__)
  195. time.sleep(1)
  196. func()