Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Automatização de envio de email - Python

Olá a todos, estou desenvolvendo uma aplicação para envio automático de e-mails do setor de cobranças, com base no conteúdo de um livro (Automatize tarefas maçantes com Python). No caso eu alterei um pouco do código devido a minha necessidade e depois de testes com o conteúdo do livro. A ideia é de acessar uma planilha em excel e localizar os clientes com honorários em aberto, salvar em uma biblioteca e após enviar a eles um e-mail comunicando a pendência. O código funciona para localizar os clientes, e até é printado no terminal os mesmos, porém quando ele vai enviar o e-mail o mesmo vai somente para o último cliente da lista.

Segue código:

import openpyxl, smtplib, sys
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText

#Abre a planilha e obtém o status do último pagamento.

wb = openpyxl.load_workbook('C:/temp/cobranca.xlsx')
sheet = wb['Sheet1']

lastCol = sheet.max_column
#latestMonth = sheet.cell(row=1, column=lastCol).value

#Verifica o status de pagamento de cada cliente.

unpaidMembers = {}
for r in range(2, sheet.max_row + 1):
  for c in range(3, lastCol + 1):
    payment = sheet.cell(row=r, column=c).value
    if payment != 'ok':
        cliente = sheet.cell(row=r, column=1).value
        email = sheet.cell(row=r, column=2).value
        mes = sheet.cell(row=1, column=c).value
        unpaidMembers[cliente] = email
        print('Linha:',r,'Coluna:',c,'Cliente:',cliente,'Email:',email,'Mês:',mes)

#Faz login na conta de email.

for cliente, email, in unpaidMembers.items():
    body = "cliente: %s | mes: %s" % (cliente, mes)
    print('sending email to %s...' % (email))

# create message object instance
msg = MIMEMultipart()

# setup the parameters of the message
password = "senha"
msg['From'] = "email@email.com"
msg['To'] = email
msg['Subject'] = "%s - Honorário em aberto." % (cliente)

# add in the message body
msg.attach(MIMEText(body))

# create server
server = smtplib.SMTP('smtp.gmail.com: 587')

server.starttls()

# Login Credentials for sending the mail
server.login(msg['From'], password)

# send the message via the server.
server.sendmail(msg['From'], email, msg.as_string())

server.quit()

print("successfully sent email to %s:" % (email))

Modelo de planilha: https://prnt.sc/11rkrjm

Podem me ajudar?

2 respostas
solução!

Olá, o problema no seu código parece ser a indentação do python, para enviar todos os e-mails a parte de envio precisa estar dentro do loop que você gera o e-mail. No seu caso seu código gera um loop (for) para todas mensagens e não envia nenhuma, quando ele vai para o envio a variável body está com o conteúdo da última interanção do loop, por isso só envia e-mail para o último, a correção seria:

import openpyxl, smtplib, sys
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText

#Abre a planilha e obtém o status do último pagamento.

wb = openpyxl.load_workbook('C:/temp/cobranca.xlsx')
sheet = wb['Sheet1']

lastCol = sheet.max_column
#latestMonth = sheet.cell(row=1, column=lastCol).value

#Verifica o status de pagamento de cada cliente.

unpaidMembers = {}
for r in range(2, sheet.max_row + 1):
  for c in range(3, lastCol + 1):
    payment = sheet.cell(row=r, column=c).value
    if payment != 'ok':
        cliente = sheet.cell(row=r, column=1).value
        email = sheet.cell(row=r, column=2).value
        mes = sheet.cell(row=1, column=c).value
        unpaidMembers[cliente] = email
        print('Linha:',r,'Coluna:',c,'Cliente:',cliente,'Email:',email,'Mês:',mes)

#Faz login na conta de email.

for cliente, email, in unpaidMembers.items():
    body = "cliente: %s | mes: %s" % (cliente, mes)
    print('sending email to %s...' % (email))

    # create message object instance
    msg = MIMEMultipart()

    # setup the parameters of the message
    password = "senha"
    msg['From'] = "email@email.com"
    msg['To'] = email
    msg['Subject'] = "%s - Honorário em aberto." % (cliente)

    # add in the message body
    msg.attach(MIMEText(body))

    # create server
    server = smtplib.SMTP('smtp.gmail.com: 587')

    server.starttls()

    # Login Credentials for sending the mail
    server.login(msg['From'], password)

    # send the message via the server.
    server.sendmail(msg['From'], email, msg.as_string())

server.quit()

print("successfully sent email to %s:" % (email))

Os trechos entre create server e login me parece que podem ser colocados fora do loop, pq em teoria você só precisa logar uma vez para enviar várias mensagens, em todo caso o código deve funcionar mesmo assim (só não estará totalmente eficiente).

Abs

Bruno, olá.

Muito obrigado, consegui realizar o procedimento e entender o que estava acontecendo.

Abs.