How can I hold a SMTP connection open with smtplib and Python?

戏子无情 提交于 2019-12-05 19:52:41

Well, I haven't found any method to hold a smtp connection open with smtplib.

But, if you want to reuse a connection without closing (yes, opening a connection takes time, 2-3 secs), you can test the connection first. To do this, issue a NOOP command and test for status == 250. If not, then you can open a connection and send out your mail. And you can choose to not quit() the connection until you are done.

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

Are you sure you are disconnecting? When I run the above code against a postfix server I get:

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

The docmd does not block, the server responses and the program exits. I therefore disconnect when the program exits.

If I open a python command line and do:

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

My logs confirm this:

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]

Check your mail server settings - they may be cutting the connection.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!