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.
- 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
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