it-swarm.com.de

probleme mit smtplib und gmail - python script

Hier ist mein Skript:

#!/usr/bin/python

import smtplib
msg = 'Hello world.'

server = smtplib.SMTP('smtp.gmail.com',587) #port 465 or 587
server.ehlo()
server.starttls()
server.ehlo()
server.login('[email protected]','mypass')
server.sendmail('[email protected]','[email protected]',msg)
server.close()

Ich versuche nur, eine E-Mail von meinem Google Mail-Konto aus zu senden. Das Skript verwendet starttls aufgrund der Anforderung von gmail. Ich habe dies auf zwei Webhosts versucht, 1and1 und webfaction. 1and1 gibt mir einen Fehler "Verbindung abgelehnt" und Webfaction meldet keinen Fehler. Die E-Mail wird jedoch nicht gesendet. Ich kann nichts mit dem Skript sehen, daher denke ich, dass es mit den Web-Hosts zusammenhängt. Über Anregungen und Kommentare würden wir uns sehr freuen.

BEARBEITEN: Ich habe den Debug-Modus aktiviert. Es sieht so aus, als ob die Nachricht erfolgreich gesendet wurde ... Ich erhalte sie einfach nie.

send: 'ehlo web65.webfaction.com\r\n'
reply: '250-mx.google.com at your service, [174.133.21.84]\r\n'
reply: '250-SIZE 35651584\r\n'
reply: '250-8BITMIME\r\n'
reply: '250-STARTTLS\r\n'
reply: '250-ENHANCEDSTATUSCODES\r\n'
reply: '250 PIPELINING\r\n'
reply: retcode (250); Msg: mx.google.com at your service, [174.133.21.84]
SIZE 35651584
8BITMIME
STARTTLS
ENHANCEDSTATUSCODES
PIPELINING
send: 'STARTTLS\r\n'
reply: '220 2.0.0 Ready to start TLS\r\n'
reply: retcode (220); Msg: 2.0.0 Ready to start TLS
send: 'ehlo web65.webfaction.com\r\n'
reply: '250-mx.google.com at your service, [174.133.21.84]\r\n'
reply: '250-SIZE 35651584\r\n'
reply: '250-8BITMIME\r\n'
reply: '250-AUTH LOGIN PLAIN\r\n'
reply: '250-ENHANCEDSTATUSCODES\r\n'
reply: '250 PIPELINING\r\n'
reply: retcode (250); Msg: mx.google.com at your service, [174.133.21.84]
SIZE 35651584
8BITMIME
AUTH LOGIN PLAIN
ENHANCEDSTATUSCODES
PIPELINING
send: 'AUTH PLAIN *****\r\n'
reply: '235 2.7.0 Accepted\r\n'
reply: retcode (235); Msg: 2.7.0 Accepted
send: 'mail FROM:<[email protected]> size=12\r\n'
reply: '250 2.1.0 OK 4sm652580yxq.48\r\n'
reply: retcode (250); Msg: 2.1.0 OK 4sm652580yxq.48
send: 'rcpt TO:<[email protected]>\r\n'
reply: '250 2.1.5 OK 4sm652580yxq.48\r\n'
reply: retcode (250); Msg: 2.1.5 OK 4sm652580yxq.48
send: 'data\r\n'
reply: '354  Go ahead 4sm652580yxq.48\r\n'
reply: retcode (354); Msg: Go ahead 4sm652580yxq.48
data: (354, 'Go ahead 4sm652580yxq.48')
send: 'Hello world.\r\n.\r\n'
reply: '250 2.0.0 OK 1240421143 4sm652580yxq.48\r\n'
reply: retcode (250); Msg: 2.0.0 OK 1240421143 4sm652580yxq.48
data: (250, '2.0.0 OK 1240421143 4sm652580yxq.48')
25
spencewah

Ich denke, dass der GMail SMTP-Server eine Reverse-DNS-Suche für die IP-Adresse durchführt, von der aus Sie eine Verbindung herstellen, und die Verbindung ablehnt, wenn keine Domäne gefunden werden kann. Dies soll verhindern, dass Spammer ihren SMTP-Server als offenes Relay verwenden.

7
Martin Cote

Haben Sie versucht, eine gültige Nachricht zu erstellen?

from email.MIMEText import MIMEText

msg = MIMEText('body')
msg['Subject'] = 'subject'
msg['From'] = "..."
msg['Reply-to'] = "..."
msg['To'] = "..."
8
Toni Ruža

Ich weiß nicht, ob OP sich immer noch für diese Antwort interessiert, aber da ich mich hier bemüht habe, ein ähnliches Problem zu beheben, könnte dies für andere hilfreich sein. Wie sich herausgestellt hat, hat Google die Art und Weise geändert, in der sie die Verwendung ihres SMTP-Servers zulassen. Sie möchten ein paar Dinge prüfen:

  1. Dass Sie dieselbe Adresse verwenden, die Sie zur Authentifizierung als "von" -Adresse verwendet haben. Wenn ich mich nicht irre, war es früher so, dass Sie so ziemlich alles, was Sie wollten, in das Feld "Von" setzen konnten, aber aus Sicherheitsgründen beschränken viele SMTP-Host-Sites (einschließlich Google) dies nun auf die Adresse, die sich mit ihnen authentifiziert hat.

  2. Erlauben Sie Ihrem Konto den Zugriff durch "weniger sichere Apps" (lesen Sie: Apps, mit denen wir keinen Umsatz erzielen). Melden Sie sich dazu in Ihrem Konto an und navigieren Sie hier: https://www.google.com/settings/security/lesssecureapps

  3. Verwenden Sie Port 587 mit tls. Ich weiß nicht genau warum, aber ich könnte niemals Port 465 für Nizza spielen.

