Después de indagar en diversos repositorios y páginas webs de internet al concluir descubrimos la solución que te mostramos más adelante.
Solución:
Los encabezados de correo electrónico no le importan al servidor smtp. Simplemente agregue los destinatarios CC y BCC a toaddrs 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: %srn" % fromaddr
+ "To: %srn" % toaddr
+ "CC: %srn" % ",".join(cc)
+ "Subject: %srn" % message_subject
+ "rn"
+ 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()
La clave es agregar los destinatarios como un lista de ID de correo electrónico en su llamada 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.attach(my_msg_body)
server = smtplib.SMTP("localhost") # or your smtp server
server.sendmail(me, rcpt, msg.as_string())
server.quit()
A partir de Python 3.2, lanzado en noviembre de 2011, smtplib tiene una nueva función send_message
en lugar de solo sendmail
, lo que facilita el manejo de To/CC/BCC. Extrayendo de los ejemplos de correo electrónico oficiales de Python, con algunas ligeras modificaciones, obtenemos:
# 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()
Usar los encabezados funciona bien, porque send_message respeta BCC como se describe en la documentación:
send_message no transmite ningún encabezado Bcc o Resent-Bcc que pueda aparecer en el mensaje
Con sendmail
era común agregar los encabezados CC al mensaje, haciendo algo como:
msg['Bcc'] = [email protected]
O
msg = "From: [email protected]" +
"To: [email protected]" +
"BCC: [email protected]" +
"Subject: You've got mail!" +
"This is the message body"
El problema es que la función sendmail trata todos esos encabezados de la misma manera, lo que significa que se enviarán (visiblemente) a todos los usuarios Para: y BCC:, anulando los propósitos de BCC. La solución, como se muestra en muchas de las otras respuestas aquí, fue no incluir BCC en los encabezados, y en su lugar solo en la lista de correos electrónicos enviados a sendmail
.
La advertencia es que send_message
requiere un objeto de mensaje, lo que significa que deberá importar una clase de email.message
en lugar de simplemente pasar cadenas a sendmail
.
Recuerda que tienes autorización de esclarecer si diste con el resultado.