Depois de muita pesquisa, não consegui descobrir como usar o smtplib.sendmail para enviar para vários destinatários. O problema era que, sempre que o email era enviado, os cabeçalhos pareciam conter vários endereços, mas na verdade apenas o primeiro destinatário recebia o email.
O problema parece ser que o email.Message
módulo espera algo diferente da smtplib.sendmail()
função.
Em resumo, para enviar para vários destinatários, você deve definir o cabeçalho como uma sequência de endereços de email delimitados por vírgula. O sendmail()
parâmetro, to_addrs
no entanto, deve ser uma lista de endereços de email.
from email.MIMEMultipart import MIMEMultipart
from email.MIMEText import MIMEText
import smtplib
msg = MIMEMultipart()
msg["Subject"] = "Example"
msg["From"] = "[email protected]"
msg["To"] = "[email protected],[email protected],[email protected]"
msg["Cc"] = "[email protected],[email protected]"
body = MIMEText("example email body")
msg.attach(body)
smtp = smtplib.SMTP("mailhost.example.com", 25)
smtp.sendmail(msg["From"], msg["To"].split(",") + msg["Cc"].split(","), msg.as_string())
smtp.quit()
sendmail
precisa de uma lista.for addr in recipients: msg['To'] = addr
e então funcionou. Na verdade, várias atribuições acrescentam um novo cabeçalho 'Para' a cada uma. Essa é uma interface muito bizarra, eu nem consigo explicar como pensei em experimentar. Eu estava pensando em usarsubprocess
osendmail
pacote unix para salvar minha sanidade antes de descobrir isso.Respostas:
Isso realmente funciona , passei muito tempo tentando várias variantes.
fonte
tolist =["[email protected]","[email protected]","[email protected]","[email protected]"]
send_message
vez de usarsendmail
o comentário de Antoine abaixo e os documentos do Python docs.python.org/3/library/email-examples.htmlA
msg['To']
precisa ser uma string:Enquanto o
recipients
insendmail(sender, recipients, message)
precisa ser uma lista:fonte
smtplib.
recipients
não precisa ser uma lista - se uma string for fornecida, ela será tratada como uma lista com um elemento. Amsg['To']
string pode ser simplesmente omitida.Você precisa entender a diferença entre o endereço visível de um email e a entrega .
msg["To"]
é essencialmente o que está impresso na carta. Na verdade, não tem nenhum efeito. Exceto que o seu cliente de email, assim como o oficial de correios, presumirá que é para quem você deseja enviar o email.A entrega real, no entanto, pode funcionar bem diferente. Então você pode soltar o email (ou uma cópia) na caixa postal de alguém completamente diferente.
Há várias razões para isto. Por exemplo encaminhamento . o
To:
campo do cabeçalho não muda no encaminhamento, no entanto, o email é descartado em uma caixa de correio diferente.O
smtp.sendmail
comando agora cuida da entrega real .email.Message
é apenas o conteúdo da carta, não a entrega.Em nível baixo
SMTP
, você precisa fornecer aos destinatários um por um, e é por isso que uma lista de endereços (sem incluir nomes!) É a API sensata.Para o cabeçalho, ele também pode conter, por exemplo, o nome, por exemplo
To: First Last <[email protected]>, Other User <[email protected]>
. Portanto, seu exemplo de código não é recomendado , pois ele falhará ao entregar este email, pois, ao dividi-lo,,
você ainda não possui os endereços válidos!fonte
Funciona para mim.
fonte
recipients = ['[email protected]','[email protected]']
vez de torná-lo uma string e depois dividi-lo para fazer uma lista?Eu tentei o abaixo e funcionou como um encanto :)
fonte
import smtplib from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText sender = '[email protected]' rec_list = ['[email protected]', '[email protected]'] rec = ', '.join(rec_list) msg = MIMEMultipart('alternative') msg['Subject'] = 'The required subject' msg['From'] = sender msg['To'] = rec html = ('whatever html code') htm_part = MIMEText(html, 'html') msg.attach(htm_part) send_out = smtplib.SMTP('localhost') send_out.sendmail(sender, rec_list, msg.as_string()) send_out.quit()
Na verdade, o problema é que SMTP.sendmail e email.MIMEText precisam de duas coisas diferentes.
email.MIMEText configura o cabeçalho "Para:" para o corpo do email. É usado SOMENTE para exibir um resultado ao ser humano na outra extremidade e, como todos os cabeçalhos de email, deve ser uma única sequência. (Observe que ele realmente não tem nada a ver com as pessoas que realmente recebem a mensagem.)
SMTP.sendmail, por outro lado, configura o "envelope" da mensagem para o protocolo SMTP. Ele precisa de uma lista de strings Python, cada uma com um único endereço.
Então, o que você precisa fazer é COMBINAR as duas respostas que você recebeu. Defina msg ['To'] como uma única string, mas passe a lista bruta para sendmail:
fonte
Eu vim com esta função de módulo importável. Ele usa o servidor de email do gmail neste exemplo. É dividido em cabeçalho e mensagem para que você possa ver claramente o que está acontecendo:
fonte
Eu descobri isso alguns meses atrás e escrevi sobre isso . O resumo é:
Se você deseja usar o smtplib para enviar email para vários destinatários, use-os
email.Message.add_header('To', eachRecipientAsString)
para adicioná-los e, quando você chamar o método sendmail,use email.Message.get_all('To')
envie a mensagem para todos eles. O mesmo vale para os destinatários Cc e Cco.fonte
A solução abaixo funcionou para mim. Ele envia com êxito um email para vários destinatários, incluindo "CC" e "BCC".
fonte
Bem, o método neste método asnwer não funcionou para mim. Não sei, talvez esse seja um problema relacionado ao Python3 (estou usando a versão 3.4) ou ao gmail, mas depois de algumas tentativas, a solução que funcionou para mim foi a linha
ao invés de
fonte
Eu uso o python 3.6 e o código a seguir funciona para mim
fonte
Ele só funcionou para mim com a função send_message e usando a função join na lista de destinatários, python 3.6.
fonte
você pode tentar isso ao escrever os e-mails dos destinatários em um arquivo de texto
fonte