129 votes

python : comment envoyer un mail avec TO, CC et BCC ?

J'ai besoin, à des fins de test, de remplir quelques centaines de boîtes aux lettres électroniques avec divers messages, et j'allais utiliser smtplib pour cela. Mais j'ai besoin, entre autres, de pouvoir envoyer des messages non seulement à des boîtes aux lettres spécifiques, mais aussi de les CC et BCC. Il ne semble pas que smtplib permet d'envoyer des CC et des BCC lors de l'envoi de courriels.

Je cherche des suggestions sur la façon d'envoyer des messages CC ou BCC à partir du script python script.

(Et - non, je ne suis pas en train de créer un script pour spammer quiconque en dehors de mon environnement de test).

173voto

ABentSpoon Points 2379

Les en-têtes de courriel n'ont pas d'importance pour le serveur smtp. Il suffit d'ajouter les destinataires CC et BCC aux toaddrs lorsque vous envoyez votre courriel. Pour CC, ajoutez-les à l'en-tête CC.

toaddr = 'buffy@sunnydale.k12.ca.us'
cc = ['alexander@sunydale.k12.ca.us','willow@sunnydale.k12.ca.us']
bcc = ['chairman@slayerscouncil.uk']
fromaddr = 'giles@sunnydale.k12.ca.us'
message_subject = "disturbance in sector 7"
message_text = "Three are dead in an attack in the sewers below sector 7."
message = "From: %s\r\n" % fromaddr
        + "To: %s\r\n" % toaddr
        + "CC: %s\r\n" % ",".join(cc)
        + "Subject: %s\r\n" % message_subject
        + "\r\n" 
        + message_text
toaddrs = [toaddr] + cc + bcc
server = smtplib.SMTP('smtp.sunnydale.k12.ca.us')
server.set_debuglevel(1)
server.sendmail(fromaddr, toaddrs, message)
server.quit()

0 votes

Smtplib.SMTP n'envoie pas de listes d'adresses. Du moins pas sur python 2.7.2

0 votes

Dans ce cas, l'en-tête BCC mentionné dans la RFC 2822 n'a aucun sens.

1 votes

@ABentSpoon il manque un deux-points après 'Sujet'.

55voto

helios Points 589

L'essentiel est d'ajouter les destinataires en tant que liste d'ids d'email dans votre appel à sendmail.

import smtplib
from email.mime.multipart import MIMEMultipart

me = "user63503@gmail.com"
to = "someone@gmail.com"
cc = "anotherperson@gmail.com,someone@yahoo.com"
bcc = "bccperson1@gmail.com,bccperson2@yahoo.com"

rcpt = cc.split(",") + bcc.split(",") + [to]
msg = MIMEMultipart('alternative')
msg['Subject'] = "my subject"
msg['To'] = to
msg['Cc'] = cc
msg.attach(my_msg_body)
server = smtplib.SMTP("localhost") # or your smtp server
server.sendmail(me, rcpt, msg.as_string())
server.quit()

5 votes

Laissez le msg['BCC'] désactivé - il révèle votre expéditeur caché et n'a aucun impact sur l'envoi ou non du message (les arguments de l'option sendmail faire cela).

2 votes

Je suis d'accord avec Erica et Julio. L'intention de Bcc est de cacher le récepteur aux autres récepteurs. Si c'est dans le message, cela va à l'encontre du but recherché.

0 votes

C'est vraiment un excellent conseil ! Merci ! !!

37voto

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 .

2 votes

Je viens de vérifier que send_message(msg) gère les cc ajoutés à l'EmailMessage - msg['Cc'] Si vous utilisez Python 3, c'est la solution.

0 votes

@bmiller Oui, très pratique. J'ai écrit cette réponse parce que je me suis penché sur la question et que j'ai trouvé la méthode la plus simple dans la documentation et dans d'autres références. Cela a bien fonctionné pour moi et j'ai pensé que cela méritait une place ici puisque de nombreuses personnes regarderont ici en premier.

0 votes

Non seulement je trouve cette solution plus élégante mais elle fonctionne parfaitement. Elle résout également un problème que j'avais avec la réponse de @ABentSpoon, à savoir que pour les adresses gmail en CC, les emails n'allaient pas dans la boîte de réception mais dans "All Mail".

21voto

Leonardo Andrade Points 2118

N'ajoutez pas l'en-tête bcc.

Regardez ça : http://mail.python.org/pipermail/email-sig/2004-September/000151.html

Et ceci : "Remarquez que le deuxième argument de sendmail(), les destinataires, est transmis sous forme de liste. Vous pouvez inclure n'importe quel nombre d'adresses dans la liste pour que le message soit remis à chacune d'entre elles à tour de rôle. Puisque les informations de l'enveloppe sont séparées des en-têtes du message, vous pouvez même envoyer un accusé de réception à quelqu'un en l'incluant dans l'argument de la méthode mais pas dans l'en-tête du message.""" from http://pymotw.com/2/smtplib

toaddr = 'buffy@sunnydale.k12.ca.us'
cc = ['alexander@sunydale.k12.ca.us','willow@sunnydale.k12.ca.us']
bcc = ['chairman@slayerscouncil.uk']
fromaddr = 'giles@sunnydale.k12.ca.us'
message_subject = "disturbance in sector 7"
message_text = "Three are dead in an attack in the sewers below sector 7."
message = "From: %s\r\n" % fromaddr
    + "To: %s\r\n" % toaddr
    + "CC: %s\r\n" % ",".join(cc)
    # don't add this, otherwise "to and cc" receivers will know who are the bcc receivers
    # + "BCC: %s\r\n" % ",".join(bcc)
    + "Subject: %s\r\n" % message_subject
    + "\r\n" 
    + message_text
toaddrs = [toaddr] + cc + bcc
server = smtplib.SMTP('smtp.sunnydale.k12.ca.us')
server.set_debuglevel(1)
server.sendmail(fromaddr, toaddrs, message)
server.quit()

0 votes

Un coup de pouce pour le flair :D

0 votes

Cela fonctionne comme un charme, Kudos.

20voto

Jim Garrison Points 39523

La distinction entre TO, CC et BCC n'apparaît que dans les en-têtes de texte. Au niveau du SMTP, tout le monde est un destinataire.

TO - Il y a un en-tête TO : avec l'adresse de ce destinataire.

CC - Il y a un en-tête CC : avec l'adresse de ce destinataire.

BCC - Ce destinataire n'est pas du tout mentionné dans les en-têtes, mais il est quand même un destinataire.

Si vous avez

TO: abc@company.com
CC: xyz@company.com
BCC: boss@company.com

Vous avez trois destinataires. Les en-têtes du corps de l'e-mail ne comprendront que les mentions TO : et CC :

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X