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.
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).
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.
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.)
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".
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!
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.
Port incorrect peut-être? J'utilise 587 pour smtp.gmail.com et cela fonctionne.
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 .
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()