zulip/zerver/management/commands/send_test_email.py

70 lines
2.8 KiB
Python

import io
import smtplib
from contextlib import redirect_stderr
from typing import Any
from django.conf import settings
from django.core.mail import mail_admins, mail_managers, send_mail
from django.core.management import CommandError
from django.core.management.commands import sendtestemail
from zerver.lib.send_email import FromAddress, log_email_config_errors
class Command(sendtestemail.Command):
def handle(self, *args: Any, **kwargs: str) -> None:
if settings.WARN_NO_EMAIL:
raise CommandError(
"Outgoing email not yet configured, see\n "
"https://zulip.readthedocs.io/en/latest/production/email.html"
)
log_email_config_errors()
if len(kwargs["email"]) == 0:
raise CommandError(
"Usage: /home/zulip/deployments/current/manage.py "
"send_test_email username@example.com"
)
print("If you run into any trouble, read:")
print()
print(" https://zulip.readthedocs.io/en/latest/production/email.html#troubleshooting")
print()
print("The most common error is not setting `ADD_TOKENS_TO_NOREPLY_ADDRESS=False` when")
print("using an email provider that doesn't support that feature.")
print()
print("Sending 2 test emails from:")
message = (
"Success! If you receive this message (and a second with a different subject), "
"you've successfully configured sending emails from your Zulip server. "
"Remember that you need to restart "
"the Zulip server with /home/zulip/deployments/current/scripts/restart-server "
"after changing the settings in /etc/zulip before your changes will take effect."
)
with redirect_stderr(io.StringIO()) as f:
smtplib.SMTP.debuglevel = 1
try:
sender = FromAddress.SUPPORT
print(f" * {sender}")
send_mail("Zulip email test", message, sender, kwargs["email"])
noreply_sender = FromAddress.tokenized_no_reply_address()
print(f" * {noreply_sender}")
send_mail("Zulip noreply email test", message, noreply_sender, kwargs["email"])
except smtplib.SMTPException as e:
print(f"Failed to send mails: {e}")
print()
print("Full SMTP log follows:")
print(f.getvalue())
raise CommandError("Email sending failed!")
print()
print("Successfully sent 2 emails to {}!".format(", ".join(kwargs["email"])))
if kwargs["managers"]:
mail_managers("Zulip manager email test", "This email was sent to the site managers.")
if kwargs["admins"]:
mail_admins("Zulip admins email test", "This email was sent to the site admins.")