Cómo enviar un correo a varios destinatarios usando python smtplib?

Después de mucho buscar no pude averiguar cómo utilizar smtplib.sendmail para enviar a varios destinatarios. El problema era que cada vez que el correo será enviado a los encabezados de correo parecería contener varias direcciones, pero en realidad sólo el primer destinatario recibe el correo electrónico.

El problema parece ser que el correo electrónico.Mensaje módulo espera algo diferente de la smtplib.sendmail() función.

En resumen, para enviar a varios destinatarios debe establecer el encabezado de ser una cadena delimitada por comas direcciones de correo electrónico. El sendmail() parámetro to_addrs sin embargo, debe ser una lista de direcciones de correo electrónico.

from email.MIMEMultipart import MIMEMultipart
from email.MIMEText import MIMEText
import smtplib

msg = MIMEMultipart()
msg["Subject"] = "Example"
msg["From"] = "[email protected]"
msg["To"] = "[email protected],[email protected]mple.com,[email protected]"
msg["Cc"] = "[email protected],[email protected]"
body = MIMEText("example email body")
msg.attach(body)
smtp = smtplib.SMTP("mailhost.example.com", 25)
smtp.sendmail(msg["From"], msg["To"].split(",") + msg["Cc"].split(","), msg.as_string())
smtp.quit()
  • Parece OP respondió a su propia pregunta: sendmail necesidades de una lista.
  • posibles duplicados de hay alguna forma de agregar múltiples receptores en Python SMTPlib?
  • El uso de Python3 tuve un bucle a través de los destinatarios; for addr in recipients: msg['To'] = addr y luego se trabajó. Varias asignaciones en realidad anexa un nuevo ‘A’ encabezado para cada uno. Este es un caso muy extraño de la interfaz, aún no puedo explicar cómo me dije a intentarlo. Incluso estaba considerando la posibilidad de usar subprocess llamar al unix sendmail paquete para guardar mi cordura antes de que me di cuenta de esto.
InformationsquelleAutor user1148320 | 2012-01-13

