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()