Tengo problemas para entender cómo enviar un archivo adjunto usando Python. He enviado correos electrónicos con éxito con el smtplib
. ¿Podría alguien explicar cómo enviar un archivo adjunto en un correo electrónico? Sé que hay otras publicaciones en línea pero, como principiante de Python, las encuentro difíciles de entender.¿Cómo enviar archivos adjuntos de correo electrónico?
Respuesta
Aquí hay otro:
import smtplib
from os.path import basename
from email.mime.application import MIMEApplication
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.utils import COMMASPACE, formatdate
def send_mail(send_from, send_to, subject, text, files=None,
server="127.0.0.1"):
assert isinstance(send_to, list)
msg = MIMEMultipart()
msg['From'] = send_from
msg['To'] = COMMASPACE.join(send_to)
msg['Date'] = formatdate(localtime=True)
msg['Subject'] = subject
msg.attach(MIMEText(text))
for f in files or []:
with open(f, "rb") as fil:
part = MIMEApplication(
fil.read(),
Name=basename(f)
)
# After the file is closed
part['Content-Disposition'] = 'attachment; filename="%s"' % basename(f)
msg.attach(part)
smtp = smtplib.SMTP(server)
smtp.sendmail(send_from, send_to, msg.as_string())
smtp.close()
Es lo mismo que el primer ejemplo ... pero debería ser más fácil para caer en
Tenga cuidado con los valores predeterminados mutables: http://stackoverflow.com/questions/101268/hidden-features-of-python/113198#113198 –
-1 El bucle for no funcionará. Debe leer 'para archivo en archivos'. – garnertb
@ user589983 ¿Por qué no sugerir una edición como lo haría cualquier otro usuario aquí? Cambié la referencia restante a 'archivo' en' f'. – Oli
from email.MIMEMultipart import MIMEMultipart
from email.MIMEText import MIMEText
from email.MIMEImage import MIMEImage
import smtplib
msg = MIMEMultipart()
msg.attach(MIMEText(file("text.txt").read()))
msg.attach(MIMEImage(file("image.png").read()))
# to send
mailer = smtplib.SMTP()
mailer.connect()
mailer.sendmail(from_, to, msg.as_string())
mailer.close()
Adaptado de here.
No es exactamente lo que estoy buscando. El archivo fue enviado como el cuerpo de un correo electrónico. También faltan corchetes en la línea 6 y 7. Siento que nos estamos acercando aunque – Richard
Los correos electrónicos son texto sin formato, y eso es lo que 'smtplib' admite. Para enviar archivos adjuntos, los codifica como un mensaje MIME y los envía en un mensaje de texto sin formato. Sin embargo, hay un nuevo módulo de correo electrónico de python: http://docs.python.org/library/email.mime.html – katrielalex
@katrienlalex, un ejemplo de trabajo que ayudaría mucho a comprender – Richard
este es el código que terminé usando:.
import smtplib
from email.MIMEMultipart import MIMEMultipart
from email.MIMEBase import MIMEBase
from email import Encoders
SUBJECT = "Email Data"
msg = MIMEMultipart()
msg['Subject'] = SUBJECT
msg['From'] = self.EMAIL_FROM
msg['To'] = ', '.join(self.EMAIL_TO)
part = MIMEBase('application', "octet-stream")
part.set_payload(open("text.txt", "rb").read())
Encoders.encode_base64(part)
part.add_header('Content-Disposition', 'attachment; filename="text.txt"')
msg.attach(part)
server = smtplib.SMTP(self.EMAIL_SERVER)
server.sendmail(self.EMAIL_FROM, self.EMAIL_TO, msg.as_string())
El código es muy parecido al de Oli. Gracias a todos
Código basado en la publicación Binary file email attachment problem.
Buena respuesta. Sería bueno si también contenía código que agrega un cuerpo de texto de muestra. –
Aquí es la versión modificada de Oli
para Python 3
import smtplib
import os.path as op
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email.mime.text import MIMEText
from email.utils import COMMASPACE, formatdate
from email import encoders
def send_mail(send_from, send_to, subject, message, files=[],
server="localhost", port=587, username='', password='',
use_tls=True):
"""Compose and send email with provided info and attachments.
Args:
send_from (str): from name
send_to (str): to name
subject (str): message title
message (str): message body
files (list[str]): list of file paths to be attached to email
server (str): mail server host name
port (int): port number
username (str): server auth username
password (str): server auth password
use_tls (bool): use TLS mode
"""
msg = MIMEMultipart()
msg['From'] = send_from
msg['To'] = COMMASPACE.join(send_to)
msg['Date'] = formatdate(localtime=True)
msg['Subject'] = subject
msg.attach(MIMEText(message))
for path in files:
part = MIMEBase('application', "octet-stream")
with open(path, 'rb') as file:
part.set_payload(file.read())
encoders.encode_base64(part)
part.add_header('Content-Disposition',
'attachment; filename="{}"'.format(op.basename(path)))
msg.attach(part)
smtp = smtplib.SMTP(server, port)
if use_tls:
smtp.starttls()
smtp.login(username, password)
smtp.sendmail(send_from, send_to, msg.as_string())
smtp.quit()
gracias pero sería bueno tener también lo básico: la sintaxis para un solo archivo adjunto (usando su ruta) – JinSnow
parece que no cierra sus archivos, será basura recolectada o cerrada en la salida pero es un mal hábito. con open() como f: es la forma correcta. – comte
El código no funciona. Nombre de variable incorrecta f en formato (os.path.basename (f)) debe ser formato (os.path.basename (ruta)) – Chris
El código más simple que pudiera llegar a es:
#for attachment email
from django.core.mail import EmailMessage
def attachment_email(request):
email = EmailMessage(
'Hello', #subject
'Body goes here', #body
'[email protected]', #from
['[email protected]'], #to
['[email protected]'], #bcc
reply_to=['[email protected]'],
headers={'Message-ID': 'foo'},
)
email.attach_file('/my/path/file')
email.send()
Se basaba en el funcionario Django documentation
- 1. Archivos adjuntos de correo electrónico
- 2. ¿Cómo enviar un correo electrónico con archivos adjuntos utilizando SmtpClient.SendAsync?
- 3. Cómo enviar un correo electrónico con archivos adjuntos en Ir
- 4. Android múltiples archivos adjuntos de correo electrónico con la intención
- 5. enviando un correo electrónico con varios archivos adjuntos
- 6. Apertura de archivos adjuntos de correo electrónico en Android
- 7. Extraer archivos adjuntos de correo electrónico en Unix
- 8. Enviar informe SQL en archivos adjuntos de correo electrónico utilizando C# y ASP.NET
- 9. archivos adjuntos de correo electrónico dañados en .NET
- 10. impedir que Rails registre archivos adjuntos de correo electrónico
- 11. Enviar correo electrónico - Cocoa
- 12. vb.net enviar correo electrónico
- 13. cómo enviar correo electrónico HTML
- 14. Enviar correo electrónico con attchement usando System.Net.Mail
- 15. ¿Enviar correo electrónico de Elmah?
- 16. Enviar correo electrónico desde Cocoa
- 17. Cómo guardar adjuntos de correo electrónico en C#
- 18. iphone app enviar correo electrónico
- 19. enviar correo electrónico asp.net C#
- 20. sendmailR (Part2): Envío de archivos como archivos adjuntos de correo
- 21. enviar correo electrónico desde localhost
- 22. C# Enviar correo electrónico masivo
- 23. Android Correo electrónico Problema de varios archivos adjuntos en HTC Thunderbolt
- 24. Extraer los archivos adjuntos al correo electrónico de tuberías a PHP
- 25. Enviar correo electrónico con archivo adjunto mediante aplicación de correo electrónico del cliente
- 26. Cómo mostrar "Abrir en ..." cuando un usuario intenta abrir archivos adjuntos de correo electrónico en iOS
- 27. Enviar notificación por correo electrónico de Jenkins
- 28. Enviar correo electrónico-Simulador de Iphone
- 29. nombre del conjunto de adjuntos de correo electrónico en C#
- 30. Adjuntos ATTnnnnn.txt cuando se recibe un correo electrónico en Outlook
he aquí una sencilla implementación que puede adjuntar múltiples archivos, e incluso referirse a ellos en el caso de imágenes para incrustar. http://datamakessense.com/easy-scheduled-emailing-with-python-for-typical-bi-needs/ – AdrianBR