web-dev-qa-db-fra.com

Échec d'envoi d'un courrier électronique avec l'exemple Python

J'ai essayé (et échoué) de comprendre comment envoyer un courrier électronique via Python.

Essayer l'exemple à partir d'ici: http://docs.python.org/library/smtplib.html#smtplib.SMTP

mais j'ai ajouté la ligne server = smtplib.SMTP_SSL('smtp.gmail.com', 465) après un rebond lié à l'absence de connexion SSL. 

Maintenant j'obtiens ceci:

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

Pensées?


server = smtplib.SMTP ("smtp.google.com", 495) me donne une erreur de délai d'attente. smtplib.smtp ("smtp.google.com", 495) me donne "SSLError: [Errno 1] _ssl.c: 480: erreur: 140770FC: routines SSL: SSL23_GET_SERVER_HELLO: protocole inconnu" (voir ci-dessous).

J'essaie différents ports et maintenant j'obtiens une toute nouvelle erreur. Je vais simplement poster tout le code, je fais probablement une erreur de débutant.

"

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

"

et puis je reçois ce message d'erreur: "

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

"

notez qu'en réalité, celui qui ressemble à "serveur = smtplib.SMTPSSLPORT = 587" est en réalité "serveur = smtplib.SMTP underscore SSL underscore PORT = 587", il y a une sorte de formatage qui se passe ici.

21
Chatter

Le code suivant fonctionne pour moi:

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

J'utilise Python 2.5.2.

Edit : modification du port de 25 à 587 comme suggéré par ΩΤΖΙΟΥ et suppression du second ehlo (). Maintenant, j'aimerais savoir pourquoi le port 25 fonctionne parfaitement depuis ma machine (et le port 465 ne fonctionne pas).

28
Federico A. Ramponi

La manière correcte de se connecter à GMail en utilisant SSL est la suivante:

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

Le port 465 semble provoquer des retards. Les deux ports sont spécifiés dans un GMail FAQ .

Notez que l'utilisation du port 587 est plus courante pour SMTP sur SSL. Bien qu'il ne s'agisse que d'informations triviales, elles n'ont aucune autre utilisation pratique.

Cette réponse est fournie en tant que wiki de communauté afin d'être choisie comme "la" réponse. S'il vous plaît améliorer au besoin.

7
tzot

Le problème est dû à un bogue dans Python . Essayer de créer une connexion avec SMTP_SSL échouera avec "SMTPServerDisconnected: veuillez d'abord exécuter connect ()".

Un correctif a été validé, vous pouvez donc corriger votre copie locale. Voir la pièce jointe nommée "smtplib_72551.diff".

(Remarque: SMTP_SSL est une nouvelle classe ajoutée à Python 2.6/3.0 et versions ultérieures.)

6
keithb

Voici une solution simple à jeter. Je voulais coller ça plus tôt, mais je me suis endormi sur ma chaise.


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

C'est mon hypothèse que la plupart des personnes sur ce fil qui ont eu des tentatives réussies avec leur code ne sont pas sur win32. ;)

* edit: Voir http://docs.python.org/library/email-examples.html pour de bons exemples "officiels". 

6
EndUsr

Okay, découvert que cette ligne de code fait le tour!

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

Il s'est avéré que GMAIL ne supportait pas SSL sur le port 25 (et le port 465 a provoqué un blocage pour une raison quelconque).

Merci les gars!

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)

Le code ci-dessus fonctionne bien pour moi. Comme vous pouvez le voir, le PORT = 465 est utilisé dans cet exemple puisque j'utilise SSL. Si vous envisagez d'utiliser le port 587, TLS est requis.

1
jetbird13

Port incorrect peut-être? J'utilise 587 pour smtp.gmail.com et cela fonctionne.

1
Abgan

Vous devriez vérifier votre port, je ne suis pas sûr que le port SMTP de Google soit 65, cela expliquerait le délai. 

Modifiez vos sources en tant que telles:

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

Si, toutefois, vous êtes certain que cela devrait fonctionner et que cela ne fonctionne pas, il semble que smtplib.SMTP_SSL pose quelques problèmes, et il existe un correctif pour cela ici

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]', '[email protected]', content)

mail.close()
0
Super Saiyan