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: