def notify(subject, whom, what):
    msg = email.message_from_string(what)
    msg.add_header("From", "Certbot renewal agent <root>")
    msg.add_header("To", whom)
    msg.add_header("Subject", subject)
    msg = msg.as_string()
    try:
        lmtp = smtplib.LMTP()
        lmtp.connect()
        lmtp.sendmail("root", [whom], msg)
    except (smtplib.SMTPHeloError, smtplib.SMTPRecipientsRefused,
            smtplib.SMTPSenderRefused, smtplib.SMTPDataError, socket.error):
        # We should try using /usr/sbin/sendmail in this case
        try:
            proc = subprocess.Popen(["/usr/sbin/sendmail", "-t"],
                                    stdin=subprocess.PIPE)
            proc.communicate(msg)
        except OSError:
            return False
    return True
Sender, user_agent, and ip_address should be set on form_valid.
dataset/ETHPy150Open letsencrypt/letsencrypt/certbot/notify.py/notify--crossover with--dataset/ETHPy150Open ofa/connect/open_connect/connectmessages/tests/test_views.py/MessageCreateViewTest.test_form_valid