email_service.py 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. import smtplib
  2. from email.mime.text import MIMEText
  3. from email.mime.multipart import MIMEMultipart
  4. import config
  5. def send_email(to_email: str, subject: str, body_html: str):
  6. try:
  7. msg = MIMEMultipart("alternative")
  8. msg["Subject"] = subject
  9. msg["From"] = config.SMTP_FROM
  10. msg["To"] = to_email
  11. html_part = MIMEText(body_html, "html")
  12. msg.attach(html_part)
  13. with smtplib.SMTP(config.SMTP_HOST, config.SMTP_PORT) as server:
  14. if config.SMTP_USER and config.SMTP_PASS:
  15. server.starttls()
  16. server.login(config.SMTP_USER, config.SMTP_PASS)
  17. server.sendmail(config.SMTP_FROM, to_email, msg.as_string())
  18. return True
  19. except Exception as e:
  20. print(f"FAILED TO SEND EMAIL: {e}")
  21. return False
  22. def send_verification_email(to_email: str, token: str, lang: str = "en"):
  23. verify_url = f"{config.FRONTEND_URL}/{lang}/auth?verify_token={token}"
  24. templates = {
  25. "en": {
  26. "subject": "Verify your Radionica 3D account",
  27. "body": f"""
  28. <h2>Welcome to Radionica 3D!</h2>
  29. <p>Please click the link below to verify your email address and activate your account:</p>
  30. <p><a href="{verify_url}" style="padding: 10px 20px; background-color: #000; color: #fff; text-decoration: none; border-radius: 5px;">Verify Email</a></p>
  31. <p>Or copy this link: {verify_url}</p>
  32. """
  33. },
  34. "me": {
  35. "subject": "Potvrdite vaš Radionica 3D nalog",
  36. "body": f"""
  37. <h2>Dobrodošli u Radionicu 3D!</h2>
  38. <p>Kliknite na link ispod kako biste potvrdili vašu email adresu и aktivirali nalog:</p>
  39. <p><a href="{verify_url}" style="padding: 10px 20px; background-color: #000; color: #fff; text-decoration: none; border-radius: 5px;">Potvrdi Email</a></p>
  40. <p>Ili kopirajte ovaj link: {verify_url}</p>
  41. """
  42. },
  43. "ru": {
  44. "subject": "Подтвердите вашу учетную запись Radionica 3D",
  45. "body": f"""
  46. <h2>Добро пожаловать в Radionica 3D!</h2>
  47. <p>Пожалуйста, нажмите на ссылку ниже, чтобы подтвердить свой email и активировать аккаунт:</p>
  48. <p><a href="{verify_url}" style="padding: 10px 20px; background-color: #000; color: #fff; text-decoration: none; border-radius: 5px;">Подтвердить Email</a></p>
  49. <p>Или скопируйте эту ссылку: {verify_url}</p>
  50. """
  51. },
  52. "ua": {
  53. "subject": "Підтвердіть вашу обліковий запис Radionica 3D",
  54. "body": f"""
  55. <h2>Ласкаво просимо до Radionica 3D!</h2>
  56. <p>Будь ласка, натисніть на посилання нижче, щоб підтвердити свій email та активувати акаунт:</p>
  57. <p><a href="{verify_url}" style="padding: 10px 20px; background-color: #000; color: #fff; text-decoration: none; border-radius: 5px;">Підтвердити Email</a></p>
  58. <p>Або скопіюйте це посилання: {verify_url}</p>
  59. """
  60. }
  61. }
  62. tpl = templates.get(lang, templates["en"])
  63. return send_email(to_email, tpl["subject"], tpl["body"])
  64. def send_password_reset_email(to_email: str, token: str, lang: str = "en"):
  65. reset_url = f"{config.FRONTEND_URL}/{lang}/auth?token={token}"
  66. templates = {
  67. "en": {
  68. "subject": "Reset your Radionica 3D password",
  69. "body": f"""
  70. <h2>Password Reset Request</h2>
  71. <p>You requested a password reset. Click the button below to set a new password. This link is valid for 10 minutes.</p>
  72. <p><a href="{reset_url}" style="padding: 10px 20px; background-color: #000; color: #fff; text-decoration: none; border-radius: 5px;">Reset Password</a></p>
  73. <p>Or copy this link: {reset_url}</p>
  74. """
  75. },
  76. "me": {
  77. "subject": "Resetovanje lozinke na Radionica 3D",
  78. "body": f"""
  79. <h2>Zahtjev za resetovanje lozinke</h2>
  80. <p>Zatražili ste resetovanje lozinke. Kliknite na dugme ispod kako biste postavili novu lozinku. Ovaj link važi 10 minuta.</p>
  81. <p><a href="{reset_url}" style="padding: 10px 20px; background-color: #000; color: #fff; text-decoration: none; border-radius: 5px;">Resetuj lozinku</a></p>
  82. <p>Ili kopirajte ovaj link: {reset_url}</p>
  83. """
  84. },
  85. "ru": {
  86. "subject": "Сброс пароля Radionica 3D",
  87. "body": f"""
  88. <h2>Запрос на сброс пароля</h2>
  89. <p>Вы запросили сброс пароля. Нажмите на кнопку ниже, чтобы установить новый пароль. Ссылка действительна в течение 10 минут.</p>
  90. <p><a href="{reset_url}" style="padding: 10px 20px; background-color: #000; color: #fff; text-decoration: none; border-radius: 5px;">Сбросить пароль</a></p>
  91. <p>Или скопируйте эту ссылку: {reset_url}</p>
  92. """
  93. },
  94. "ua": {
  95. "subject": "Скидання пароля Radionica 3D",
  96. "body": f"""
  97. <h2>Запит на скидання пароля</h2>
  98. <p>Ви запросили скидання пароля. Натисніть на кнопку нижче, щоб встановити новий пароль. Посилання дійсне протягом 10 хвилин.</p>
  99. <p><a href="{reset_url}" style="padding: 10px 20px; background-color: #000; color: #fff; text-decoration: none; border-radius: 5px;">Скинути пароль</a></p>
  100. <p>Або скопіюйте це посилання: {reset_url}</p>
  101. """
  102. }
  103. }
  104. tpl = templates.get(lang, templates["en"])
  105. return send_email(to_email, tpl["subject"], tpl["body"])