web-dev-qa-db-de.com

Fehler beim Senden einer E-Mail mit dem Python-Beispiel

Ich habe versucht (und habe es versäumt) herauszufinden, wie man E-Mails über Python versendet.

Versuchen Sie das Beispiel von hier aus: http://docs.python.org/library/smtplib.html#smtplib.SMTP

aber fügte die Zeile server = smtplib.SMTP_SSL('smtp.gmail.com', 465) hinzu, nachdem ich einen Rücksprung bekommen hatte, weil ich keine SSL-Verbindung habe. 

Jetzt bekomme ich das:

Traceback (most recent call last):
  File "C:/Python26/08_emailconnects/12_29_EmailSendExample_NotWorkingYet.py", line 37, in <module>
    server = smtplib.SMTP('smtp.gmail.com', 65)
  File "C:\Python26\lib\smtplib.py", line 239, in __init__
    (code, msg) = self.connect(Host, port)
  File "C:\Python26\lib\smtplib.py", line 295, in connect
    self.sock = self._get_socket(Host, port, self.timeout)
  File "C:\Python26\lib\smtplib.py", line 273, in _get_socket
    return socket.create_connection((port, Host), timeout)
  File "C:\Python26\lib\socket.py", line 512, in create_connection
    raise error, msg
error: [Errno 10060] A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected Host has failed to respond
>>> 

Gedanken?


server = smtplib.SMTP ("smtp.google.com", 495) gibt mir einen Timeout-Fehler. Nur smtplib.smtp ("smtp.google.com", 495) gibt mir "SSLError: [Errno 1] _ssl.c: 480: Fehler: 140770FC: SSL-Routinen: SSL23_GET_SERVER_HELLO: unbekanntes Protokoll" (siehe unten).

Ich probiere verschiedene Ports aus und jetzt bekomme ich einen völlig neuen Fehler. Ich werde einfach den ganzen Code posten, wahrscheinlich mache ich einen Anfängerfehler.

"

import smtplib

mailuser = '[email protected]'

mailpasswd = 'MYPASSWORD'

fromaddr = '[email protected]'

toaddrs = '[email protected]'

msg = 'Hooooorah!'

print msg

server = smtplib.SMTP_SSL('smtp.google.com')

server = smtplib.SMTP_SSL_PORT=587

server.user(mailuser)

server.pass_(mailpasswd)

server.set_debuglevel(1)

server.sendmail(fromaddr, toaddrs, msg)

server.quit()

"

und dann erhalte ich diese Fehlermeldung: "

Traceback (most recent call last):
  File "C:/Python26/08_emailconnects/12_29_eMAILSendtryin_stripped.py", line 16, in <module>
    server = smtplib.SMTP_SSL('smtp.google.com')
  File "C:\Python26\lib\smtplib.py", line 749, in __init__
    SMTP.__init__(self, Host, port, local_hostname, timeout)
  File "C:\Python26\lib\smtplib.py", line 239, in __init__
    (code, msg) = self.connect(Host, port)
  File "C:\Python26\lib\smtplib.py", line 295, in connect
    self.sock = self._get_socket(Host, port, self.timeout)
  File "C:\Python26\lib\smtplib.py", line 755, in _get_socket
    self.sock = ssl.wrap_socket(self.sock, self.keyfile, self.certfile)
  File "C:\Python26\lib\ssl.py", line 350, in wrap_socket
    suppress_ragged_eofs=suppress_ragged_eofs)
  File "C:\Python26\lib\ssl.py", line 118, in __init__
    self.do_handshake()
  File "C:\Python26\lib\ssl.py", line 293, in do_handshake
    self._sslobj.do_handshake()
SSLError: [Errno 1] _ssl.c:480: error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol

"

beachten Sie, dass das, was wie "server = smtplib.SMTPSSLPORT = 587" aussieht, tatsächlich "server = smtplib.SMTP Unterstrich SSL Unterstrich PORT = 587" ist, es gibt eine Art Formatierungssache hier los.

21
Chatter

Der folgende Code funktioniert für mich:

import smtplib

FROMADDR = "[email protected]"
LOGIN    = FROMADDR
PASSWORD = "my.real.password"
TOADDRS  = ["[email protected]"]
SUBJECT  = "Test"

msg = ("From: %s\r\nTo: %s\r\nSubject: %s\r\n\r\n"
       % (FROMADDR, ", ".join(TOADDRS), SUBJECT) )
msg += "some text\r\n"

server = smtplib.SMTP('smtp.gmail.com', 587)
server.set_debuglevel(1)
server.ehlo()
server.starttls()
server.login(LOGIN, PASSWORD)
server.sendmail(FROMADDR, TOADDRS, msg)
server.quit()

Ich verwende Python 2.5.2.

Edit : Port wurde von 25 auf 587 geändert, wie von ΤΖΩΤΖΙΟΥ vorgeschlagen, und das zweite Ehlo () verworfen. Nun würde ich gerne wissen, warum Port 25 perfekt von meinem Rechner aus funktioniert (und Port 465 tut nicht).

28

Die korrekte Verbindung mit GMail über SSL ist wie folgt:

server = smtplib.SMTP('smtp.gmail.com', 587)

Port 465 scheint Verzögerungen zu verursachen. Beide Ports sind in einem GMail FAQ angegeben.

Beachten Sie, dass die Verwendung von Port 587 für SMTP über SSL üblicher ist, obwohl dies nur triviale Informationen sind und keine andere praktische Verwendung hat.

Diese Antwort wird als Community-Wiki bereitgestellt, um als "Antwort" ausgewählt zu werden. Bitte verbessern Sie bei Bedarf.

7
tzot

Das Problem liegt an einem Fehler in Python . Der Versuch, eine Verbindung mit SMTP_SSL herzustellen, schlägt fehl mit "SMTPServerDisconnected: Bitte führen Sie zuerst connect () aus."

Es wurde ein Fix bereitgestellt, mit dem Sie Ihre lokale Kopie patchen können. Siehe den Anhang "smtplib_72551.diff".

(Hinweis: SMTP_SSL ist eine neue Klasse, die Python 2.6/3.0 und höher hinzugefügt wurde.)

6
keithb

Hier ist eine einfache Wegwerflösung. Ich wollte das früher einfügen, schlief aber an meinem Stuhl ein.


import smtplib
import email
import os

username = "[email protected]"
passwd = "password"

def mail(to, subject, text, attach):
   msg = MIMEMultipart()

   msg['From'] = username
   msg['To'] = to
   msg['Subject'] = subject

   msg.attach(MIMEText(text)) 

   part = MIMEBase('application', 'octet-stream')
   part.set_payload(open(attach, 'rb').read())
   Encoders.encode_base64(part)
   part.add_header('Content-Disposition',
           'attachment; filename="%s"' % os.path.basename(attach))
   msg.attach(part)

   server = smtplib.SMTP("smtp.gmail.com", 495)
   server.ehlo()
   server.starttls()
   server.ehlo()
   server.login(username, passwd)
   server.sendmail(username, to, msg.as_string())
   server.close()

mail("you", "hi", "hi", "webcam.jpg")

Ich gehe davon aus, dass die meisten Leute in diesem Thread, die erfolgreiche Versuche mit ihrem Code hatten, nicht auf win32 sind. ;)

* edit: Siehe http://docs.python.org/library/email-examples.html für einige "offizielle" Beispiele. 

6
EndUsr

Okay, herausgefunden, dass diese Codezeile den Trick erfüllt!

server = smtplib.SMTP ('smtp.gmail.com', 587)

Es stellte sich heraus, dass GMAIL SSL an Port 25 nicht unterstützte (und Port 465 verursachte aus irgendeinem Grund ein Problem).

Danke Leute!

2
Chatter
from smtplib import SMTP_SSL as SMTP
from email.mime.text import MIMEText

Host = 'smtp.gmail.com'
PORT = 465

USERNAME = '[email protected]'
PASSWORD = ''

SENDER = '[email protected]'
RECIPIENT = '[email protected]'

text_subtype = 'plain'

with open('textfile', 'rb') as f:
    msg = MIMEText(f.read(), text_subtype)


msg['Subject'] = 'Python Script'
msg['From'] = SENDER
msg['To'] = RECIPIENT

try:
    connection = SMTP(Host, PORT)
    connection.login(USERNAME, PASSWORD)
    connection.sendmail(SENDER, RECIPIENT, msg.as_string())
except Exception, e:
    print(e)

Der obige Code funktioniert gut für mich. Wie Sie sehen, wird der PORT = 465 in diesem Beispiel verwendet, da ich SSL verwende. Wenn Sie den Port 587 verwenden möchten, ist TLS erforderlich.

1
jetbird13

Falscher Port vielleicht? Ich benutze 587 für smtp.gmail.com und es funktioniert.

1
Abgan

Sie sollten Ihren Port überprüfen. Ich bin nicht sicher, dass der SMTP-Port von Google 65 ist. Dies würde das Timeout erklären. 

Ändern Sie Ihre Quellen als solche:

smtplib.SMTP_SSL ('smtp.google.com', 465)

Wenn Sie jedoch sicher sind, dass es funktionieren sollte und dies nicht funktioniert, scheint es, dass es Probleme mit smtplib.SMTP_SSL gibt, und es gibt einen verfügbaren Patch hier

1
EndUsr
import smtplib

content = 'example email stuff here'

mail = smtplib.SMTP('smtp.gmail.com', 587)

mail.ehlo()

mail.starttls()

mail.login('[email protected]','password')

mail.sendmail('[email protected]gmail.com', '[email protected]', content)

mail.close()
0
Super Saiyan