Amigo Sani,
Existe um grande problema que mandamos emails é massa, o problema se chama conexão. As vezes a canexão cai porque o servidor entende que você está disparando varias vezes um mesmo email, mas, por proteção ele acaba te derrubando. Mas para cada grande problema, existe uma solução e eis a minha solução:
from django.db.models import Q
from django.utils import uuid
from django.core.mail import send_mail, EmailMessage, BadHeaderError, EmailMultiAlternatives
from django.utils.html import strip_tags
from common.dlog import LOG
from common.lockfile import FileLock, AlreadyLocked, LockTimeout
from socket import error as socket_error
from datetime import datetime
import time
import smtplib
import base64
import sys
import os
try:
from django.core.validators import email_re
except:
from django.forms.fields import email_re
try:
from django.core.mail import get_connection
except ImportError:
from django.core.mail import SMTPConnection
get_connection = lambda backend=None, fail_silently=False, **kwds: SMTPConnection(fail_silently=fail_silently)
# lock timeout value. how long to wait for the lock to become available.
# default behavior is to never wait for the lock to be available.
LOCK_WAIT_TIMEOUT = getattr(web.settings, "MAILER_LOCK_WAIT_TIMEOUT", -1)
# The actual backend to use for sending, defaulting to the Django default.
EMAIL_BACKEND = getattr(web.settings, "EMAIL_BACKEND", "django.core.mail.backends.smtp.EmailBackend")
connection = None
## emails é a lista de nome, email, id
for message in emails:
try:
if connection is None:
connection = get_connection(backend=EMAIL_BACKEND, **params)
LOG.info("sending message '%s' to %s" % (message['nome'], message['email']) )
email = message['email']
html = t.corpo_html
text = strip_tags(html)
email_final = EmailMultiAlternatives(t.nome, text, params['username'], [email])
email_final.attach_alternative(html, "text/html")
r = connection.send_messages([email_final])
except (socket_error, smtplib.SMTPSenderRefused, smtplib.SMTPRecipientsRefused, smtplib.SMTPAuthenticationError), err:
LOG.info("message deferred due to failure: %s" % err)
connection = None
Então, fazemos um loop sempre usando o try para checar e houve algo errado, se tiver reconecte.
Espero ter te ajudado.