3

SMTP サーバーのタイムアウトを確認する必要がありますが、ソケットが閉じてしまいます。私は何を間違っていますか?これが私のテストです:

#!/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

これが機能することを願っています。

4

3 に答える 3

8

さて、私はsmtplibでsmtp接続を開いたままにする方法を見つけていません。

ただし、接続を閉じずに再利用する場合(はい、接続を開くには2〜3秒かかります)、最初に接続をテストできます。これを行うには、NOOPコマンドを発行し、ステータス== 250をテストします。そうでない場合は、接続を開いてメールを送信できます。そして、完了するまで接続を終了しないことを選択できます。

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
于 2013-02-03T22:47:32.207 に答える
1

切断してもよろしいですか?Postfix サーバーに対して上記のコードを実行すると、次のようになります。

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

docmd はブロックせず、サーバーは応答し、プログラムは終了します。したがって、プログラムが終了すると切断します。

Python コマンド ラインを開いて実行すると、次のようになります。

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

私のログはこれを確認します:

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]
于 2010-10-20T17:02:52.603 に答える
0

メール サーバーの設定を確認してください。接続が切断されている可能性があります。

于 2010-10-20T13:08:58.330 に答える