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

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  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 = 'user_me@gmail.com' toaddrs = 'user_you@gmail.com' msg = 'Why,Oh why!' username = 'user_me@gmail.com' password = 'pwd' server = smtplib.SMTP('smtp.gmail.com:587') server.starttls() server.login(username,password) server.sendmail(fromaddr, toaddrs, msg) server.quit() 

EHLO decir EHLO antes de ejecutar directamente en STARTTLS :

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

También debería crear realmente los 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: user_me@gmail.com", "To: user_you@gmail.com", "Subject: Just a message", "", "Why, oh why" ]) 
 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' 

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”, por lo que debe hacer clic en este enlace mientras está conectado a su cuenta de Google. y permitir el acceso:

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

Una vez que se establece (ver mi captura de pantalla a continuación), debería funcionar.

introduzca la descripción de la imagen aquí

Iniciar sesión ahora funciona:

 smtpserver = smtplib.SMTP("smtp.gmail.com", 587) smtpserver.ehlo() smtpserver.starttls() smtpserver.ehlo() smtpserver.login('me@gmail.com', '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 le dará 10 minutos para registrar su nueva aplicación. Entonces proceda a hacer otro bash 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 que use 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.

¿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') 

Puede encontrarlo 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()) 

No relacionado directamente, pero aún así vale la pena señalar que mi paquete intenta que el envío de mensajes de Gmail sea realmente rápido y sencillo. 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('user_me@gmail.com') yag.send('user_you@gmail.com', 'Why,Oh why!') 

O un trazador de líneas:

 yagmail.SMTP('user_me@gmail.com').send('user_you@gmail.com', 'Why,Oh why!') 

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

Esto funciona

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

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

Luego agregue 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 = 'THEFROM@gmail.com' gmail_app_password = 'YOUR-GOOGLE-APPLICATION-PASSWORD!!!!' # ============================================================================= # SET THE INFO ABOUT THE SAID EMAIL # ============================================================================= sent_from = gmail_user sent_to = ['THE-TO@gmail.com', 'THE-TO@gmail.com'] 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í.

Correo electrónico enviado con éxito.

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.

Acceso a aplicaciones menos seguro ... Esta configuración no está disponible para cuentas con la verificación de 2 pasos habilitada.

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 locking, 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

gran 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() 

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

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

  import smtplib fromadd='from@gmail.com' toadd='send@gmail.com' msg='''hi,how r u''' username='abc@gmail.com' 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 
 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()