From 41d293ee3b73d808162c1607c24cc231f0daa099 Mon Sep 17 00:00:00 2001 From: Max Erenberg <> Date: Tue, 4 Jan 2022 23:45:04 -0500 Subject: [PATCH] add retry mechanism when sending email to new user --- .../members/AddMemberTransaction.py | 27 ++++++++++++++----- 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/ceod/transactions/members/AddMemberTransaction.py b/ceod/transactions/members/AddMemberTransaction.py index bc37fa9..6362588 100644 --- a/ceod/transactions/members/AddMemberTransaction.py +++ b/ceod/transactions/members/AddMemberTransaction.py @@ -1,3 +1,5 @@ +import smtplib +import time import traceback from typing import Union, List @@ -89,12 +91,25 @@ class AddMemberTransaction(AbstractTransaction): # The following operations can't/shouldn't be rolled back because the # user has already seen the email - try: - self.mail_srv.send_welcome_message_to(user, password) - yield 'send_welcome_message' - except Exception as err: - logger.warning('send_welcome_message failed:\n' + traceback.format_exc()) - yield 'failed_to_send_welcome_message: ' + str(err) + # sometimes Postfix says 'User unknown in local recipient table' if we try + # to send an email to a user right after they were created + max_tries = 3 + for i in range(max_tries): + try: + self.mail_srv.send_welcome_message_to(user, password) + yield 'send_welcome_message' + break + except smtplib.SMTPRecipientsRefused: + if i < max_tries - 1: + logger.warning('SMTP recipient refused, sleeping and trying again') + time.sleep(3) + continue + else: + yield 'failed_to_send_welcome_message: recipient refused too many times' + except Exception as err: + logger.warning('send_welcome_message failed:\n' + traceback.format_exc()) + yield 'failed_to_send_welcome_message: ' + str(err) + break # don't subscribe club reps to csc-general if self.terms: