it-swarm-eu.dev

Come inviare un'email con Gmail come provider usando Python?

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()
264
Mahori

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"
  ])
199
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"

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'
280
David Okwii

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.

enter image description here

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.

123
radtek

Sei giù 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

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

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.

11
PascalVKooten

Questo funziona

Crea password APP Gmail!

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.

Successful email sent.

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.

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

5
JayRizzo

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

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.

  • Ovviamente, le e-mail dovrebbero essere passate a una coda non webserver, ma è bello avere opzioni.

È 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:

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

2
Tim Richardson

Sembra il problema del vecchio smtplib. In python2.7 tutto funziona bene.

Aggiornamento : Yep, server.ehlo() potrebbe anche aiutare.

1
mega.venik