13 Kommentare

  1. 284

    Este realmente funciona, me pasé un montón de tiempo tratando de múltiples variantes.

    import smtplib
    from email.mime.text import MIMEText
    
    s = smtplib.SMTP('smtp.uk.xensource.com')
    s.set_debuglevel(1)
    msg = MIMEText("""body""")
    sender = '[email protected]'
    recipients = ['[email protected]', '[email protected]']
    msg['Subject'] = "subject line"
    msg['From'] = sender
    msg['To'] = ", ".join(recipients)
    s.sendmail(sender, recipients, msg.as_string())

  2. 132

    La msg['To'] debe ser una cadena:

    msg['To'] = "[email protected], [email protected], [email protected]"

    Mientras que el recipients en sendmail(sender, recipients, message) debe ser una lista:

    sendmail("[email protected]", ["[email protected]", "[email protected]", "[email protected]"], "Howdy")
    • Esta es una extraña decisión de diseño para smtplib.
    • recipients no tiene que ser una lista – si una cadena dada, es tratada como una lista con un solo elemento. Elmsg['To'] cadena puede simplemente ser omitido.
    • Yo realmente no entiendo, cómo ‘[email protected], [email protected]‘ se analiza de modo que sólo la primera dirección recibe el correo electrónico. Pero, gracias! Esta es la respuesta, tenía que poner la lista de allí.
    • funcionó para mí, y es consistente con la documentación en docs.python.org/2/library/email-examples.html
  3. 38

    Que usted necesita para comprender la diferencia entre el visible dirección de un correo electrónico, y el entrega.

    msg["To"] es esencialmente lo que está impreso en la carta. Realmente no tiene ningún efecto. Excepto que su cliente de correo electrónico, como el correo ordinario oficial, se supone que esta es la que desea enviar el mensaje de correo electrónico.

    La entrega real sin embargo, puede ser bastante diferente. Así que puede colocar el correo electrónico (o una copia) en el cuadro de mensaje de alguien completamente diferente.

    Hay varias razones para ello. Por ejemplo el reenvío de. El To: campo de encabezado no cambio en el reenvío, sin embargo, el correo electrónico se deja caer en un buzón diferente.

    La smtp.sendmail comando en la actualidad se encarga de la real de entrega. email.Message es el contenido de la carta, no la entrega.

    De bajo nivel SMTP, usted necesita dar a la receipients uno-por-uno, que es por qué una lista de direcciones (no incluyendo los nombres!) es sensible a la API.

    Para el encabezado, también puede contener por ejemplo el nombre, por ejemplo,To: First Last <[email protected]>, Other User <[email protected]>. Su ejemplo de código por lo tanto no se recomienda, como se producirá la entrega de este correo, ya que sólo mediante su división en , que todavía no tienen la validez de direcciones!

    • RFC 2822 impone una anchura máxima de 988 caracteres para la cabecera y una anchura recomendada de 78 caracteres. Usted tendrá que asegurarse de que el «doblez» de la cabecera si usted tiene demasiadas direcciones.
    • Esto debe ser aceptado respuesta, ya que en realidad se explica el por qué y el cómo.
    • Gran respuesta. ¿Qué acerca de CC y CCO de los campos de correo electrónico? Supongo que también tiene que incluir CC y CCO de correo electrónico smtp.enviar. Y sólo CC de la lista (y no CCO lista) en el msg campos?
    • Sí, que es cómo funciona. Los servidores de correo es probable que suelte el campo CCO (para evitar que esto sea visible, y no creo que todos lo hacemos), pero no voy a analizarlo.
  4. 16

    Funciona para mí.

    import smtplib
    from email.mime.text import MIMEText
    
    s = smtplib.SMTP('smtp.uk.xensource.com')
    s.set_debuglevel(1)
    msg = MIMEText("""body""")
    sender = '[email protected]'
    recipients = '[email protected],[email protected]'
    msg['Subject'] = "subject line"
    msg['From'] = sender
    msg['To'] = recipients
    s.sendmail(sender, recipients.split(','), msg.as_string())
    • ¿qué versión de python estás usando? Tengo el mismo problema que el cartel original y estoy usando python 2.7.9
    • ¿Por qué no simplemente recipients = ['[email protected]','[email protected]'] en lugar de lo que es una cadena y, a continuación, dividir a hacer una lista?
    • Esto funcionó bien para mí. Gracias
  5. 10

    He probado el de abajo y se trabajó como un encanto 🙂

    rec_list =  ['[email protected]', '[email protected]']
    rec =  ', '.join(rec_list)
    
    msg['To'] = rec
    
    send_out = smtplib.SMTP('localhost')
    send_out.sendmail(me, rec_list, msg.as_string())
    • La ex república yugoslava de todo el código a continuación: import smtplib from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText sender = '[email protected]' rec_list = ['[email protected]', '[email protected]'] rec = ', '.join(rec_list) msg = MIMEMultipart('alternative') msg['Subject'] = 'The required subject' msg['From'] = sender msg['To'] = rec html = ('whatever html code') htm_part = MIMEText(html, 'html') msg.attach(htm_part) send_out = smtplib.SMTP('localhost') send_out.sendmail(sender, rec_list, msg.as_string()) send_out.quit()
  6. 9

    Así que en realidad el problema es que SMTP.sendmail y correo electrónico.MIMEText necesitan dos cosas diferentes.

    de correo electrónico.MIMEText establece la «A:» encabezado por el cuerpo del e-mail. SÓLO se utiliza para mostrar un resultado para el ser humano en el otro extremo, y como todos los encabezados de correo electrónico, debe ser de una sola cadena. (Tenga en cuenta que en realidad no tienen nada que ver con la gente que recibe el mensaje).

    SMTP.sendmail, por otro lado, establece la «envoltura» del mensaje para el protocolo SMTP. Se necesita un Python lista de cadenas, cada una de las cuales tiene una dirección única.

    Así, lo que usted necesita hacer es COMBINAR las dos respuestas que recibió. Conjunto de msg[‘A’] a una sola cadena, pero se puede pasar a la cruda lista para sendmail:

    emails = ['a.com','b.com', 'c.com']
    msg['To'] = ', '.join( emails ) 
    ....
    s.sendmail( msg['From'], emails, msg.as_string())
  7. 7

    Se me ocurrió esta importables módulo de función. Se utiliza el servidor de correo electrónico de gmail en este ejemplo. Su división en encabezado y el mensaje de modo que usted puede ver claramente lo que pasa:

    import smtplib
    
    def send_alert(subject=""):
    
        to = ['[email protected]', '[email protected]_email.com', '[email protected]']
        gmail_user = '[email protected]'
        gmail_pwd = 'my_pass'
        smtpserver = smtplib.SMTP("smtp.gmail.com", 587)
        smtpserver.ehlo()
        smtpserver.starttls()
        smtpserver.ehlo
        smtpserver.login(gmail_user, gmail_pwd)
        header = 'To:' + ", ".join(to) + '\n' + 'From: ' + gmail_user + '\n' + 'Subject: ' + subject + '\n'
        msg = header + '\n' + subject + '\n\n'
        smtpserver.sendmail(gmail_user, to, msg)
        smtpserver.close()
  8. 6

    Me di cuenta de esto hace un par de meses y blogs sobre ello. El resumen es:

    Si quieres usar smtplib enviar un correo a varios destinatarios, utilice email.Message.add_header('To', eachRecipientAsString) de agregar y, a continuación, cuando se invoca el método sendmail, use email.Message.get_all('To') enviar el mensaje a todos ellos. Lo mismo para el Cc y Bcc.

    • Python 3.7 lanza una excepción con el mensaje: ha producido la Excepción: ValueError No puede ser en la mayoría de los 1 A los encabezados en un mensaje
  9. 4

    La solución a continuación trabajó para mí. Con éxito envía un correo electrónico a varios destinatarios, incluyendo «CC» y «CCO.»

    toaddr = ['mailid_1','mailid_2']
    cc = ['mailid_3','mailid_4']
    bcc = ['mailid_5','mailid_6']
    subject = 'Email from Python Code'
    fromaddr = 'sender_mailid'
    message = "\n  !! Hello... !!"
    
    msg['From'] = fromaddr
    msg['To'] = ', '.join(toaddr)
    msg['Cc'] = ', '.join(cc)
    msg['Bcc'] = ', '.join(bcc)
    msg['Subject'] = subject
    
    s.sendmail(fromaddr, (toaddr+cc+bcc) , message)
    • Esto funciona en parte, a la realidad de ocultar el CCO debe de omitir la línea CCO cco = [‘mailid_5′,’mailid_6’] en caso contrario se mostrará en el encabezado derrotando el propósito de bcc. Probado con gmail y otro servidor de correo.
    • ¿cómo implementar el BCC en ese caso?
  10. 3

    Bien, el método en esta respuesta método no funciona para mí. No sé, tal vez esta es una Python3 (estoy usando la versión 3.4) o gmail relacionados con el tema, pero después de algunos intentos, la solución que funcionó para mí, era la línea

    s.send_message(msg)

    lugar de

    s.sendmail(sender, recipients, msg.as_string())
  11. 2
    import smtplib
    from email.mime.multipart import MIMEMultipart
    from email.mime.text import MIMEText
    
    def sender(recipients): 
    
        body = 'Your email content here'
        msg = MIMEMultipart()
    
        msg['Subject'] = 'Email Subject'
        msg['From'] = '[email protected]'
        msg['To'] = (', ').join(recipients.split(','))
    
        msg.attach(MIMEText(body,'plain'))
    
        server = smtplib.SMTP('smtp.gmail.com', 587)
        server.starttls()
        server.login('[email protected]', 'yourpassword')
        server.send_message(msg)
        server.quit()
    
    if __name__ == '__main__':
        sender('[email protected],[email protected]')

    Sólo funcionó para mí con send_message la función y el uso de la combinación de la función en la lista de la que se hicieron los destinatarios, python 3.6.

  12. 0

    que usted puede probar esto cuando escribe el recpient mensajes de correo electrónico en un archivo de texto

    from email.mime.text import MIMEText
    from email.header import Header
    import smtplib
    
    f =  open('emails.txt', 'r').readlines()
    for n in f:
         emails = n.rstrip()
    server = smtplib.SMTP('smtp.uk.xensource.com')
    server.ehlo()
    server.starttls()
    body = "Test Email"
    subject = "Test"
    from = "[email protected]"
    to = emails
    msg = MIMEText(body,'plain','utf-8')
    msg['Subject'] = Header(subject, 'utf-8')
    msg['From'] =  Header(from, 'utf-8')
    msg['To'] = Header(to, 'utf-8')
    text = msg.as_string()
    try:
       server.send(from, emails, text)
       print('Message Sent Succesfully')
    except:
       print('There Was An Error While Sending The Message')

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea