script para mail enviar correo con python email smtp gmail

para - ¿Cómo enviar un correo electrónico con Gmail como proveedor utilizando Python?



send email python 3 (12)

Esto funciona

Crear la contraseña de la aplicación de Gmail!

Después de crear eso, crea un archivo llamado sendgmail.py

Luego agrega este código :

#!/usr/bin/env python3 # -*- coding: utf-8 -*- # ============================================================================= # Created By : Jeromie Kirchoff # Created Date: Mon Aug 02 17:46:00 PDT 2018 # ============================================================================= # Imports # ============================================================================= import smtplib # ============================================================================= # SET EMAIL LOGIN REQUIREMENTS # ============================================================================= gmail_user = ''[email protected]'' gmail_app_password = ''YOUR-GOOGLE-APPLICATION-PASSWORD!!!!'' # ============================================================================= # SET THE INFO ABOUT THE SAID EMAIL # ============================================================================= sent_from = gmail_user sent_to = [''[email protected]'', ''[email protected]''] sent_subject = "Where are all my Robot Women at?" sent_body = ("Hey, what''s up? friend!/n/n" "I hope you have been well!/n" "/n" "Cheers,/n" "Jay/n") email_text = """/ From: %s To: %s Subject: %s %s """ % (sent_from, ", ".join(sent_to), sent_subject, sent_body) # ============================================================================= # SEND EMAIL OR DIE TRYING!!! # Details: http://www.samlogic.net/articles/smtp-commands-reference.htm # ============================================================================= try: server = smtplib.SMTP_SSL(''smtp.gmail.com'', 465) server.ehlo() server.login(gmail_user, gmail_app_password) server.sendmail(sent_from, sent_to, email_text) server.close() print(''Email sent!'') except Exception as exception: print("Error: %s!/n/n" % exception)

Entonces, si tienes éxito, verás una imagen como esta:

Lo probé enviando un correo electrónico desde y hacia mí.

Nota: Tengo la verificación de 2 pasos habilitada en mi cuenta. La contraseña de la aplicación funciona con esto!

Esta configuración no está disponible para cuentas con la verificación de 2 pasos habilitada. Dichas cuentas requieren una contraseña específica de la aplicación para un acceso menos seguro a las aplicaciones.

Estoy intentando enviar un correo electrónico (Gmail) usando python, pero recibo el siguiente error.

Traceback (most recent call last): File "emailSend.py", line 14, in <module> server.login(username,password) File "/usr/lib/python2.5/smtplib.py", line 554, in login raise SMTPException("SMTP AUTH extension not supported by server.") smtplib.SMTPException: SMTP AUTH extension not supported by server.

La secuencia de comandos de Python es la siguiente.

import smtplib fromaddr = ''[email protected]'' toaddrs = ''[email protected]'' msg = ''Why,Oh why!'' username = ''[email protected]'' password = ''pwd'' server = smtplib.SMTP(''smtp.gmail.com:587'') server.starttls() server.login(username,password) server.sendmail(fromaddr, toaddrs, msg) server.quit()


¿Estás abajo con OOP?

#!/usr/bin/env python import smtplib class Gmail(object): def __init__(self, email, password): self.email = email self.password = password self.server = ''smtp.gmail.com'' self.port = 587 session = smtplib.SMTP(self.server, self.port) session.ehlo() session.starttls() session.ehlo session.login(self.email, self.password) self.session = session def send_message(self, subject, body): '''''' This must be removed '''''' headers = [ "From: " + self.email, "Subject: " + subject, "To: " + self.email, "MIME-Version: 1.0", "Content-Type: text/html"] headers = "/r/n".join(headers) self.session.sendmail( self.email, self.email, headers + "/r/n/r/n" + body) gm = Gmail(''Your Email'', ''Password'') gm.send_message(''Subject'', ''Message'')


Ahora hay una API de gmail, que le permite enviar correos electrónicos, leer correos electrónicos y crear borradores a través de REST. A diferencia de las llamadas SMTP, no es de bloqueo, lo que puede ser bueno para los servidores web basados ​​en subprocesos que envían correos electrónicos en el subproceso de solicitud (como los servidores web de Python). La API también es bastante potente.

  • Por supuesto, el correo electrónico debe entregarse a una cola que no sea de servidor web, pero es bueno tener opciones.

Es más fácil de configurar si tiene derechos de administrador de Google Apps en el dominio, porque entonces puede otorgar un permiso general a su cliente. De lo contrario, tendrá que jugar con la autenticación y el permiso de OAuth.

Aquí hay una esencia que lo demuestra:

https://gist.github.com/timrichardson/1154e29174926e462b7a


Lo puedes encontrar aquí: http://jayrambhia.com/blog/send-emails-using-python

smtp_host = ''smtp.gmail.com'' smtp_port = 587 server = smtplib.SMTP() server.connect(smtp_host,smtp_port) server.ehlo() server.starttls() server.login(user,passw) fromaddr = raw_input(''Send mail by the name of: '') tolist = raw_input(''To: '').split() sub = raw_input(''Subject: '') msg = email.MIMEMultipart.MIMEMultipart() msg[''From''] = fromaddr msg[''To''] = email.Utils.COMMASPACE.join(tolist) msg[''Subject''] = sub msg.attach(MIMEText(raw_input(''Body: ''))) msg.attach(MIMEText(''/nsent via python'', ''plain'')) server.sendmail(user,tolist,msg.as_string())


Me encontré con un problema similar y me encontré con esta pregunta. Recibí un error de autenticación SMTP pero mi nombre de usuario / paso fue correcto. Esto es lo que lo arregló. Leo esto:

https://support.google.com/accounts/answer/6010255

En pocas palabras, Google no le permite iniciar sesión a través de smtplib porque ha marcado este tipo de inicio de sesión como "menos seguro", así que lo que debe hacer es ir a este enlace mientras está conectado a su cuenta de Google. y permitir el acceso:

https://www.google.com/settings/security/lesssecureapps

Una vez que está establecido (ver mi captura de pantalla a continuación), debería funcionar.

Iniciar sesión ahora funciona:

smtpserver = smtplib.SMTP("smtp.gmail.com", 587) smtpserver.ehlo() smtpserver.starttls() smtpserver.ehlo() smtpserver.login(''[email protected]'', ''me_pass'')

Respuesta después del cambio:

(235, ''2.7.0 Accepted'')

Respuesta previa:

