Saltar al contenido

python: ¿cómo enviar correo con TO, CC y BCC?

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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *