2010-10-20 13 views
2

J'ai besoin de vérifier le délai d'un serveur SMTP, mais mon socket se ferme juste. Qu'est-ce que je fais mal? Voici mon test pour cela:Comment puis-je maintenir une connexion SMTP ouverte avec smtplib et Python?

#!/usr/bin/python 
import smtplib 
import time 
import datetime 
import socket 
socket.setdefaulttimeout(1800) 


now = time.time() 
server = smtplib.SMTP() 
server.set_debuglevel(1) 
server.connect('mx.foo.bar','25') 
(code,resp) = server.docmd('NOOP') 
then = time.time() 

print then-now 

Espérons que cela fonctionne.

+0

Pouvez-vous corriger ce formatage? –

+0

Pourquoi voulez-vous faire cela? Vous vous connectez, vous envoyez votre courrier, vous vous déconnectez. Pourquoi voulez-vous garder la connexion ouverte si vous ne l'utilisez pas? –

+0

J'essaie de vérifier la conformité RFC. Python a été suggéré, au lieu de C pour sa facilité d'utilisation. – leto

Répondre

0

Vérifiez les paramètres de votre serveur de messagerie - ils peuvent couper la connexion.

+0

Ça se passe avec tous les MTA que j'ai vérifiés. Ils obtiennent la commande, retournent 220, puis la connexion est fermée. En utilisant telnet, je reçois un délai d'attente après 5 minutes. – leto

1

Etes-vous sûr de vous déconnecter? Quand je lance le code ci-dessus sur un serveur Postfix je reçois:

connect: ('server', '25') 
connect: ('ip.address', 25) 
reply: '220 server ESMTP Postfix\r\n' 
reply: retcode (220); Msg: nserver ESMTP Postfix 
connect: server ESMTP Postfix 
send: 'NOOP\r\n' 
reply: '250 2.0.0 Ok\r\n' 
reply: retcode (250); Msg: 2.0.0 Ok 
0.0531799793243 

Le DoCmd ne bloque pas, les réponses du serveur et les sorties du programme. Je déconnecte donc quand le programme se termine.

Si j'ouvre une ligne de commande python et faire:

>> import smtplib 
>> server = smtplib.SMTP() 
>> server.connect('server') 
>> server.docmd('NOOP') 
(250, '2.0.0 Ok') 
>> ## let it sit for 5 minutes 
>> server.docmd('NOOP') 
(421, '4.4.2 server Error: timeout exceeded') 

Mes journaux confirment:

Oct 20 10:45:35 [postfix/smtpd] connect from unknown[ip.address] 
Oct 20 10:50:10 [postfix/smtpd] timeout after NOOP from unknown[ip.address] 
3

Eh bien, je ne l'ai pas trouvé une méthode pour maintenir une connexion smtp ouverte avec smtplib . Mais, si vous voulez réutiliser une connexion sans fermer (oui, l'ouverture d'une connexion prend du temps, 2-3 secondes), vous pouvez tester la connexion en premier. Pour ce faire, exécutez une commande NOOP et testez le statut == 250. Si ce n'est pas le cas, vous pouvez ouvrir une connexion et envoyer votre courrier. Et vous pouvez choisir de ne pas quitter() la connexion jusqu'à ce que vous avez terminé.

import smtplib 

def create_conn(): 
    conn = smtplib.SMTP('smtp.gmail.com', 587) 
    ... 
    return conn 

def is_connected(conn): 
    try: 
     status = conn.noop()[0] 
    except: # smtplib.SMTPServerDisconnected 
     status = -1 
    return True if status == 250 else False 
+0

@ Ethan- a du sens! – trex

+1

@trex Merci. Et cela fonctionne très bien, je l'ai utilisé avec succès sans aucun problème pour les 2 dernières années. – Ethan