emailing.py 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. """ send emails """
  2. from django.core.mail import EmailMultiAlternatives
  3. from django.template.loader import get_template
  4. from bookwyrm import models, settings
  5. from bookwyrm.tasks import app, EMAIL
  6. from bookwyrm.settings import DOMAIN
  7. def email_data():
  8. """fields every email needs"""
  9. site = models.SiteSettings.objects.get()
  10. return {
  11. "site_name": site.name,
  12. "logo": site.logo_small_url,
  13. "domain": DOMAIN,
  14. "user": None,
  15. }
  16. def test_email(user):
  17. """Just an admin checking if emails are sending"""
  18. data = email_data()
  19. send_email(user.email, *format_email("test", data))
  20. def email_confirmation_email(user):
  21. """newly registered users confirm email address"""
  22. data = email_data()
  23. data["confirmation_code"] = user.confirmation_code
  24. data["confirmation_link"] = user.confirmation_link
  25. send_email(user.email, *format_email("confirm", data))
  26. def invite_email(invite_request):
  27. """send out an invite code"""
  28. data = email_data()
  29. data["invite_link"] = invite_request.invite.link
  30. send_email.delay(invite_request.email, *format_email("invite", data))
  31. def password_reset_email(reset_code):
  32. """generate a password reset email"""
  33. data = email_data()
  34. data["reset_link"] = reset_code.link
  35. data["user"] = reset_code.user.display_name
  36. send_email(reset_code.user.email, *format_email("password_reset", data))
  37. def moderation_report_email(report):
  38. """a report was created"""
  39. data = email_data()
  40. data["reporter"] = report.reporter.localname or report.reporter.username
  41. if report.user:
  42. data["reportee"] = report.user.localname or report.user.username
  43. data["report_link"] = report.remote_id
  44. data["link_domain"] = report.links.exists()
  45. for admin in models.User.objects.filter(
  46. groups__name__in=["admin", "moderator"]
  47. ).distinct():
  48. data["user"] = admin.display_name
  49. send_email.delay(admin.email, *format_email("moderation_report", data))
  50. def format_email(email_name, data):
  51. """render the email templates"""
  52. subject = get_template(f"email/{email_name}/subject.html").render(data).strip()
  53. html_content = (
  54. get_template(f"email/{email_name}/html_content.html").render(data).strip()
  55. )
  56. text_content = (
  57. get_template(f"email/{email_name}/text_content.html").render(data).strip()
  58. )
  59. return (subject, html_content, text_content)
  60. @app.task(queue=EMAIL)
  61. def send_email(recipient, subject, html_content, text_content):
  62. """use a task to send the email"""
  63. email = EmailMultiAlternatives(
  64. subject, text_content, settings.EMAIL_SENDER, [recipient]
  65. )
  66. email.attach_alternative(html_content, "text/html")
  67. email.send()