A partire da Python 3.2, rilasciato a novembre 2011, smtplib ha una nuova funzione send_message
anziché solo sendmail
, il che rende più facile trattare con To / CC / BCC. Prendendo gli esempi di posta elettronica ufficiali di Python , con alcune lievi modifiche, otteniamo:
# 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()
L'utilizzo delle intestazioni funziona bene, perché send_message rispetta BCC come descritto nella documentazione :
send_message non trasmette alcuna intestazione Bcc o Resent-Bcc che potrebbe apparire in msg
Con sendmail
era comune aggiungere le intestazioni CC al messaggio, facendo qualcosa come:
msg['Bcc'] = blind.email@adrress.com
O
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"
Il problema è che la funzione sendmail tratta tutte quelle intestazioni allo stesso modo, il che significa che verranno inviate (visibilmente) a tutti gli utenti A: e BCC:, vanificando gli scopi di BCC. La soluzione, come mostrato in molte altre risposte qui, era di non includere BCC nelle intestazioni, e invece solo nell'elenco delle email passate a sendmail
.
L'avvertenza è che send_message
richiede un oggetto Message, il che significa che dovrai importare una classe da email.message
invece di passare semplicemente stringhe in sendmail
.