smtp smtp - Come inviare una email con Gmail come provider usando Python?




sendmail object (10)

    import smtplib

    fromadd='[email protected]'
    toadd='[email protected]'

    msg='''hi,how r u'''
    username='[email protected]'
    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

Sto cercando 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 = '[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()

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 hai effettuato l'accesso 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('[email protected]', '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')

Continua a non funzionare? 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 procedi ora a fare un altro tentativo di accesso e dovrebbe funzionare.

AGGIORNAMENTO : Questo non sembra funzionare subito si potrebbe essere bloccato per un po 'ottenere 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 dell'utente, potrebbe essere necessario fino a un'ora prima che la modifica si avvii. Quindi prova di nuovo il processo di accesso.


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('[email protected]')
yag.send('[email protected]', 'Why,Oh why!')

O una sola nave:

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

Per il pacchetto / l'installazione, consultare git o pip , disponibile per Python 2 e 3.


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

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 server web, ma è bello avere delle 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 esempio che lo dimostra:

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


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

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

Aggiornamento : Sì, anche server.ehlo() potrebbe aiutare.


def send_email(user, pwd, recipient, subject, body):
    import smtplib

    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)
    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 si desidera utilizzare la porta 465, è necessario 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'

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

Prima di tutto, gli indici saranno da 0 a 4. I linguaggi di programmazione iniziano a contare da 0; non dimenticarlo o ti imbatterai in un indice fuori limite. Tutto ciò di cui hai bisogno nel ciclo for è un conteggio variabile da 0 a 4 in questo modo:

for x in range(0, 5):

Tieni presente che ho scritto da 0 a 5 perché il loop arresta un numero prima del massimo. :)

Utilizzare il valore di un indice

list[index]




python email smtp gmail