web-dev-qa-db-fra.com

Comment envoyer un email avec Gmail en tant que fournisseur utilisant Python?

J'essaye d'envoyer un email (Gmail) en utilisant python, mais je reçois une 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 = '[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()
266
Mahori

Vous devez dire EHLO avant de courir directement dans STARTTLS:

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

Aussi, vous devriez vraiment créer From:, To: et Subject: en-têtes de message, séparés du corps du message par une ligne vide et utiliser CRLF comme marqueurs EOL.

Par exemple.

msg = "\r\n".join([
  "From: [email protected]",
  "To: [email protected]",
  "Subject: Just a message",
  "",
  "Why, oh why"
  ])
200
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 vous voulez utiliser le port 465, vous devez créer un objet 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'
281
David Okwii

J'ai rencontré un problème similaire et suis tombé sur cette question. J'ai reçu une erreur d'authentification SMTP mais mon nom d'utilisateur/mot de passe était correct. Voici ce qui l'a corrigé. 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 signalé ce type de connexion comme "moins sécurisé". Vous devez donc vous rendre sur ce lien lorsque vous êtes connecté à votre compte Google. et permettre l'accès:

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

Une fois que cela est défini (voir ma capture d'écran ci-dessous), cela devrait fonctionner.

enter image description here

Connectez-vous maintenant fonctionne:

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

Réponse après changement:

(235, '2.7.0 Accepted')

Réponse préalable:

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

Ne fonctionne toujours pas? Si vous obtenez toujours SMTPAuthenticationError mais que le code est maintenant 534, c'est parce que l'emplacement est inconnu. Suivez ce lien:

https://accounts.google.com/DisplayUnlockCaptcha

Cliquez sur Continuer et cela devrait vous donner 10 minutes pour enregistrer votre nouvelle application. Continuez donc à faire une autre tentative de connexion maintenant et cela devrait fonctionner.

UPDATE: Cela ne semble pas fonctionner tout de suite. Vous pourriez être bloqué pendant un moment avec 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", prenez un café, revenez et essayez à nouveau le lien "DisplayUnlockCaptcha". Selon l'expérience de l'utilisateur, le changement peut prendre jusqu'à une heure. Ensuite, réessayez le processus de connexion.

124
radtek

Vous êtes en panne 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')
17
Ricky Wilson

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
Froyo

Ce qui n'est pas directement lié mais qui mérite d'être souligné, c'est que mon colis tente de rendre l'envoi de messages Gmail très rapide et sans douleur. Il essaie également de gérer une liste d'erreurs et de pointer immédiatement vers la solution.

Ce code n'a littéralement besoin que de faire exactement ce que vous avez écrit:

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

Ou un one liner:

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

Pour le package/l'installation, veuillez regarder git ou pip , disponible pour Python 2 et 3.

11
PascalVKooten

Cela marche

Créer un mot de passe Gmail APP!

Après avoir créé cela, créez un fichier nommé sendgmail.py

Ajoutez ensuite 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 = '[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)

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.

Remarque: J'ai la vérification en deux étapes activée sur mon compte. Le mot de passe d'application fonctionne avec cela!

Ce paramètre n'est pas disponible pour les comptes pour lesquels la vérification en 2 étapes est activée. Ces comptes nécessitent un mot de passe spécifique à l'application pour un accès moins sécurisé aux applications.

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

8
JayRizzo

excellente réponse de @David, la voici pour Python 3 sans le test 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
juan Isaza

Il existe maintenant une API gmail qui vous permet d’envoyer des courriers électroniques, de les lire et de créer des brouillons via REST. Contrairement aux appels SMTP, il ne s'agit pas d'un blocage, ce qui peut être une bonne chose pour les serveurs Web basés sur les threads qui envoient des courriels dans le fil de la requête (comme python serveurs Web). L'API est également assez puissant.

  • Bien sûr, le courrier électronique devrait être transféré à une file d’attente n’appartenant pas au serveur Web, mais il est agréable d’avoir des options.

Il est plus facile à configurer si vous disposez des droits d'administrateur Google Apps sur le domaine, car vous pouvez alors accorder une autorisation générale à votre client. Sinon, vous devez jouer avec OAuth authentification et autorisation.

Voici un résumé qui le démontre:

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

2
Tim Richardson

On dirait que le problème de l'ancien smtplib. Dans python2.7 tout fonctionne bien.

Mise à jour: Oui, server.ehlo() pourrait également aider.

1
mega.venik