emails.py 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. """ This file contains email sending functions for Flask-User.
  2. It uses Jinja2 to render email subject and email message. It uses Flask-Mail to send email.
  3. :copyright: (c) 2013 by Ling Thio
  4. :author: Ling Thio (ling.thio@gmail.com)
  5. :license: Simplified BSD License, see LICENSE.txt for more details."""
  6. import smtplib
  7. import socket
  8. from flask import current_app, render_template
  9. from flask import url_for
  10. from walle.service.extensions import mail
  11. from flask_mail import Message
  12. from walle.service import tokens
  13. def _render_email(filename, **kwargs):
  14. # Render subject
  15. subject = render_template(filename + '_subject.txt', **kwargs)
  16. # Make sure that subject lines do not contain newlines
  17. subject = subject.replace('\n', ' ')
  18. subject = subject.replace('\r', ' ')
  19. # Render HTML message
  20. html_message = render_template(filename + '_message.html', **kwargs)
  21. # Render text message
  22. text_message = render_template(filename + '_message.txt', **kwargs)
  23. return (subject, html_message, text_message)
  24. def send_email(recipient, subject, html_message, text_message):
  25. """ Send email from default sender to 'recipient' """
  26. # Make sure that Flask-Mail has been initialized
  27. mail_engine = mail
  28. if not mail_engine:
  29. return 'Flask-Mail has not been initialized. Initialize Flask-Mail or disable USER_SEND_PASSWORD_CHANGED_EMAIL, USER_SEND_REGISTERED_EMAIL and USER_SEND_USERNAME_CHANGED_EMAIL'
  30. try:
  31. # Construct Flash-Mail message
  32. message = Message(subject,
  33. recipients=[recipient],
  34. html=html_message,
  35. body=text_message)
  36. return mail.send(message)
  37. # Print helpful error messages on exceptions
  38. except (socket.gaierror, socket.error) as e:
  39. return 'SMTP Connection error: Check your MAIL_SERVER and MAIL_PORT settings.'
  40. except smtplib.SMTPAuthenticationError:
  41. return 'SMTP Authentication error: Check your MAIL_USERNAME and MAIL_PASSWORD settings.'
  42. def get_primary_user_email(user):
  43. user_manager = current_app.user_manager
  44. db_adapter = user_manager.db_adapter
  45. if db_adapter.UserEmailClass:
  46. user_email = db_adapter.find_first_object(db_adapter.UserEmailClass,
  47. user_id=int(user.get_id()),
  48. is_primary=True)
  49. return user_email
  50. else:
  51. return user
  52. def send_confirm_email_email(user, user_email, confirm_email_link):
  53. # Verify certain conditions
  54. user_manager = current_app.user_manager
  55. if not user_manager.enable_email: return
  56. if not user_manager.send_registered_email and not user_manager.enable_confirm_email: return
  57. # Retrieve email address from User or UserEmail object
  58. email = user_email.email if user_email else user.email
  59. assert (email)
  60. # Render subject, html message and text message
  61. subject, html_message, text_message = _render_email(
  62. user_manager.confirm_email_email_template,
  63. user=user,
  64. app_name=user_manager.app_name,
  65. confirm_email_link=confirm_email_link)
  66. # Send email message using Flask-Mail
  67. user_manager.send_email_function(email, subject, html_message, text_message)
  68. def send_registered_email(user, confirm_email_link): # pragma: no cover
  69. # Verify certain conditions
  70. # user_manager = current_app.user_manager
  71. # if not user_manager.enable_email: return
  72. # if not user_manager.send_registered_email: return
  73. # Retrieve email address from User or UserEmail object
  74. email = user.email
  75. assert (email)
  76. # Render subject, html message and text message
  77. subject, html_message, text_message = _render_email(
  78. 'emails/registered',
  79. user=user,
  80. app_name='walle',
  81. confirm_email_link=confirm_email_link)
  82. # Send email message using Flask-Mail
  83. return send_email(email, subject, html_message, text_message)
  84. def public_send_registered_email(user, require_email_confirmation=True):
  85. # Send 'confirm_email' or 'registered' email
  86. # Generate confirm email link
  87. token_manager = tokens.TokenManager()
  88. token = token_manager.generate_token(int(user.id))
  89. confirm_email_link = url_for('deploy.confirm_mail', token=token, _external=True)
  90. # Send email
  91. return send_registered_email(user, confirm_email_link)