2009-04-22 7 views
24

Hier ist mein Skript:smtplib und gmail - Python-Skript Probleme

#!/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 zu senden. Das Skript verwendet starttls wegen der Anforderung von Google Mail. Ich habe das auf zwei Web-Hosts versucht, 1and1 und webfaction. 1and1 gibt mir den Fehler "Verbindung verweigert" und webfaction meldet keinen Fehler, sendet aber die E-Mail einfach nicht. Ich kann nichts falsch mit dem Skript sehen, also denke ich, dass es mit den Webhosts verwandt sein könnte. Alle Gedanken und Kommentare würden sehr geschätzt werden.

EDIT: Ich habe Debug-Modus eingeschaltet. Von der Ausgabe sieht es so aus, als hätte es die Nachricht erfolgreich gesendet ... Ich empfange es 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') 
+2

Sie können direkt die E-Mail über Ihren normalen SMTP-Relay, statt Aufruf gmail senden. – gimel

+1

Wie schalten Sie den Debug-Modus ein, um diese Ausgabenachrichten zu erhalten? – trusktr

+3

smtplib.set_debuglevel (True) wird Sie sortieren, @trusktr – hd1

Antwort

7

Ich denke, dass die GMail SMTP-Server funktioniert ein Reverse-DNS-Lookup auf die IP-Adresse, die Sie von zu verbinden, und weigert sich, die Verbindung, wenn keine Domäne gefunden werden kann. Dies soll verhindern, dass Spammer ihren SMTP-Server als offenes Relay benutzen.

+4

Es könnte auch Ihr Internet-Zugang-Provider verbieten abgehende Verbindungen zu SMTP-Servern anders als ihre. –

+1

Ich denke, es ist der ISP. Ich habe den Code ausprobiert und es hat gut für mich funktioniert. – hwiechers

+35

Wenn GMail die DNS-Suche umkehrt und Verbindungen ablehnt, wie kann ich meinen Desktop-E-Mail-Client wie thunderbird verwenden, um E-Mails über den SMTP-Server von Google Mail zu senden? –

8

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

Sie müssen Ihre „Gesendet“ -Ordner in GMail zu überprüfen, wie das ist, wo eine Nachricht von Ihrem Konto auf Ihr Konto gesendet wird wahrscheinlich erscheinen.

0

ich auf die oben erwähnte Verbindung ging und hatte 3 verschiedene Adressen zu schicken, aber ich erhielt drei E-Mails an die gleiche Adresse und die Adresse # 3.

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

Ich weiß noch nicht, ob OP über diese Antwort interessiert, aber mich hier in dem Bemühen, gefunden zu haben, ein ähnliches Problem zu beheben, hoffentlich jemand anderes diese nützlich finden könnte. Wie sich herausstellt, hat Google die Art und Weise geändert, in der sie ihren SMTP-Server verwenden dürfen. Sie werden ein paar Dinge überprüfen wollen:

  1. dass Sie die gleiche Adresse verwenden Sie als die ‚von‘ Adresse verwendet zu authentifizieren. Wenn ich mich nicht irre, war es früher so, dass Sie im from-Feld so ziemlich alles setzen konnten, was Sie wollten, aber aus Sicherheitsgründen beschränken viele SMTP-Host-Sites (einschließlich google) dies jetzt auf die Adresse, die mit ihnen authentifiziert wurde.

  2. Erlauben Sie Ihrem Konto den Zugriff auf 'weniger sichere Apps' (lesen Sie: Apps, von denen wir keinen Umsatz generieren). 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. Nicht wirklich sicher warum, aber ich konnte Port 465 nie dazu bringen, nett zu spielen.

Hoffe das hilft jemand anderen aus.

+0

Antwort, wo bist du gewesen ?! –

5

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

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

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

oder ein Motto:

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

Was ist schön ist, dass ich Ihre vorschlagen Schlüsselbund verwenden zu speichern Passwort, so dass Sie nie Gefahr laufen, dass Ihr Passwort in Ihrem Skript angezeigt wird.

Für das Paket/Installation finden Sie in git oder pip, für beide Python 2 und 3.

+0

Danke für die Verbesserung, ich versuche wirklich mehr Aufmerksamkeit auf das Paket zu bekommen! – PascalVKooten

+1

'SMTPAuthenticationError: Bitte melden Sie sich über Ihren Webbrowser an und \ n5.7.14 und versuchen Sie es erneut. \ N5.7.14 Weitere Informationen erhalten Sie unter \ n5.7.14 https://support.google.com/mail/answer/78754 vl1sm48001045pbc.31 - gsmtp ') ' –

+0

@ Death-Stalker Scheint so, als hättest du einen Fehler gemacht, als du dein Passwort geschrieben hast? – PascalVKooten