Skip to content

Instantly share code, notes, and snippets.

@nosrednawall
Last active July 14, 2022 16:53
Show Gist options
  • Save nosrednawall/61e7e0dd54de1a1c861b379b27c7dfed to your computer and use it in GitHub Desktop.
Save nosrednawall/61e7e0dd54de1a1c861b379b27c7dfed to your computer and use it in GitHub Desktop.
Monta Estrutura MIME email
def monta_estrutura_email(subject, email_from, email_to, msg_html, msg_plain, lista_anexos):
message = MIMEMultipart("mixed")
message["Subject"] = subject
message["From"] = email_from
message["To"] = email_to
related_body = MIMEMultipart("related")
if len(lista_anexos) > abs(0):
for part in lista_anexos:
related_body.attach(part)
message_body = MIMEMultipart("alternative")
part1 = MIMEText(msg_plain, _subtype='plain', _charset='utf-8')
part2 = MIMEText(msg_html, _subtype='html', _charset='utf-8')
message_body.attach(part1)
message_body.attach(part2)
message.attach(message_body)
message.attach(related_body)
return message
def monta_anexo_pdf(pdfname, caminho):
logger = Log.get_logger() # Busca a instancia do logger
try:
with open(caminho, 'rb') as fp:
anexo_pdf = MIMEBase("application", "pdf", Name=pdfname)
anexo_pdf.set_payload(fp.read())
encoders.encode_base64(anexo_pdf)
anexo_pdf.add_header(
"Content-Disposition",
f"attachment; filename= {pdfname}",
)
except Exception as e:
logger.error(f'Ocorreu um erro ao carregar o anexo Anexos/201911-001 Aos Fornecedores - '
f'Documento Fiscal eletrônico - rv01.pdf, erro:{e}')
anexo_pdf = False
return anexo_pdf
def monta_anexo_imagem(caminho, nome_imagem):
logger = Log.get_logger() # Busca a instancia do logger
try:
with open(caminho, 'rb') as fp:
anexo_imagem = MIMEBase("application", "octet-stream")
anexo_imagem.set_payload(fp.read())
encoders.encode_base64(anexo_imagem)
anexo_imagem.add_header(
"Content-Disposition",
f"attachment; filename= {nome_imagem}",
)
except Exception as e:
logger.error(f'Ocorreu um erro ao carregar arquivo Anexos/exemploXML.jpg, erro {e}')
anexo_imagem = False
return anexo_imagem
def monta_anexo_xml(arquivo_xml, xmlname):
xml_encode = arquivo_xml.encode('utf-8')
anexo_xml = MIMEBase("application", "octet-stream")
anexo_xml.set_payload(xml_encode)
encoders.encode_base64(anexo_xml)
anexo_xml.add_header(
"Content-Disposition",
f"attachment; filename= {xmlname}",
)
return anexo_xml
def envia_email_recusa(lista_erros, arquivo_xml, informacoes, destinatario):
# logger = Log.get_logger() # instancia o logger
# busca as credenciais do servidor
credenciais = busca_credenciais_email()
# busca uma lista de destinatios
destinatarios = busca_destinatarios()
# adiciona o email do fornecedor a lista
destinatarios.append(destinatario)
# cria uma string de destinatarios
string_destinatarios = ''
for dest in destinatarios:
if string_destinatarios == '':
string_destinatarios = dest
else:
string_destinatarios = string_destinatarios + ',' + dest
# monta os corpos da mensagem
corpos_mensagem = monta_mensagem_html()
lista_anexos = []
anexo_pdf = monta_anexo_pdf(
caminho=r'Anexos/arquivo_pdf.pdf',
pdfname=r'arquivo_pdf.pdf')
if anexo_pdf:
lista_anexos.append(anexo_pdf)
anexo_imagem = monta_anexo_imagem(
caminho=r'Anexos/exemploXML.jpg',
nome_imagem=r'exemploXML.jpg')
if anexo_imagem:
lista_anexos.append(anexo_imagem)
# adiciona os anexos carregados a mensagem
anexo_xml = monta_anexo_xml(arquivo_xml=arquivo_xml.get('xml'),
xmlname=arquivo_xml.get('filename'))
lista_anexos.append(anexo_xml)
message = monta_estrutura_email(
subject="Email ral),
email_from=credenciais,
email_to=string_destinatarios,
msg_html=corpos_mensagem.get('HTML'),
msg_plain=corpos_mensagem.get('PLAIN'),
lista_anexos=lista_anexos
)
# cria uma conexao com o servidor e envia mensagem
with smtplib.SMTP(credenciais.get('SERVIDOR'), 587) as server:
# Login com servidor
server.ehlo()
server.starttls()
server.login(credenciais.get('USUARIO'), credenciais.get('SENHA'))
print('Enviando mensagem...')
server.sendmail(credenciais.get('USUARIO'),
destinatarios,
message.as_string())
print('Mensagem enviada!')
server.quit()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment