email_utils.py 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. import os
  2. from email.message import EmailMessage
  3. from email.utils import make_msgid, formatdate
  4. from smtplib import SMTP
  5. from jinja2 import Environment, FileSystemLoader
  6. from app.config import SUPPORT_EMAIL, ROOT_DIR, POSTFIX_SERVER
  7. from app.log import LOG
  8. def _render(template_name, **kwargs) -> str:
  9. templates_dir = os.path.join(ROOT_DIR, "templates", "emails")
  10. env = Environment(loader=FileSystemLoader(templates_dir))
  11. template = env.get_template(template_name)
  12. return template.render(**kwargs)
  13. def send_welcome_email(email, name):
  14. send_by_postfix(
  15. email,
  16. f"{name}, welcome to SimpleLogin!",
  17. _render("welcome.txt", name=name),
  18. _render("welcome.html", name=name),
  19. )
  20. def send_activation_email(email, name, activation_link):
  21. send_by_postfix(
  22. email,
  23. f"{name}, just one more step to join SimpleLogin",
  24. _render("activation.txt", name=name, activation_link=activation_link),
  25. _render("activation.html", name=name, activation_link=activation_link),
  26. )
  27. def send_reset_password_email(email, name, reset_password_link):
  28. send_by_postfix(
  29. email,
  30. f"{name}, reset your password on SimpleLogin",
  31. _render(
  32. "reset-password.txt", name=name, reset_password_link=reset_password_link
  33. ),
  34. _render(
  35. "reset-password.html", name=name, reset_password_link=reset_password_link
  36. ),
  37. )
  38. def send_change_email(new_email, current_email, name, link):
  39. send_by_postfix(
  40. new_email,
  41. f"{name}, confirm email update on SimpleLogin",
  42. _render(
  43. "change-email.txt",
  44. name=name,
  45. link=link,
  46. new_email=new_email,
  47. current_email=current_email,
  48. ),
  49. _render(
  50. "change-email.html",
  51. name=name,
  52. link=link,
  53. new_email=new_email,
  54. current_email=current_email,
  55. ),
  56. )
  57. def send_new_app_email(email, name):
  58. send_by_postfix(
  59. email,
  60. f"{name}, any questions/feedbacks for SimpleLogin?",
  61. _render("new-app.txt", name=name),
  62. _render("new-app.html", name=name),
  63. )
  64. def send_test_email_alias(email, name):
  65. send_by_postfix(
  66. email,
  67. f"{name}, this email is sent to {email}",
  68. _render("test-email.txt", name=name, alias=email),
  69. _render("test-email.html", name=name, alias=email),
  70. )
  71. def send_by_postfix(to_email, subject, plaintext, html):
  72. # host IP, setup via Docker network
  73. smtp = SMTP(POSTFIX_SERVER, 25)
  74. msg = EmailMessage()
  75. msg["Subject"] = subject
  76. msg["From"] = f"Son from SimpleLogin <{SUPPORT_EMAIL}>"
  77. msg["To"] = to_email
  78. msg.set_content(plaintext)
  79. if html is not None:
  80. msg.add_alternative(html, subtype="html")
  81. msg_id_header = make_msgid()
  82. LOG.d("message-id %s", msg_id_header)
  83. msg["Message-ID"] = msg_id_header
  84. date_header = formatdate()
  85. LOG.d("Date header: %s", date_header)
  86. msg["Date"] = date_header
  87. smtp.send_message(msg, from_addr=SUPPORT_EMAIL, to_addrs=[to_email])
  88. def notify_admin(subject, html_content=""):
  89. send_by_postfix(SUPPORT_EMAIL, subject, html_content, html_content)