Depuis Python 3.2, publié en novembre 2011, la bibliothèque smtplib dispose d'une nouvelle fonction send_message
au lieu de seulement sendmail
ce qui facilite l'utilisation de To/CC/BCC. L'extraction de la Exemples d'e-mails officiels en Python avec quelques légères modifications, on obtient :
# 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'utilisation des en-têtes fonctionne bien, car send_message respecte BCC comme indiqué dans la documentation :
send_message ne transmet pas les en-têtes Bcc ou Resent-Bcc qui peuvent apparaître dans msg
Avec sendmail
il était courant d'ajouter les en-têtes CC au message, en faisant quelque chose comme :
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"
Le problème est que la fonction sendmail traite tous ces en-têtes de la même manière, ce qui signifie qu'ils seront envoyés (de manière visible) à tous les utilisateurs de To : et BCC :, ce qui va à l'encontre des objectifs de BCC. La solution, comme indiqué dans beaucoup d'autres réponses ici, était de ne pas inclure BCC dans les en-têtes, et à la place seulement dans la liste des emails passés à sendmail
.
La mise en garde est la suivante send_message
nécessite un objet Message, ce qui signifie que vous devrez importer une classe de email.message
au lieu de simplement passer des chaînes de caractères dans sendmail
.