Sto tentando di inviare email (Gmail) usando python, ma sto ricevendo un errore in seguito.
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.
Lo script Python è il seguente.
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()
Devi dire EHLO
prima di eseguire direttamente in STARTTLS
:
server = smtplib.SMTP('smtp.gmail.com:587')
server.ehlo()
server.starttls()
Inoltre dovresti davvero creare intestazioni di messaggio From:
, To:
e Subject:
, separate dal corpo del messaggio da una riga vuota e utilizzare CRLF
come marcatori EOL.
Per esempio.
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"
se vuoi usare Port 465 devi creare un oggetto 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'
Mi sono imbattuto in un problema simile e sono incappato in questa domanda. Ho ricevuto un errore di autenticazione SMTP ma il mio nome utente/pass era corretto. Ecco cosa lo ha risolto. Ho letto questo:
https://support.google.com/accounts/answer/6010255
In poche parole, google non ti consente di accedere tramite smtplib perché ha contrassegnato questo tipo di accesso come "meno sicuro", quindi quello che devi fare è andare su questo link mentre sei collegato al tuo account google, e consentire l'accesso:
https://www.google.com/settings/security/lesssecureapps
Una volta impostato (vedi il mio screenshot qui sotto), dovrebbe funzionare.
Accedi ora funziona:
smtpserver = smtplib.SMTP("smtp.gmail.com", 587)
smtpserver.ehlo()
smtpserver.starttls()
smtpserver.ehlo()
smtpserver.login('me@gmail.com', 'me_pass')
Risposta dopo modifica:
(235, '2.7.0 Accepted')
Risposta precedente:
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')
Ancora non funziona? Se si ottiene ancora SMTPAuthenticationError ma ora il codice è 534, perché la posizione è sconosciuta. Segui questo link:
https://accounts.google.com/DisplayUnlockCaptcha
Fai clic su Continua e questo dovrebbe darti 10 minuti per la registrazione della tua nuova app. Quindi procedere ora a un altro tentativo di accesso e dovrebbe funzionare.
UPDATE: Questo non sembra funzionare subito potresti rimanere bloccato per un po 'con questo errore in smptlib:
235 == 'Authentication successful'
503 == 'Error: already authenticated'
Il messaggio dice di usare il browser per accedere:
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')
Dopo aver abilitato "lesssecureapps", prendi un caffè, torna indietro e prova nuovamente il link "DisplayUnlockCaptcha". Dall'esperienza degli utenti, potrebbe essere necessario fino a un'ora prima che la modifica si avvii. Quindi prova di nuovo il processo di accesso.
#!/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')
Puoi trovarlo qui: 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())
Non direttamente correlato, ma vale comunque la pena sottolineare che il mio pacchetto cerca di rendere l'invio di messaggi Gmail molto veloce e indolore. Cerca anche di mantenere un elenco di errori e cerca di indicare immediatamente la soluzione.
Avrebbe letteralmente bisogno solo di questo codice per fare esattamente quello che hai scritto:
import yagmail
yag = yagmail.SMTP('user_me@gmail.com')
yag.send('user_you@gmail.com', 'Why,Oh why!')
O una sola nave:
yagmail.SMTP('user_me@gmail.com').send('user_you@gmail.com', 'Why,Oh why!')
Per il pacchetto/installazione si prega di guardare git o pip , disponibile per entrambi Python 2 e 3.
Dopo averlo creato, quindi creare un file chiamato sendgmail.py
Quindi aggiungi questo codice :
#!/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)
Quindi, se hai successo, vedrai un'immagine come questa:
Ho provato inviando un'e-mail da e per me stesso.
Nota: ho Verifica in due passaggi abilitata sul mio account. App Password funziona con questo!
Questa impostazione non è disponibile per gli account con la verifica in due passaggi abilitata. Tali account richiedono una password specifica per l'applicazione per un accesso meno sicuro alle app.
ottima risposta da @David, ecco per Python 3 senza la prova generica, tranne:
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()
Ora c'è un'API di Gmail che ti consente di inviare email, leggere email e creare bozze tramite REST. A differenza delle chiamate SMTP, è non-bloccante che può essere una buona cosa per i server web basati su thread che inviano email nel thread di richiesta (come i server web Python). L'API è anche abbastanza potente.
È più semplice da configurare se disponi dei diritti di amministratore di Google Apps sul dominio, poiché in tal caso puoi concedere l'autorizzazione coperta al tuo cliente. Altrimenti devi armeggiare con l'autenticazione e l'autorizzazione OAuth.
Ecco un Gist che lo dimostra:
Sembra il problema del vecchio smtplib
. In python2.7
tutto funziona bene.
Aggiornamento : Yep, server.ehlo()
potrebbe anche aiutare.