raspberry - send email python smtplib
¿Cómo enviar archivos adjuntos de correo electrónico? (10)
A continuación se muestra una combinación de lo que he encontrado en la publicación de SoccerPlayer Here y el siguiente enlace que me facilitó la tarea de adjuntar un archivo xlsx. Encontrado aquí
file = ''File.xlsx''
username=''''
password=''''
send_from = ''''
send_to = ''recipient1 , recipient2''
Cc = ''recipient''
msg = MIMEMultipart()
msg[''From''] = send_from
msg[''To''] = send_to
msg[''Cc''] = Cc
msg[''Date''] = formatdate(localtime = True)
msg[''Subject''] = ''''
server = smtplib.SMTP(''smtp.gmail.com'')
port = ''587''
fp = open(file, ''rb'')
part = MIMEBase(''application'',''vnd.ms-excel'')
part.set_payload(fp.read())
fp.close()
encoders.encode_base64(part)
part.add_header(''Content-Disposition'', ''attachment'', filename=''Name File Here'')
msg.attach(part)
smtp = smtplib.SMTP(''smtp.gmail.com'')
smtp.ehlo()
smtp.starttls()
smtp.login(username,password)
smtp.sendmail(send_from, send_to.split('','') + msg[''Cc''].split('',''), msg.as_string())
smtp.quit()
Estoy teniendo problemas para entender cómo enviar un archivo adjunto mediante Python. He enviado exitosamente mensajes simples con el smtplib
. ¿Podría alguien explicarnos cómo enviar un archivo adjunto en un correo electrónico? Sé que hay otros mensajes en línea, pero como principiante de Python los encuentro difíciles de entender.
Aquí está 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()
Aquí está 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 muy parecido al primer ejemplo ... Pero debería ser más fácil de incluir.
El código más simple al que puedo llegar 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 basó en la documentación oficial de Django.
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 archivo Binario adjunto correo electrónico problema adjunto .
Otra forma con python 3 (si alguien está buscando):
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email import encoders
fromaddr = "sender mail address"
toaddr = "receiver mail address"
msg = MIMEMultipart()
msg[''From''] = fromaddr
msg[''To''] = toaddr
msg[''Subject''] = "SUBJECT OF THE EMAIL"
body = "TEXT YOU WANT TO SEND"
msg.attach(MIMEText(body, ''plain''))
filename = "fileName"
attachment = open("path of file", "rb")
part = MIMEBase(''application'', ''octet-stream'')
part.set_payload((attachment).read())
encoders.encode_base64(part)
part.add_header(''Content-Disposition'', "attachment; filename= %s" % filename)
msg.attach(part)
server = smtplib.SMTP(''smtp.gmail.com'', 587)
server.starttls()
server.login(fromaddr, "sender mail password")
text = msg.as_string()
server.sendmail(fromaddr, toaddr, text)
server.quit()
Asegúrese de permitir " aplicaciones menos seguras " en su cuenta de Gmail
Otras respuestas son excelentes, aunque todavía quería compartir un enfoque diferente en caso de que alguien esté buscando alternativas.
La principal diferencia aquí es que al utilizar este enfoque, puede utilizar HTML / CSS para dar formato a su mensaje, para que pueda ser creativo y darle un toque de estilo a su correo electrónico. Aunque no está obligado a usar HTML, también puede usar solo texto sin formato.
Tenga en cuenta que esta función acepta enviar el correo electrónico a múltiples destinatarios y también permite adjuntar varios archivos.
Solo probé esto en Python 2, pero creo que debería funcionar bien en 3 también:
import os.path
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication
def send_email(subject, message, from_email, to_email=[], attachment=[]):
"""
:param subject: email subject
:param message: Body content of the email (string), can be HTML/CSS or plain text
:param from_email: Email address from where the email is sent
:param to_email: List of email recipients, example: ["[email protected]", "[email protected]"]
:param attachment: List of attachments, exmaple: ["file1.txt", "file2.txt"]
"""
msg = MIMEMultipart()
msg[''Subject''] = subject
msg[''From''] = from_email
msg[''To''] = ", ".join(to_email)
msg.attach(MIMEText(message, ''html''))
for f in attachment:
with open(f, ''rb'') as a_file:
basename = os.path.basename(f)
part = MIMEApplication(a_file.read(), Name=basename)
part[''Content-Disposition''] = ''attachment; filename="%s"'' % basename
msg.attach(part)
email = smtplib.SMTP(''your-smtp-host-name.com'')
email.sendmail(from_email, to_email, msg.as_string())
¡Espero que esto ayude! :-)
Versión de Gmail, que trabaja con Python 3.6 (tenga en cuenta que deberá cambiar la configuración de Gmail para poder enviar correos electrónicos a través de smtp).
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.application import MIMEApplication
from os.path import basename
def send_mail(send_from: str, subject: str, text: str,
send_to: list, files= None):
send_to= default_address if not send_to else send_to
msg = MIMEMultipart()
msg[''From''] = send_from
msg[''To''] = '', ''.join(send_to)
msg[''Subject''] = subject
msg.attach(MIMEText(text))
for f in files or []:
with open(f, "rb") as fil:
ext = f.split(''.'')[-1:]
attachedfile = MIMEApplication(fil.read(), _subtype = ext)
attachedfile.add_header(
''content-disposition'', ''attachment'', filename=basename(f) )
msg.attach(attachedfile)
smtp = smtplib.SMTP(host="smtp.gmail.com", port= 587)
smtp.starttls()
smtp.login(username,password)
smtp.sendmail(send_from, send_to, msg.as_string())
smtp.close()
Uso:
username = ''[email protected]''
password = ''top-secret''
default_address = [''[email protected]'']
send_mail(send_from= username,
subject="test",
text="text",
send_to= None,
files= # pass a list with the full filepaths here...
)
Para usar con cualquier otro proveedor de correo electrónico, simplemente cambie las configuraciones de smtp.
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 desde here .
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
import smtplib
import mimetypes
import email.mime.application
smtp_ssl_host = ''smtp.gmail.com'' # smtp.mail.yahoo.com
smtp_ssl_port = 465
s = smtplib.SMTP_SSL(smtp_ssl_host, smtp_ssl_port)
s.login(email_user, email_pass)
msg = MIMEMultipart()
msg[''Subject''] = ''I have a picture''
msg[''From''] = email_user
msg[''To''] = email_user
txt = MIMEText(''I just bought a new camera.'')
msg.attach(txt)
filename = ''introduction-to-algorithms-3rd-edition-sep-2010.pdf'' #path to file
fo=open(filename,''rb'')
attach = email.mime.application.MIMEApplication(fo.read(),_subtype="pdf")
fo.close()
attach.add_header(''Content-Disposition'',''attachment'',filename=filename)
msg.attach(attach)
s.send_message(msg)
s.quit()
Para obtener una explicación, puede usar este enlace, se explica correctamente https://medium.com/@sdoshi579/to-send-an-email-along-with-attachment-using-smtp-7852e77623