it-swarm-es.com

¿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 <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()
257
Mahori

Debes decir EHLO antes de correr directamente a 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: [email protected]",
  "To: [email protected]",
  "Subject: Just a message",
  "",
  "Why, oh why"
  ])
197
MattH
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'
277
David Okwii

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.

enter image description here

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

¿Todavía no funciona? 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 intento de inicio de sesión ahora y debería funcionar.

ACTUALIZACI&OACUTE;N: Esto no parece funcionar de inmediato, puede que te quedes estancado por un tiempo y 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.

123
radtek

¿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')
16
Ricky Wilson

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())
14
Froyo

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('[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.

11
PascalVKooten

Esto funciona

Crear 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í.

 Successful email sent.

Nota: Tengo Verificación en 2 pasos habilitado 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.

 Less secure app access... This setting is not available for accounts with 2-Step Verification enabled.

5
JayRizzo

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()
2
juan Isaza

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 ser entregado a una cola que no sea del 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 un Gist que lo demuestra:

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

2
Tim Richardson

Parece el problema de la antigua smtplib. En python2.7 todo funciona bien.

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

1
mega.venik