test_send.py 6.8 KB

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