Comment envoyer un e-mail avec Gmail comme fournisseur en utilisant Python?

j'essaie d'envoyer un e-mail (Gmail) en utilisant python, mais j'obtiens l'erreur suivante.

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.

le script Python est le suivant.

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

12 réponses

vous devez dire EHLO avant de courir tout droit dans STARTTLS :

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

vous devez aussi créer les en-têtes de messages From: , To: et Subject: , séparés du corps du message par une ligne blanche et utiliser CRLF comme marqueurs de fin de période.

E. G.

msg = "\r\n".join([
  "From: user_me@gmail.com",
  "To: user_you@gmail.com",
  "Subject: Just a message",
  "",
  "Why, oh why"
  ])
188
répondu MattH 2012-04-13 20:05:35
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 vous voulez utiliser le Port 465 vous devez créer un SMTP_SSL objet:

# 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'
262
répondu David Okwii 2018-05-09 17:46:19

j'ai rencontré un problème similaire et je suis tombé sur cette question. J'ai eu une erreur D'authentification SMTP mais mon nom d'utilisateur / pass était correct. Voici ce qu'il fixe. Je lis ceci:

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

en un mot, google ne vous permet pas de vous connecter via smtplib car il a marqué ce type de connexion comme "moins sûr", donc ce que vous devez faire est d'aller à ce lien pendant que vous êtes connecté à votre compte google, et permettre l'accès:

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

une fois que c'est réglé (voir ma capture d'écran ci-dessous), ça devrait marcher.

enter image description here

Login fonctionne maintenant:

smtpserver = smtplib.SMTP("smtp.gmail.com", 587)
smtpserver.ehlo()
smtpserver.starttls()
smtpserver.ehlo()
smtpserver.login('me@gmail.com', 'me_pass')

réponse après changement:

(235, '2.7.0 Accepted')

Réponse:

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

ça ne marche toujours pas? si vous obtenez toujours le SMTPAuthenticationError mais maintenant le code est 534, c'est parce que l'emplacement est inconnu. Suivez ce lien:

https://accounts.google.com/DisplayUnlockCaptcha

cliquez sur Continuer et vous aurez 10 minutes pour enregistrer votre nouvelle application. Ainsi, procédez à faire une autre tentative de connexion maintenant et cela devrait fonctionner.

mise à jour : cela ne semble pas fonctionner tout de suite vous pouvez être bloqué pendant un certain temps obtenir cette erreur dans smptlib:

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

Le message dit d'utiliser le navigateur pour vous connecter:

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

après avoir activé 'lesssecureapps', allez prendre un café, revenez, et réessayez le lien 'DisplayUnlockCaptcha'. D'après l'expérience des utilisateurs, le changement peut prendre jusqu'à une heure. Essayez de nouveau le processus de connexion.

115
répondu radtek 2016-03-29 17:49:04

vous pouvez le trouver ici: 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
répondu Froyo 2017-12-26 11:19:44

vous êtes avec 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')
12
répondu Ricky Wilson 2014-06-23 11:16:51

N'est pas directement lié mais mérite quand même d'être souligné est que mon paquet essaie de faire envoyer des messages gmail vraiment rapide et sans douleur. Il essaie également de maintenir une liste d'erreurs et tente de pointer vers la solution immédiatement.

il suffirait littéralement de ce code pour faire exactement ce que vous avez écrit:

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

ou une doublure unique:

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

pour le paquet / l'installation veuillez consulter git ou pip , disponible pour Python 2 et 3.

11
répondu PascalVKooten 2015-06-19 19:42:47

grande réponse de @David, Voici pour Python 3 sans l'essai Générique-sauf:

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
répondu juan Isaza 2017-08-01 22:56:11

semble être un problème de l'ancien smtplib . Dans python2.7 tout fonctionne très bien.

mise à Jour : Oui, server.ehlo() pourrait aussi aider.

1
répondu mega.venik 2012-04-13 20:13:52

il y a maintenant une API gmail qui vous permet d'envoyer des e-mails, de lire des e-mails et de créer des brouillons via REST. Contrairement aux appels SMTP, C'est le non-blocage qui peut être une bonne chose pour les serveurs qui envoient des e-mails dans le thread de requête (comme les serveurs web python). L'API est également très puissant.

  • bien sûr, l'e-mail doit être transmis à une file d'attente non-webserver, mais c'est bien d'avoir des options.

C'est plus facile à configurer si vous disposez de droits d'administrateur Googleapps sur le domaine, car vous pouvez donner une permission générale à votre client. Sinon, vous devez bidouiller avec L'authentification et la permission de OAuth.

voici un gist qui le démontre:

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

1
répondu Tim Richardson 2014-10-31 04:12:18

Ça Fonctionne

créer le mot de passe de L'application Gmail!

après que vous créez Que puis créer un fichier appelé sendgmail.py

puis ajouter ce code :

#!/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)

donc, si vous réussissez, vous verrez une image comme celle-ci:

j'ai testé en envoyant un email de et à moi-même.

Successful email sent.

Note: j'ai vérification en deux étapes activé sur mon compte. Le mot de passe de l'application fonctionne avec cela!

ce paramètre n'est pas disponible pour les comptes dont la vérification en deux étapes est activée. Ces comptes nécessitent un mot de passe spécifique à l'application pour accéder à des applications moins sécurisées.

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

1
répondu JayRizzo 2018-08-03 01:38:40
    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
-1
répondu Shyam Gupta 2016-06-14 18:52:39
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()
-2
répondu Sam Divya Kumar 2015-12-04 14:01:16