segunda-feira, 30 de abril de 2012

Solução para Envio Massivo de Email

As soluções para envio massivo de email são sempre restritas por causa do Spam. Porém algumas empresas possuem List Mail com um número grande de emails e precisam fazer alguma comunicação de marketing. O pessoal do Python Brasil ofereceu algumas soluções:

Celery

Send Mass Mail

Algumas vezes o servidor avisa que está sendo enviado um grande número de email e trata de encerrar a conexão. A solução do Rafael Feijó é um programa em Django Python que faz um loop enviando um email por  vez, e a cada tentativa faz uma verificação se não ocorreu falha na conexão.


  1. from django.db.models import Q
  2. from django.utils import uuid
  3. from django.core.mail import send_mail, EmailMessage, BadHeaderError, EmailMultiAlternatives
  4. from django.utils.html import strip_tags
  5. from common.dlog import LOG
  6. from common.lockfile import FileLock, AlreadyLocked, LockTimeout
  7. from socket import error as socket_error
  8. from datetime import datetime
  9. import time
  10. import smtplib
  11. import base64
  12. import sys
  13. import os
  14. try:
  15.     from django.core.validators import email_re
  16. except:
  17.     from django.forms.fields import email_re
  18. try:
  19.     from django.core.mail import get_connection
  20. except ImportError:
  21.     from django.core.mail import SMTPConnection
  22.     get_connection = lambda backend=None, fail_silently=False, **kwds: SMTPConnection(fail_silently=fail_silently)
  23. # lock timeout value. how long to wait for the lock to become available.
  24. # default behavior is to never wait for the lock to be available.
  25. LOCK_WAIT_TIMEOUT = getattr(web.settings, "MAILER_LOCK_WAIT_TIMEOUT", -1)
  26. # The actual backend to use for sending, defaulting to the Django default.
  27. EMAIL_BACKEND = getattr(web.settings, "EMAIL_BACKEND", "django.core.mail.backends.smtp.EmailBackend")
  28.         connection = None
  29.         ## emails é a lista de nome, email, id
  30.         for message in emails:
  31.             try:
  32.                 if connection is None:
  33.                     connection = get_connection(backend=EMAIL_BACKEND, **params)
  34.                 LOG.info("sending message '%s' to %s" % (message['nome'], message['email']) )
  35.                 email = message['email']
  36.                 html  = t.corpo_html
  37.                 text  = strip_tags(html)
  38.                 email_final = EmailMultiAlternatives(t.nome, text, params['username'], [email])
  39.                 email_final.attach_alternative(html, "text/html")
  40.                 r = connection.send_messages([email_final])
  41.             except (socket_error, smtplib.SMTPSenderRefused, smtplib.SMTPRecipientsRefused,smtplib.SMTPAuthenticationError), err:
  42.                 LOG.info("message deferred due to failure: %s" % err)
  43.                 connection = None


Não testei este programa mas já tive este problema em tempos anteriores, então já deixo disponível aqui no blog como kit de ferramentas.

Nenhum comentário:

Postar um comentário