smtplib.SMTPAuthenticationError: (535, ''5.7.8 Username and Password not accepted. Learn more at/n5.7.8 http://support.google.com/mail/bin/answer.py?answer=14257 g66sm2224117qgf.37 - gsmtp'')

¿Sigue sin funcionar? Si aún obtiene el SMTPAuthenticationError pero ahora el código es 534, es porque la ubicación es desconocida. Siga este enlace:

https://accounts.google.com/DisplayUnlockCaptcha

Haga clic en continuar y esto debería darle 10 minutos para registrar su nueva aplicación. Entonces proceda a hacer otro intento de inicio de sesión ahora y debería funcionar.

ACTUALIZACIÓN : esto no parece funcionar de inmediato, puede que te quedes estancado por un tiempo al recibir este error en smptlib:

235 == ''Authentication successful'' 503 == ''Error: already authenticated''

El mensaje dice usar el navegador para iniciar sesión:

SMTPAuthenticationError: (534, ''5.7.9 Please log in with your web browser and then try again. Learn more at/n5.7.9 https://support.google.com/mail/bin/answer.py?answer=78754 qo11sm4014232igb.17 - gsmtp'')

Después de habilitar ''lesssecureapps'', vaya a tomar un café, vuelva e intente nuevamente el enlace ''DisplayUnlockCaptcha''. Según la experiencia del usuario, el cambio puede tardar hasta una hora en iniciarse. Luego, vuelva a intentar el proceso de inicio de sesión.


No relacionado directamente, pero aún vale la pena señalar que mi paquete intenta que el envío de mensajes de Gmail sea realmente rápido e indoloro. También intenta mantener una lista de errores e intenta señalar la solución inmediatamente.

Literalmente solo necesitaría este código para hacer exactamente lo que escribiste:

import yagmail yag = yagmail.SMTP(''[email protected]'') yag.send(''[email protected]'', ''Why,Oh why!'')

O un trazador de líneas:

yagmail.SMTP(''[email protected]'').send(''[email protected]'', ''Why,Oh why!'')

Para el paquete / instalación, consulte git o pip , disponible para Python 2 y 3.


Parece problema del viejo smtplib . En python2.7 todo funciona bien.

Actualización : Sí, server.ehlo() también podría ayudar.


excelente respuesta de @David, aquí está para Python 3 sin el genérico try-except:

def send_email(user, password, recipient, subject, body): gmail_user = user gmail_pwd = password FROM = user TO = recipient if type(recipient) is list else [recipient] SUBJECT = subject TEXT = body # Prepare actual message message = """From: %s/nTo: %s/nSubject: %s/n/n%s """ % (FROM, ", ".join(TO), SUBJECT, TEXT) server = smtplib.SMTP("smtp.gmail.com", 587) server.ehlo() server.starttls() server.login(gmail_user, gmail_pwd) server.sendmail(FROM, TO, message) server.close()


EHLO decir EHLO antes de ejecutar directamente en STARTTLS :

server = smtplib.SMTP(''smtp.gmail.com:587'') server.ehlo() server.starttls()

También deberías crear encabezados de mensaje From: To: y Subject: separados del cuerpo del mensaje por una línea en blanco y usar CRLF como marcadores EOL.

P.ej

msg = "/r/n".join([ "From: [email protected]", "To: [email protected]", "Subject: Just a message", "", "Why, oh why" ])


import smtplib fromadd=''[email protected]'' toadd=''[email protected]'' msg=''''''hi,how r u'''''' username=''[email protected]'' passwd=''password'' try: server = smtplib.SMTP(''smtp.gmail.com:587'') server.ehlo() server.starttls() server.login(username,passwd) server.sendmail(fromadd,toadd,msg) print("Mail Send Successfully") server.quit() except: print("Error:unable to send mail") NOTE:https://www.google.com/settings/security/lesssecureapps that should be enabled


def send_email(user, pwd, recipient, subject, body): import smtplib FROM = user TO = recipient if isinstance(recipient, list) else [recipient] SUBJECT = subject TEXT = body # Prepare actual message message = """From: %s/nTo: %s/nSubject: %s/n/n%s """ % (FROM, ", ".join(TO), SUBJECT, TEXT) try: server = smtplib.SMTP("smtp.gmail.com", 587) server.ehlo() server.starttls() server.login(user, pwd) server.sendmail(FROM, TO, message) server.close() print ''successfully sent the mail'' except: print "failed to send mail"

Si desea usar el puerto 465, debe crear un objeto SMTP_SSL :

# SMTP_SSL Example server_ssl = smtplib.SMTP_SSL("smtp.gmail.com", 465) server_ssl.ehlo() # optional, called by login() server_ssl.login(gmail_user, gmail_pwd) # ssl server doesn''t support or need tls, so don''t call server_ssl.starttls() server_ssl.sendmail(FROM, TO, message) #server_ssl.quit() server_ssl.close() print ''successfully sent the mail''


import smtplib server = smtplib.SMTP(''smtp.gmail.com'', 587) server.ehlo() server.starttls() server.login("fromaddress", "password") msg = "HI!" server.sendmail("fromaddress", "receiveraddress", msg) server.quit()