Hoffe, das hilft jemandem anderen raus.

7
krayzk

Einige Eigenwerbung hier, aber ich fühle mich auf einem guten Grund.

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

import yagmail
yag = yagmail.SMTP('[email protected]')
yag.send('[email protected]', subject = None, contents = 'Hello')

Oder eine Einlage:

yagmail.SMTP('[email protected]').send('[email protected]', None, 'Hello world.')

Was schön ist, ist, dass ich vorschlage, den Schlüsselring zum Speichern Ihres Passworts zu verwenden, so dass Sie niemals das Risiko eingehen, dass Personen Ihr Passwort in Ihrem Skript sehen.

Sie können dies einrichten, indem Sie einmal in Ihrem Interpreter ausführen:

import yagmail
yagmail.register("[email protected]", "mypassword")

und verlassen. Dann können Sie einfach verwenden:

import yagmail
yagmail.SMTP("[email protected]") # without password

Wenn Sie .yagmail mit "[email protected]" in Ihrem Heimatverzeichnis hinzufügen, können Sie einfach Folgendes tun: yagmail.SMTP(), aber das ist jetzt ziemlich sinnlos.

Warnung: Wenn Sie das Versenden vieler Nachrichten ernst meinen, richten Sie OAuth2 besser ein. Yagmail kann dabei helfen.

yagmail.SMTP("[email protected]", oauth2_file="/path/to/save/creds.json")

Beim ersten Mal werden Sie durch den Prozess geführt, in dem Sie die OAuth2-Anmeldeinformationen abrufen und in der Datei speichern, sodass Sie beim nächsten Mal nichts damit anfangen müssen. Haben Sie den Verdacht, dass jemand Ihre Zugangsdaten gefunden hat? Sie verfügen über eingeschränkte Berechtigungen, aber Sie machen ihre Anmeldeinformationen besser über Google Mail ungültig. 

Für das Paket/die Installation schauen Sie bitte nach git oder readthedocs , verfügbar für Python 2 und 3.

6
PascalVKooten
4
silent254

Sie müssen Ihren "Gesendet" -Ordner in GMail überprüfen, da dort höchstwahrscheinlich eine von Ihrem Konto an Ihr Konto gesendete Nachricht angezeigt wird.

2
fucx

Ich ging zu dem oben genannten Link und hatte drei verschiedene Adressen, an die ich senden konnte, aber ich erhielt drei E-Mails an dieselbe Adresse, und dies war die # 3-Adresse. 

http://mynthon.net/howto/-/python/python%20-%20logging.SMTPHandler-how-to-use-gmail-smtp-server.txt

import logging
import logging.handlers

class TlsSMTPHandler(logging.handlers.SMTPHandler):
def emit(self, record):
    """
    Emit a record.

    Format the record and send it to the specified addressees.
    """
    try:
        import smtplib
        import string # for tls add this line
        try:
            from email.utils import formatdate
        except ImportError:
            formatdate = self.date_time
        port = self.mailport
        if not port:
            port = smtplib.SMTP_PORT
        smtp = smtplib.SMTP(self.mailhost, port)
        msg = self.format(record)
        msg = "From: %s\r\nTo: %s\r\nSubject: %s\r\nDate: %s\r\n\r\n%s" % (
                        self.fromaddr,
                        string.join(self.toaddrs, ","),
                        self.getSubject(record),
                        formatdate(), msg)
        if self.username:
            smtp.ehlo() # for tls add this line
            smtp.starttls() # for tls add this line
            smtp.ehlo() # for tls add this line
            smtp.login(self.username, self.password)
        smtp.sendmail(self.fromaddr, self.toaddrs, msg)
        smtp.quit()
    except (KeyboardInterrupt, SystemExit):
        raise
    except:
        self.handleError(record)

logger = logging.getLogger()

gm = TlsSMTPHandler(("smtp.gmail.com", 587), '[email protected]', ['[email protected]', '[email protected]', '[email protected]'], 'unable to find Error!', ('[email protected]', 'mypassword'))
gm.setLevel(logging.ERROR)

logger.addHandler(gm)

try:
    1/0
except:
    logger.exception('It NO work for me!!-')
1
Jim

Es funktioniert

'''
Created on 2017/11/27

@author: devuser
'''

import smtplib
from email.mime.text import MIMEText
from email.utils import formatdate

FROM_ADDRESS = '[email protected]'
MY_PASSWORD = 'password'
TO_ADDRESS = '[email protected]'
BCC = '[email protected]'
SUBJECT = 'GmailのSMTPサーバ経由'
BODY = 'pythonでメール送信'


def create_message(from_addr, to_addr, bcc_addrs, subject, body):
    msg = MIMEText(body)
    msg['Subject'] = subject
    msg['From'] = from_addr
    msg['To'] = to_addr
    msg['Bcc'] = bcc_addrs
    msg['Date'] = formatdate()
    return msg


def send(from_addr, to_addrs, msg):
    smtpobj = smtplib.SMTP('smtp.gmail.com', 587)
    smtpobj.ehlo()
    smtpobj.starttls()
    smtpobj.ehlo()
    smtpobj.login(FROM_ADDRESS, MY_PASSWORD)
    smtpobj.sendmail(from_addr, to_addrs, msg.as_string())
    smtpobj.close()


if __== '__main__':

    to_addr = TO_ADDRESS
    subject = SUBJECT
    body = BODY

    msg = create_message(FROM_ADDRESS, to_addr, BCC, subject, body)
    send(FROM_ADDRESS, to_addr, msg)

https://qiita.com/okhrn/items/630a87ce1a44778bbeb1

0