Как я могу держать SMTP-соединение открытым с помощью smtplib и Python? - PullRequest
3 голосов
/ 20 октября 2010

Мне нужно проверить время ожидания 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

Будем надеяться, что это сработает.

Ответы [ 3 ]

4 голосов
/ 04 февраля 2013

Ну, я не нашел никакого способа удержать соединение SMTP открытым с помощью smtplib.

Но, если вы хотите повторно использовать соединение без закрытия (да, открытие подключение занимает время, 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
1 голос
/ 20 октября 2010

Вы уверены, что отключаетесь? Когда я запускаю приведенный выше код на постфиксном сервере, я получаю:

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]
0 голосов
/ 20 октября 2010

Проверьте настройки вашего почтового сервера - они могут прерывать соединение.

...