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()
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"
])
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'
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.
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.
#!/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')
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())
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.
Après avoir créé cela, créez un fichier nommé sendgmail.py
#!/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.
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.
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()
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.
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:
On dirait que le problème de l'ancien smtplib
. Dans python2.7
tout fonctionne bien.
Mise à jour: Oui, server.ehlo()
pourrait également aider.