A partir de Python 3.2, lanzado en noviembre de 2011, smtplib tiene una nueva función en send_message
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 pequeñas 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()
El uso de 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 msg
Con sendmail
era común agregar los encabezados CC al mensaje, haciendo algo como:
msg['Bcc'] = blind.email@adrress.com
O
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"
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 de To: 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 cambio, solo en la lista de correos electrónicos pasados sendmail
.
La advertencia es que send_message
requiere un objeto Message, lo que significa que deberá importar una clase desde en email.message
lugar de simplemente pasar cadenas a sendmail
.