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





sendmail object (10)


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'

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



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.




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



    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



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




Devi dire EHLO prima di andare direttamente in STARTTLS :

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

Inoltre, dovresti veramente creare le intestazioni dei messaggi Da:, 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: [email protected]",
  "To: [email protected]",
  "Subject: Just a message",
  "",
  "Why, oh why"
  ])



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



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.




Sì, python ha un operatore ternario, ecco la sintassi e un codice di esempio per dimostrare lo stesso :)

#[On true] if [expression] else[On false]
# if the expression evaluates to true then it will pass On true otherwise On false


a= input("Enter the First Number ")
b= input("Enter the Second Number ")

print("A is Bigger") if a>b else print("B is Bigger")




python email smtp gmail