A partir do Python 3.2, lançado em novembro de 2011, o smtplib tem uma nova função em send_message
vez de apenas sendmail
, o que torna mais fácil lidar com To / CC / BCC. Pegando os exemplos de e-mail oficial do Python , com algumas pequenas modificações, obtemos:
# Import smtplib for the actual sending function
import smtplib
# Import the email modules we'll need
from email.message import EmailMessage
# Open the plain text file whose name is in textfile for reading.
with open(textfile) as fp:
# Create a text/plain message
msg = EmailMessage()
msg.set_content(fp.read())
# me == the sender's email address
# you == the recipient's email address
# them == the cc's email address
# they == the bcc's email address
msg['Subject'] = 'The contents of %s' % textfile
msg['From'] = me
msg['To'] = you
msg['Cc'] = them
msg['Bcc'] = they
# Send the message via our own SMTP server.
s = smtplib.SMTP('localhost')
s.send_message(msg)
s.quit()
Usar os cabeçalhos funciona bem, porque send_message respeita BCC conforme descrito na documentação :
send_message não transmite quaisquer cabeçalhos Bcc ou Resent-Bcc que possam aparecer na msg
Com sendmail
isso era comum adicionar cabeçalhos CC à mensagem, fazendo algo como:
msg['Bcc'] = blind.email@adrress.com
Ou
msg = "From: from.email@address.com" +
"To: to.email@adress.com" +
"BCC: hidden.email@address.com" +
"Subject: You've got mail!" +
"This is the message body"
O problema é que a função sendmail trata todos os cabeçalhos da mesma forma, o que significa que eles serão enviados (visivelmente) para todos os usuários Para: e BCC: frustrando os propósitos do BCC. A solução, conforme mostrado em muitas das outras respostas aqui, foi não incluir BCC nos cabeçalhos e, em vez disso, apenas na lista de e-mails passados parasendmail
.
A ressalva é que send_message
requer um objeto Message, o que significa que você precisará importar uma classe de em email.message
vez de apenas passar strings para sendmail
.