Después de mucho buscar, no pude descubrir cómo usar smtplib.sendmail para enviar a múltiples destinatarios. El problema era que cada vez que se enviaba el correo los encabezados de 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 email.Message
módulo espera algo diferente a la smtplib.sendmail()
función.
En resumen, para enviar a múltiples destinatarios, debe configurar el encabezado para que sea una cadena de direcciones de correo electrónico delimitadas por comas. Sin embargo, el sendmail()
parámetro to_addrs
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()
sendmail
necesita una lista.for addr in recipients: msg['To'] = addr
Y luego funcionó. Las asignaciones múltiples en realidad añaden un nuevo encabezado 'Para' para cada una. Esta es una interfaz muy extraña, ni siquiera puedo explicar cómo pensé en probarla. Incluso estaba considerando usarsubprocess
para llamar alsendmail
paquete de Unix para salvar mi cordura antes de resolver esto.Respuestas:
Esto realmente funciona , pasé mucho tiempo probando múltiples variantes.
fuente
tolist =["[email protected]","[email protected]","[email protected]","[email protected]"]
send_message
lugar desendmail
según el comentario de Antoine a continuación y los documentos de Python docs.python.org/3/library/email-examples.htmlLa
msg['To']
necesidad de ser una cadena:Mientras que el
recipients
ensendmail(sender, recipients, message)
debe ser una lista:fuente
smtplib.
recipients
no tiene que ser una lista: si se proporciona una cadena, se trata como una lista con un elemento. Lamsg['To']
cadena simplemente se puede omitir.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 correos regular, asumirá que es a quien desea enviar el correo electrónico.Sin embargo, la entrega real puede funcionar bastante diferente. Por lo tanto, puede colocar el correo electrónico (o una copia) en la casilla de correo de alguien completamente diferente.
Hay varias razones para esto. Por ejemplo reenvío . El
To:
campo del encabezado no cambia al reenviar, sin embargo, el correo electrónico se coloca en un buzón diferente.El
smtp.sendmail
comando ahora se encarga de la entrega real .email.Message
es el contenido de la carta solamente, no la entrega.En el nivel bajo
SMTP
, debe proporcionar los destinatarios 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 su ejemplo de código , ya que fallará en la entrega de este correo, ya que solo dividiéndolo,
aún no tiene las direcciones válidas.fuente
Esto funciona para mi.
fuente
recipients = ['[email protected]','[email protected]']
lugar de convertirlo en una cadena y luego dividirlo para hacer una lista?Intenté lo siguiente y funcionó a las mil maravillas :)
fuente
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()
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. SOLO se usa 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 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 ['Para'] en una sola cadena, pero pase la lista sin formato a sendmail:
fuente
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á sucediendo:
fuente
Me di cuenta de esto hace unos meses y escribí en un blog al respecto . 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íe el mensaje a todos ellos. Lo mismo para los destinatarios CC y CCO.fuente
La solución a continuación funcionó para mí. Envía con éxito un correo electrónico a múltiples destinatarios, incluidos "CC" y "BCC".
fuente
Bueno, el método en este método no funcionó para mí. No sé, tal vez este 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
en vez de
fuente
Yo uso Python 3.6 y el siguiente código me funciona
fuente
Solo funcionó para mí con la función send_message y usando la función de unión en la lista con los destinatarios, python 3.6.
fuente
puedes probar esto cuando escribes los correos electrónicos de destinatarios en un archivo de texto
fuente