2009-10-09 9 views
68

J'ai besoin à des fins de test de remplir quelques centaines de boîtes e-mail avec divers messages, et allait utiliser smtplib pour cela. Mais entre autres choses, je dois être capable d'envoyer des messages non seulement à des boîtes aux lettres spécifiques, mais CC et BCC eux aussi. Il ne semble pas que smtplib prend en charge CC-ing et BCC-ing lors de l'envoi de courriels.python: comment envoyer du courrier avec TO, CC et BCC?

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

(Et - non, je ne suis pas la création d'un script à tout le monde de spam en dehors de mon environnement de test.)

Répondre

106

têtes Email n » Peu importe le serveur SMTP. Ajoutez simplement les destinataires CC et BCC aux toaddrs lorsque vous envoyez votre email. Pour CC, ajoutez-les à l'en-tête CC.

toaddr = '[email protected]' 
cc = ['[email protected]','[email protected]'] 
bcc = ['[email protected]'] 
fromaddr = '[email protected]' 
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

smtplib.SMTP n'envoie pas de listes d'adresses. Au moins pas sur python 2.7.2 – LostMohican

+0

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

+1

@ABentSpoon un deux-points est manquant après 'Sujet'. – user891260

15

La distinction entre TO, CC et BCC ne se produit que dans les en-têtes de texte. Au niveau SMTP, tout le monde est un destinataire.

TO - Il y a une tête TO: avec l'adresse

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

BCC - Ce destinataire ne figure pas dans les en-têtes du tout, mais est toujours un destinataire.

Si vous avez

TO: [email protected] 
CC: [email protected] 
BCC: [email protected] 

Vous avez trois destinataires. Les en-têtes dans le corps de courrier électronique comprendront que le TO: et CC:

10

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

Voir ceci: http://mail.python.org/pipermail/email-sig/2004-September/000151.html

Et ceci: « » "Notez que le deuxième argument à sendmail(), les destinataires, est passé comme une liste Vous pouvez inclure un certain nombre d'adresses dans la liste pour avoir. message délivré à chacun d'eux à son tour. Étant donné que les informations d'enveloppe est séparée des en-têtes de message, vous pouvez même quelqu'un BCC en les incluant dans l'argument de la méthode mais pas dans l'en-tête du message. « » » de http://pymotw.com/2/smtplib

toaddr = '[email protected]' 
cc = ['[email protected]','[email protected]'] 
bcc = ['[email protected]'] 
fromaddr = '[email protected]' 
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

Bravo pour le flair: D – Chris

10

Le point clé est d'ajouter les destinataires en tant que liste des ID email dans votre appel sendmail.

import smtplib 
from email.mime.multipart import MIMEMultipart 

me = "[email protected]" 
to = "[email protected]" 
cc = "[email protected],[email protected]" 
bcc = "[email protected],[email protected]" 

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

Le champ Cci a également été demandé dans cette question. –

+1

Vous pouvez également ajouter bcc de la même manière. J'ai mis à jour l'extrait. – helios

+0

Laissez le 'msg ['BCC']' off - il révèle votre expéditeur caché et n'a aucun impact sur le fait que le message leur soit envoyé ou non (les arguments de 'sendmail' font cela). –

1

Il n'a pas fonctionné pour moi jusqu'à ce que je créé:

#created cc string 
cc = ""[email protected]; 
#added cc to header 
msg['Cc'] = cc 

et que ajouté cc dans les pays bénéficiaires [liste] comme:

s.sendmail(me, [you,cc], msg.as_string()) 
Questions connexes