Skip to content

Instantly share code, notes, and snippets.

@philippeoz
Created September 14, 2017 19:40
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save philippeoz/6dae53d9b3fb2448bdb5efc8edfdc339 to your computer and use it in GitHub Desktop.
Save philippeoz/6dae53d9b3fb2448bdb5efc8edfdc339 to your computer and use it in GitHub Desktop.
Mail Task Celery
@app.task
def enviar_boletos_por_email(user_id, titulos_id, session, reenvio):
user = Usuario.objects.get(id=user_id)
empresa = user.empresa
titulos = Boleto.objects.using(user.banco).filter(
conta_receber__id__in=titulos_id,
)
if not reenvio:
titulos = titulos.filter(
email_enviado=False
)
titulos_count = titulos.count()
if empresa.login_smtp is not None and empresa.login_smtp != '':
email_login = empresa.login_smtp
else:
email_login = empresa.email_boleto
email_sender = empresa.email_boleto
senha_email = empresa.senha_email
smtp_server = empresa.smtp_serv
smtp_port = empresa.smtp_port
ssl_emp = empresa.ssl
tls_emp = empresa.tls
connection = get_connection(
host=smtp_server,
port=smtp_port,
username=email_login,
password=senha_email,
use_tls=tls_emp,
use_ssl=ssl_emp
)
try:
conn = connection.open()
if conn is False:
raise Exception
except Exception as err:
print(err)
Mensage(session, 'envio_boletos_email', {
'erro': 'Erro ao conectar com o servidor de email.'
}).send()
return
try:
Mensage(session, 'envio_boletos_email', {'logg':
'Realizando login...'
}).send()
for count, titulo in enumerate(titulos):
count += 1
enviado = False
while not enviado:
Mensage(session, 'envio_boletos_email', {
'logg': 'Enviando boleto {} de {}...'.format(count, titulos_count)
}).send()
try:
cliente_nome = titulo.conta_receber.conta.cliente.nome
cliente_nome = format_string_remessa(cliente_nome)
cliente_email = titulo.conta_receber.conta.cliente.email
if cliente_email is None or cliente_email == '':
enviado = True
continue
msg_file = MIMEBase('application', 'pdf')
msg_file.set_payload(titulo.get_pdf_buffer(user))
encoders.encode_base64(msg_file)
msg_file.add_header('Content-Disposition', 'attachment', filename='%s' % (
cliente_nome.split(' ')[0] + '-' +
cliente_nome.split(' ')[len(cliente_nome.split(' ')) - 1] +
'-BOLETO-%s.pdf' % (
date.today().strftime('%Y%m%d'),
),
))
message = EmailMessage(
connection=connection,
subject=empresa.email_assunto,
body=empresa.email_msg,
from_email=email_sender,
to=[cliente_email.lower()],
attachments=[msg_file]
).send(fail_silently=False)
enviado = True
titulo.email_enviado = enviado
titulo.save()
time.sleep(2)
except smtplib.SMTPServerDisconnected as err:
print("{} - {}".format(str(err), str(type(err))))
Mensage(session, 'envio_boletos_email', {
'logg': 'Desconectado do servidor, restabelecendo conexão...'
}).send()
connection.close()
connection.open()
except smtplib.SMTPSenderRefused as err:
print("{} - {}".format(str(err), str(type(err))))
Mensage(session, 'envio_boletos_email', {
'logg': 'Desconectado do servidor, restabelecendo conexão...'
}).send()
connection.close()
connection.open()
except smtplib.SMTPDataError as err:
print("{} - {}".format(str(err), str(type(err))))
if 'quota exceeded' not in str(err) and 'atingiu o limite diario' not in str(err):
Mensage(session, 'envio_boletos_email', {
'erro': 'Erro ao enviar emails...'
}).send()
else:
Mensage(session, 'envio_boletos_email', {
'erro': 'Limite diário para envio de emails excedido.'
}).send()
connection.close()
return
except Exception as err:
print("{} - {}".format(str(err), str(type(err))))
Mensage(session, 'envio_boletos_email', {
'erro': 'Erro ao enviar boleto {} (Parcela: {} - Cliente: {})...'.format(
count,
titulo.conta_receber.id,
cliente_nome
)
}).send()
connection.close()
enviado = True
Mensage(session, 'envio_boletos_email', {'end':
'Boletos enviados.'
}).send()
except Exception as err:
print("{} - {}".format(str(err), str(type(err))))
Mensage(session, 'envio_boletos_email', {'erro':
'Erro ao realizar login.'
}).send()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment