SMTP-подключение Gmail "неожиданно закрыто" после отправки нескольких писем с многопоточностью

Я пытаюсь использовать многопоточный подход для ускорения отправки нескольких отдельных писем с помощью фреймворка Django и Gmail SMTP, но сталкиваюсь с проблемами, связанными с разрывом соединения

Важно знать, что мне удается отправить около 50 или 55 писем, пока мое соединение не обрывается с этой ошибкой:

smtplib.SMTPServerDisconnected: Connection unexpectedly closed

Я не могу использовать метод Django send_mass_email, потому что мне нужно иметь возможность регистрировать отправку или неудачу каждого письма в базе данных для целей аудита

Мой код выглядит следующим образом:

class Threading(Thread):
def __init__(self, emails):
    self.emails = emails
    Threading.thread(self)

def thread(self):
    queue = Queue()

    #4 worker threads
    for x in range(4):

        worker = SenderWorker(queue)
        worker.daemon = True
        worker.start()

    
    for email in self.emails:
        queue.put( email )

    queue.join()

И класс SenderWorker:

class SenderWorker(Thread):

def __init__(self, queue):
    Thread.__init__(self)
    self.queue = queue

def run(self):
    start = datetime.now()
    while True:
        email = self.queue.get()
        try:
            Email.sendEmail( email ) #method for sending and logging a single email sent
        finally:
            self.queue.task_done()

Моя конфигурация SMTP выглядит следующим образом:

EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_USE_TLS = True
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_PORT = 587
EMAIL_HOST_USER = 'anon@anonymous.com'
SERVER_EMAIL = 'anon@anonymous.com'
EMAIL_HOST_PASSWORD = '*******'
DEFAULT_FROM_EMAIL = EMAIL_HOST_USER

Я пробовал до сих пор:

< <

После игры вокруг я наконец-то нашел ответ, если кому-то еще это нужно:

Соединение не работало, потому что я открывал и закрывал несколько из них в секунду. Когда я создаю одно SMTP-соединение и передаю его, чтобы все письма отправлялись через него, проблема исчезает (теперь мне просто нужно разобраться с другими ограничениями)

Класс чтения выглядит сейчас следующим образом:

class Threading(Thread):
def __init__(self, emails):
    self.emails = emails
    Threading.thread(self)

def thread(self):
    queue = Queue()
    connection = mail.get_connection()
    connection.open()

    for x in range(4):

        worker = SenderWorker(queue)
        worker.daemon = True
        worker.start()

    for email in self.emails:
        email['connection'] = connection
        queue.put( email )

    queue.join()
Вернуться на верх