emails: Add a FromAddress class to control access to certain settings emails.

No change in behavior.

Also makes the first step towards converting all uses of
settings.ZULIP_ADMINISTRATOR and settings.NOREPLY_EMAIL_ADDRESS to
FromAddress.*.

Once everything is converted, it will be easier to ensure that future
development doesn't break backwards compatibility with the old style of
settings emails.
This commit is contained in:
James Rowan
2017-06-26 13:43:32 -04:00
committed by Tim Abbott
parent 368bd66d8b
commit d88e7308bf
7 changed files with 19 additions and 16 deletions

View File

@@ -29,7 +29,7 @@ from zerver.lib.message import (
)
from zerver.lib.realm_icon import realm_icon_url
from zerver.lib.retention import move_message_to_archive
from zerver.lib.send_email import send_email
from zerver.lib.send_email import send_email, FromAddress
from zerver.models import Realm, RealmEmoji, Stream, UserProfile, UserActivity, \
RealmDomain, \
Subscription, Recipient, Message, Attachment, UserMessage, RealmAuditLog, \
@@ -640,8 +640,7 @@ def do_start_email_change_process(user_profile, new_email):
activation_url = EmailChangeConfirmation.objects.get_link_for_object(obj, host=user_profile.realm.host)
context = {'realm': user_profile.realm, 'old_email': old_email, 'new_email': new_email,
'activate_url': activation_url}
send_email('zerver/emails/confirm_new_email', new_email, from_address=settings.ZULIP_ADMINISTRATOR.split()[-1],
context=context)
send_email('zerver/emails/confirm_new_email', new_email, from_address=FromAddress.SUPPORT, context=context)
def compute_irc_user_fullname(email):
# type: (NonBinaryStr) -> NonBinaryStr
@@ -3054,8 +3053,7 @@ def do_send_confirmation_email(invitee, referrer, body):
"""
activation_url = Confirmation.objects.get_link_for_object(invitee, host=referrer.realm.host)
context = {'referrer': referrer, 'custom_body': body, 'activate_url': activation_url}
send_email('zerver/emails/invitation', invitee.email, from_address=settings.ZULIP_ADMINISTRATOR.split()[-1],
context=context)
send_email('zerver/emails/invitation', invitee.email, from_address=FromAddress.SUPPORT, context=context)
def is_inactive(email):
# type: (Text) -> None

View File

@@ -8,7 +8,7 @@ from django.template import loader
from django.utils.timezone import now as timezone_now
from zerver.decorator import statsd_increment
from zerver.lib.send_email import send_future_email, display_email, \
send_email_from_dict
send_email_from_dict, FromAddress
from zerver.lib.queue import queue_json_publish
from zerver.models import (
Recipient,
@@ -26,6 +26,7 @@ from zerver.models import (
)
import datetime
from email.utils import formataddr
import re
import subprocess
import ujson
@@ -398,7 +399,7 @@ def enqueue_welcome_emails(email, name):
from_address = settings.WELCOME_EMAIL_SENDER['email']
else:
from_name = None
from_address = settings.ZULIP_ADMINISTRATOR.split()[-1]
from_address = FromAddress.SUPPORT
user_profile = get_user_profile_by_email(email)
unsubscribe_link = one_click_unsubscribe_link(user_profile, "welcome")

View File

@@ -10,6 +10,10 @@ import ujson
from typing import Any, Dict, Iterable, List, Mapping, Optional, Text
class FromAddress(object):
SUPPORT = parseaddr(settings.ZULIP_ADMINISTRATOR)[1]
NOREPLY = parseaddr(settings.NOREPLY_EMAIL_ADDRESS)[1]
def display_email(user):
# type: (UserProfile) -> Text
# Change to '%s <%s>' % (user.full_name, user.email) once
@@ -33,7 +37,7 @@ def build_email(template_prefix, to_email, from_name=None, from_address=None,
if from_name is None:
from_name = "Zulip"
if from_address is None:
from_address = parseaddr(settings.NOREPLY_EMAIL_ADDRESS)[1]
from_address = FromAddress.NOREPLY
from_email = formataddr((from_name, from_address))
reply_to = None
if reply_to_email is not None:

View File

@@ -36,7 +36,7 @@ from zerver.lib.actions import (
get_stream,
do_create_realm,
)
from zerver.lib.send_email import display_email, send_email, send_future_email
from zerver.lib.send_email import display_email, send_email, send_future_email, FromAddress
from zerver.lib.initial_password import initial_password
from zerver.lib.actions import (
do_deactivate_realm,
@@ -743,7 +743,7 @@ so we didn't send them an invitation. We did send invitations to everyone else!"
with self.settings(EMAIL_BACKEND='django.core.mail.backends.console.EmailBackend'):
send_future_email(
"zerver/emails/invitation_reminder", data["email"],
from_address=settings.ZULIP_ADMINISTRATOR.split()[-1], context=context)
from_address=FromAddress.SUPPORT, context=context)
email_jobs_to_deliver = ScheduledJob.objects.filter(
type=ScheduledJob.EMAIL,
scheduled_timestamp__lte=timezone_now())

View File

@@ -16,7 +16,7 @@ from zerver.models import UserProfile, Realm, PreregistrationUser, \
name_changes_disabled, email_to_username, \
completely_open, get_unique_open_realm, email_allowed_for_realm, \
get_realm, get_realm_by_email_domain, get_system_bot
from zerver.lib.send_email import send_email, send_email_to_user
from zerver.lib.send_email import send_email, send_email_to_user, FromAddress
from zerver.lib.events import do_events_register
from zerver.lib.actions import do_change_password, do_change_full_name, do_change_is_admin, \
do_activate_user, do_create_user, do_create_realm, set_default_streams, \
@@ -313,7 +313,7 @@ def send_registration_completion_email(email, request, realm_creation=False):
"""
prereg_user = create_preregistration_user(email, request, realm_creation)
activation_url = Confirmation.objects.get_link_for_object(prereg_user, host=request.get_host())
send_email('zerver/emails/confirm_registration', email, from_address=settings.ZULIP_ADMINISTRATOR.split()[-1],
send_email('zerver/emails/confirm_registration', email, from_address=FromAddress.SUPPORT,
context={'activate_url': activation_url})
if settings.DEVELOPMENT and realm_creation:
request.session['confirmation_key'] = {'confirmation_key': activation_url.split('/')[-1]}

View File

@@ -17,7 +17,7 @@ from zerver.lib.actions import do_change_password, \
do_regenerate_api_key, do_change_avatar_fields, do_set_user_display_setting, \
validate_email, do_change_user_email, do_start_email_change_process
from zerver.lib.avatar import avatar_url
from zerver.lib.send_email import send_email, display_email
from zerver.lib.send_email import send_email, display_email, FromAddress
from zerver.lib.i18n import get_available_language_codes
from zerver.lib.response import json_success, json_error
from zerver.lib.upload import upload_avatar_image
@@ -52,7 +52,7 @@ def confirm_email_change(request, confirmation_key):
'new_email': new_email,
}
send_email('zerver/emails/notify_change_in_email', old_email,
from_address=settings.ZULIP_ADMINISTRATOR.split()[-1], context=context)
from_address=FromAddress.SUPPORT, context=context)
ctx = {
'confirmed': confirmed,

View File

@@ -27,7 +27,7 @@ from zerver.lib.actions import do_send_confirmation_email, \
render_incoming_message, do_update_embedded_data
from zerver.lib.url_preview import preview as url_preview
from zerver.lib.digest import handle_digest_email
from zerver.lib.send_email import send_future_email, send_email_from_dict
from zerver.lib.send_email import send_future_email, send_email_from_dict, FromAddress
from zerver.lib.email_mirror import process_message as mirror_email
from zerver.decorator import JsonableError
from zerver.tornado.socket import req_redis_key
@@ -180,7 +180,7 @@ class ConfirmationEmailWorker(QueueProcessingWorker):
send_future_email(
"zerver/emails/invitation_reminder",
data["email"],
from_address=settings.ZULIP_ADMINISTRATOR.split()[-1],
from_address=FromAddress.SUPPORT,
context=context,
delay=datetime.timedelta(days=2))