it-swarm.com.de

Wie kann ich mit Python eine E-Mail mit Google Mail als Anbieter senden?

Ich versuche, eine E-Mail (Google Mail) mit Python zu senden, erhalte jedoch die folgende Fehlermeldung.

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.

Das Skript Python lautet wie folgt.

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

Sie müssen EHLO sagen, bevor Sie STARTTLS direkt aufrufen:

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

Außerdem sollten Sie wirklich From:-, To:- und Subject: -Nachrichtenkopfzeilen erstellen, die durch eine Leerzeile vom Nachrichtentext getrennt sind, und CRLF als EOL-Markierungen verwenden.

Z.B.

msg = "\r\n".join([
  "From: [email protected]",
  "To: [email protected]",
  "Subject: Just a message",
  "",
  "Why, oh why"
  ])
200
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"

wenn Sie Port 465 verwenden möchten, müssen Sie ein SMTP_SSL -Objekt erstellen:

# 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'
281
David Okwii

Ich stieß auf ein ähnliches Problem und stolperte über diese Frage. Ich habe einen SMTP-Authentifizierungsfehler erhalten, aber mein Benutzername/Pass war korrekt. Hier ist, was es behoben hat. Ich lese das:

https://support.google.com/accounts/answer/6010255

Zusammenfassend lässt Google nicht zu, dass Sie sich über smtplib anmelden, da diese Art der Anmeldung als "weniger sicher" gekennzeichnet ist. Sie müssen also zu diesem Link wechseln, während Sie in Ihrem Google-Konto angemeldet sind. und erlauben den Zugang:

https://www.google.com/settings/security/lesssecureapps

Sobald das eingestellt ist (siehe mein Screenshot unten), sollte es funktionieren.

enter image description here

Login funktioniert jetzt:

smtpserver = smtplib.SMTP("smtp.gmail.com", 587)
smtpserver.ehlo()
smtpserver.starttls()
smtpserver.ehlo()
smtpserver.login('[email protected]', 'me_pass')

Antwort nach Änderung:

(235, '2.7.0 Accepted')

Antwort vor:

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

Funktioniert es immer noch nicht? Wenn Sie immer noch den SMTPAuthenticationError erhalten, der Code aber jetzt 534 lautet, liegt dies daran, dass der Speicherort unbekannt ist. Folge diesem Link:

https://accounts.google.com/DisplayUnlockCaptcha

Klicken Sie auf "Weiter". Dadurch erhalten Sie 10 Minuten Zeit, um Ihre neue App zu registrieren. Fahren Sie jetzt mit einem weiteren Anmeldeversuch fort und es sollte funktionieren.

UPDATE: Dies scheint nicht sofort zu funktionieren. Möglicherweise stecken Sie eine Weile fest und erhalten den folgenden Fehler in smptlib:

235 == 'Authentication successful'
503 == 'Error: already authenticated'

Die Meldung besagt, dass Sie den Browser zum Anmelden verwenden müssen:

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

Nachdem Sie "lesssecureapps" aktiviert haben, gehen Sie auf einen Kaffee, kehren Sie zurück und versuchen Sie den Link "DisplayUnlockCaptcha" erneut. In der Praxis kann es bis zu einer Stunde dauern, bis die Änderung wirksam wird. Versuchen Sie dann erneut, sich anzumelden.

124
radtek

Bist du mit OOP fertig?

#!/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')
17
Ricky Wilson

Sie finden es hier: 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

Nicht direkt verwandt, aber es lohnt sich darauf hinzuweisen, dass mein Paket versucht, das Senden von Google Mail-Nachrichten wirklich schnell und schmerzlos zu machen. Es wird auch versucht, eine Fehlerliste zu führen und sofort auf die Lösung zu verweisen.

Es würde buchstäblich nur diesen Code benötigen, um genau das zu tun, was Sie geschrieben haben:

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

Oder ein Einzeiler:

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

Informationen zum Paket/zur Installation finden Sie unter git oder pip , verfügbar für Python 2 und 3.

11
PascalVKooten

Das funktioniert

Gmail APP Passwort erstellen!

Nachdem Sie das erstellt haben, erstellen Sie eine Datei mit dem Namen sendgmail.py

Dann füge diesen Code hinz :

#!/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)

Wenn Sie also erfolgreich sind, wird ein Bild wie das folgende angezeigt:

Ich habe getestet, indem ich eine E-Mail von und an mich selbst gesendet habe.

Successful email sent.

Hinweis: Ich habe die Bestätigung in zwei Schritten in meinem Konto aktiviert . App Password funktioniert damit!

Diese Einstellung ist für Konten mit aktivierter Bestätigung in zwei Schritten nicht verfügbar. Für solche Konten ist ein anwendungsspezifisches Kennwort erforderlich, um auf weniger sichere Apps zugreifen zu können.

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

8
JayRizzo

großartige Antwort von @David, hier ist für Python 3 ohne den generischen try-except:

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

Es gibt jetzt eine Google Mail-API, mit der Sie E-Mails senden, lesen und Entwürfe über REST erstellen können. Im Gegensatz zu SMTP-Aufrufen ist es nicht blockierend, was für Thread-basierte Webserver von Vorteil sein kann, die E-Mails im Anforderungs-Thread senden (z. B. python Webserver). Die API ist auch sehr leistungsfähig.

  • Natürlich sollte E-Mail an eine Nicht-Webserver-Warteschlange weitergeleitet werden, aber es ist schön, Optionen zu haben.

Das Einrichten ist am einfachsten, wenn Sie über Administratorrechte für Google Apps in der Domain verfügen, da Sie dann Ihrem Kunden die allgemeine Berechtigung erteilen können. Andernfalls müssen Sie mit der OAuth Authentifizierung und Erlaubnis experimentieren.

Hier ist ein Gist, der dies demonstriert:

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

2
Tim Richardson

Scheint ein Problem des alten smtplib zu sein. In python2.7 funktioniert alles gut.

pdate: Ja, server.ehlo() könnte auch helfen.

1
mega.venik