Frage

Hier ist mein Drehbuch:

#!/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('myname@gmail.com','mypass')
server.sendmail('myname@gmail.com','somename@somewhere.com',msg)
server.close()

Ich versuche nur, eine E -Mail von meinem Google Mail -Konto zu senden. Das Skript verwendet Starttls aufgrund der Anforderung von Google Mail. Ich habe dies auf zwei Web -Hosts ausprobiert, 1 und 1 und WebFaction. 1And1 gibt mir einen Fehler und Webfaktionsberichte "Verbindung verweigert" und sendet die E -Mail jedoch nicht. Ich kann nichts mit dem Skript falsch sehen, also denke ich, dass es mit den Webhosts zusammenhängt. Alle Gedanken und Kommentare wären sehr geschätzt.

Bearbeiten: Ich habe den Debug -Modus eingeschaltet. Aus der Ausgabe sieht es so aus, als hätten die Nachricht erfolgreich geschickt ... ich habe sie einfach nie erhalten.

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:<myname@gmail.com> 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:<myname@gmail.com>\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')
War es hilfreich?

Lösung

Ich denke, dass der Google Mail SMTP -Server eine umgekehrte DNS -Suche in der IP -Adresse durchführt, aus der Sie eine Verbindung herstellen, und die Verbindung ablehnt, wenn keine Domäne gefunden werden kann. Dies soll vermeiden, dass Spammer seinen SMTP -Server als offenes Relais verwenden.

Andere Tipps

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'] = "..."

Ich weiß nicht, ob OP immer noch um diese Antwort kümmert, aber nachdem ich mich hier befunden habe, um bei einem ähnlichen Problem zu beheben, könnte es hoffentlich jemand anderes nützlich finden. Wie sich herausstellt, hat Google die Art und Weise geändert, wie es sein SMTP -Server verwendet werden kann. Sie werden ein paar Dinge überprüfen möchten:

  1. Dass Sie dieselbe Adresse verwenden, die Sie verwendet haben, um die Adresse zu authentifizieren. Wenn ich mich nicht irre, ist es früher der Fall, dass Sie so ziemlich alles, was Sie vom Feld gewünscht haben, einsetzen konnten, aber für Sicherheitszwecke beschränken sich viele SMTP -Host -Sites (einschließlich Google) jetzt auf die Adresse, die sich mit ihnen authentifiziert hat.

  2. Lassen Sie Ihr Konto von "weniger sicheren Apps" zugreifen (lesen Sie: Apps, aus denen wir keine Einnahmen generieren). Melden Sie sich in Ihrem Konto an und navigieren Sie hier:https://www.google.com/setings/security/lesssecureApps

  3. Verwenden Sie Port 587 mit TLS. Ich bin mir nicht sicher, warum, aber ich konnte nie Port 465 zum Spielen bekommen.

Hoffe das hilft jemand anderem aus.

Einige Selbstwerbung hier, aber ich fühle mich auf einem gültigen Boden.

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

import yagmail
yag = yagmail.SMTP('myname@gmail.com')
yag.send('somename@somewhere.com', subject = None, contents = 'Hello')

Oder ein One -Liner:

yagmail.SMTP('myname@gmail.com').send('somename@somewhere.com', None, 'Hello world.')

Was schön ist, ist, dass ich vorschlägt, den Schlüsselring zu verwenden, um Ihr Passwort zu speichern. Sie haben also nie die Gefahr, dass Personen Ihr Passwort in Ihrem Skript sehen.

Sie können dies einrichten, indem Sie einmal in Ihrem Dolmetscher ausgeführt werden:

import yagmail
yagmail.register("my@gmail.com", "mypassword")

und verlassen. Dann können Sie nur verwenden:

import yagmail
yagmail.SMTP("my@gmail.com") # without password

Wenn Sie .yagmail mit "my@gmail.com" in Ihrem Home -Dir hinzufügen, können Sie einfach: yagmail.SMTP(), aber das ist inzwischen ziemlich sinnlos.

Warnung: Wenn Sie es ernst meinen, viele Nachrichten zu senden, besser einrichten, kann Yagmail dabei helfen.

yagmail.SMTP("my@gmail.com", oauth2_file="/path/to/save/creds.json")

Beim ersten Mal führt es Sie durch den Prozess, OAuth2 -Anmeldeinformationen zu erhalten und in der Datei zu speichern, damit Sie das nächste Mal nichts damit tun müssen. Verdhalten Sie, dass jemand Ihre Anmeldeinformationen gefunden hat? Sie haben nur begrenzte Berechtigungen, aber Sie werden ihre Anmeldeinformationen durch Google Mail besser ungültig machen.

Für das Paket/die Installation schauen Sie sich bitte an Git oder Readthedocs, erhältlich für Python 2 und 3.

Sie müssen Ihren "gesendeten" Ordner in Google Mail überprüfen, da eine Nachricht, die von Ihrem Konto an Ihr Konto gesendet wird, höchstwahrscheinlich angezeigt wird.

Ich ging zu dem oben genannten Link und hatte 3 unterschiedliche Adressen, an die ich gesendet habe, aber ich erhielt drei E -Mails an dieselbe Adresse und die #3 -Adresse.

http://mynthon.net/howto/-/python/python%20-%20logging.smtphandler-how-to-use-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), 'myusername@gmail.com', ['address1@gmail.com', 'address2@gmail.com', 'address3@gmail.com'], 'unable to find Error!', ('myusername@gmail.com', 'mypassword'))
gm.setLevel(logging.ERROR)

logger.addHandler(gm)

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

Es funktioniert

'''
Created on 2017/11/27

@author: devuser
'''

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

FROM_ADDRESS = 'sender@gmail.com'
MY_PASSWORD = 'password'
TO_ADDRESS = 'receiver@test.co.jp'
BCC = 'receiver2@test.net'
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 __name__ == '__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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top