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!
El msg[''To'']
debe ser una cadena:
msg[''To''] = "[email protected], [email protected], [email protected]"
Mientras que los recipients
de sendmail(sender, recipients, message)
deben ser una lista:
sendmail("[email protected]", ["[email protected]", "[email protected]", "[email protected]"], "Howdy")
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()