Gerenciar o envio de vários emails com EmailAlternatives

84 views
Skip to first unread message

Sani Naimayer

unread,
Apr 26, 2012, 4:23:52 PM4/26/12
to django...@googlegroups.com
Boa tarde galera,

         alguém aqui já implementou uma app de mala direta? Estou concluindo uma mas estou tendo problema quando tenho muitos destinatários. Quando tento enviar uma mensagem em massa com uns 1000 emails por exemplo o servidor fica processando e pela demora o servidor acaba reiniciando a requisição e encerra ai.

         Alguém tem alguma idéia que possa compartilhar?

Agradeço desde já.


Att

Sani A. Naimayer

Elyézer Mendes Rezende

unread,
Apr 27, 2012, 6:55:59 AM4/27/12
to django...@googlegroups.com
Creio que para o seu problema seria interessante usar o Celery [1]
para que vc possa enviar de forma asíncrona.

Ainda não tive experiência com mala direta, mas existe o
send_mass_mail [2] que talvez pode ser útil.

Até mais

[1] http://celeryproject.org/
[2] https://docs.djangoproject.com/en/dev/topics/email/#send-mass-mail
> --
> Django Brasil em Google Groups
> <http://groups.google.com.br/group/django-brasil>
> Associe-se à Python Brasil e suporte nossa comunidade!
> <http://associacao.python.org.br/>



--
Elyézer Mendes Rezende
http://elyezer.com

rafael feijó

unread,
Apr 27, 2012, 3:26:08 PM4/27/12
to django...@googlegroups.com
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.
Reply all
Reply to author
Forward
0 new messages