2009-10-09 29 views
68

Necesito pruebas para llenar unos cientos de buzones de correo electrónico con varios mensajes, y voy a usar smtplib para eso. Pero, entre otras cosas, debo poder enviar mensajes no solo a buzones específicos, sino también a CC y BCC. No parece que smtplib admita CC-ing y BCC-ing mientras envía correos electrónicos.python: cómo enviar correo con TO, CC y BCC?

Buscando sugerencias sobre cómo hacer CC o BCC enviando mensajes desde el script python.

(Y - no, no estoy creando un script de spam nadie fuera de mi entorno de pruebas.)

Respuesta

106

encabezados de correo electrónico Don' Importa al servidor smtp. Simplemente agregue los destinatarios CC y BCC a los destinatarios cuando envíe su correo electrónico. Para CC, agréguelos al encabezado 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 no envía listas de direcciones. Al menos no en Python 2.7.2 – LostMohican

+0

En este caso, el encabezado BCC mencionado en el RFC 2822 no tiene ningún sentido. –

+1

@ABentSpoon falta un coma después de 'Asunto'. – user891260

15

La distinción entre A, CC y BCC se produce sólo en las cabeceras de texto. En el nivel SMTP, todos son destinatarios.

A - No es un TO: cabecera con la dirección de este destinatario

CC - Hay una CC: cabecera con la dirección de este destinatario

BCC - Este receptor no se menciona en las cabeceras en absoluto, pero sigue siendo un destinatario.

Si tiene

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

tiene tres destinatarios. Los encabezados en el cuerpo del correo electrónico incluirán sólo el A: y CC:

10

No agregue el encabezado bcc.

ver esto: http://mail.python.org/pipermail/email-sig/2004-September/000151.html

Y esto: "" "Tenga en cuenta que el segundo argumento a Sendmail(), los destinatarios, se pasa como una lista Puede incluir cualquier número de direcciones de la lista para tener el. mensaje entregado a cada uno de ellos a su vez. Dado que la información sobre está separada de las cabeceras de los mensajes, incluso se puede BCC alguien mediante su inclusión en el argumento de un método, pero no en el encabezado del mensaje. """ 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

Thumbs up for flair: D – Chris

10

Lo más importante es agregar los destinatarios como una lista de id. De correo electrónico en su llamada a 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

El campo bcc también se solicitó en esta pregunta. –

+1

También puede agregar bcc de forma similar. He actualizado el fragmento. – helios

+0

Deje el 'msg ['BCC']' apagado - revela su remitente oculto y no tiene ningún impacto sobre si el mensaje se les envía o no (los argumentos para 'sendmail' hacen eso). –

1

No trabajó para mí hasta que he creado:

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

y de cc añadido en receptor [lista] como:

s.sendmail(me, [you,cc], msg.as_string()) 
Cuestiones relacionadas