script raspberry para mail example enviar electronico desde correo con python email smtp message smtplib

raspberry - ¿Cómo enviar correos electrónicos a múltiples destinatarios usando python smtplib?



smtp python gmail example (11)

Bien, el método en este método simple no funcionó para mí. No sé, quizás esto es un Python3 (estoy usando la versión 3.4) o un problema relacionado con Gmail, pero después de algunos intentos, la solución que funcionó para mí fue la línea

s.send_message(msg)

en lugar de

s.sendmail(sender, recipients, msg.as_string())

Después de muchas búsquedas, no pude encontrar la forma de usar smtplib.sendmail para enviar a múltiples destinatarios. El problema era que cada vez que se enviaba el correo, los encabezados del correo parecían contener varias direcciones, pero de hecho solo el primer destinatario recibiría el correo electrónico.

El problema parece ser que el módulo email.Message espera algo diferente a la función smtplib.sendmail() .

En resumen, para enviar a destinatarios múltiples, debe establecer que el encabezado sea una cadena de direcciones de correo electrónico delimitadas por comas. El parámetro sendmail() 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],[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()


Debe comprender la diferencia entre la dirección visible de un correo electrónico y la entrega .

msg["To"] es esencialmente lo que está impreso en la carta. En realidad, no tiene ningún efecto. Excepto que su cliente de correo electrónico, al igual que el oficial de correo regular, asumirá que es a quien desea enviar el correo electrónico.

Sin embargo, la entrega real puede funcionar bastante diferente. Entonces puede dejar caer el correo electrónico (o una copia) en el buzón de alguien completamente diferente.

Hay varias razones para esto. Por ejemplo reenviar . El campo To: encabezado no cambia al reenviar, sin embargo, el correo electrónico se coloca en un buzón diferente.

El comando smtp.sendmail ahora se ocupa de la entrega real . email.Message es el contenido de la carta solamente, no la entrega.

En SMTP bajo nivel, necesita dar los recibientes uno por uno, por lo que una lista de direcciones (¡sin incluir nombres!) Es la API sensata.

Para el encabezado, también puede contener, por ejemplo, el nombre, por ejemplo, To: First Last <[email protected]>, Other User <[email protected]> . Por lo tanto, no se recomienda el ejemplo de su código , ya que no entregará este correo, ya que con solo dividirlo , ¡aún no tiene las direcciones válidas!



Entonces, en realidad, el problema es que SMTP.sendmail y email.MIMEText necesitan dos cosas diferentes.

email.MIMEText configura el encabezado "Para:" para el cuerpo del correo electrónico. SÓLO se utiliza para mostrar un resultado al ser humano en el otro extremo, y como todos los encabezados de correo electrónico, debe ser una sola cadena. (Tenga en cuenta que en realidad no tiene que tener nada que ver con las personas que realmente reciben el mensaje).

SMTP.sendmail, por otro lado, configura el "sobre" del mensaje para el protocolo SMTP. Necesita una lista de cadenas de Python, cada una de las cuales tiene una sola dirección.

Entonces, lo que debe hacer es COMBINAR las dos respuestas que recibió. Establezca msg [''To''] en una sola cadena, pero pase la lista sin formato a sendmail:

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


Esto realmente funciona , pasé mucho tiempo probando 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())


Esto funciona para mi.

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())


Intenté el siguiente y funcionó 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())


Lo hago así:

def send_mail msg[''Subject''] = subject msg[''From''] = sender msg[''To''] = [[email protected],[email protected]] msg[''Cc''] = [[email protected],[email protected]] msg[''Bcc''] = [[email protected],[email protected]] recips = [[email protected],[email protected],[email protected],[email protected],[email protected],[email protected]] sendmail(sender, recips, msg.as_string()) msg[''From''] = sender msg[''To''] = [[email protected],[email protected]] msg[''Cc''] = [[email protected],[email protected]] msg[''Bcc''] = [[email protected],[email protected]] recips = [[email protected],[email protected],[email protected],[email protected],[email protected],[email protected]] sendmail(sender, recips, msg.as_string())


Me di cuenta de esto hace unos meses y escribí en el blog sobre eso . El resumen es:

Si desea usar smtplib para enviar correos electrónicos a múltiples destinatarios, use email.Message.add_header(''To'', eachRecipientAsString) para agregarlos, y luego cuando invoque el método sendmail, use email.Message.get_all(''To'') envía el mensaje a todos ellos. Lo mismo para los destinatarios Cc y Bcc.


Puedes intentar esto cuando escribes los correos electrónicos de respuesta 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'')


Se me ocurrió esta función de módulo importable. Utiliza el servidor de correo electrónico de Gmail en este ejemplo. Se divide en encabezado y mensaje para que pueda ver claramente lo que está pasando:

import smtplib def send_alert(subject=""): to = [''[email protected]'', ''email2@another_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()