Support timeout.

This commit is contained in:
Stuart Gathman
2006-07-26 16:37:35 +00:00
parent d38cf5885e
commit 30923ab3a1
+10 -1
View File
@@ -5,6 +5,9 @@
# Send DSNs, do call back verification, # Send DSNs, do call back verification,
# and generate DSN messages from a template # and generate DSN messages from a template
# $Log$ # $Log$
# Revision 1.11 2006/06/21 21:07:11 customdesigned
# Include header fields in DSN template.
#
# Revision 1.10 2006/05/24 20:56:35 customdesigned # Revision 1.10 2006/05/24 20:56:35 customdesigned
# Remove default templates. Scrub test. # Remove default templates. Scrub test.
# #
@@ -14,8 +17,9 @@ import spf
import socket import socket
from email.Message import Message from email.Message import Message
import Milter import Milter
import time
def send_dsn(mailfrom,receiver,msg=None): def send_dsn(mailfrom,receiver,msg=None,timeout=600):
"""Send DSN. If msg is None, do callback verification. """Send DSN. If msg is None, do callback verification.
Mailfrom is original sender we are sending DSN or CBV to. Mailfrom is original sender we are sending DSN or CBV to.
Receiver is the MTA sending the DSN. Receiver is the MTA sending the DSN.
@@ -28,6 +32,7 @@ def send_dsn(mailfrom,receiver,msg=None):
else: else:
mxlist.sort() mxlist.sort()
smtp = smtplib.SMTP() smtp = smtplib.SMTP()
toolate = time.time() + timeout
for prior,host in mxlist: for prior,host in mxlist:
try: try:
smtp.connect(host) smtp.connect(host)
@@ -65,7 +70,11 @@ def send_dsn(mailfrom,receiver,msg=None):
pass # any other error, try next MX pass # any other error, try next MX
except socket.error: except socket.error:
pass # MX didn't accept connections, try next one pass # MX didn't accept connections, try next one
except socket.timeout:
pass # MX too slow, try next one
smtp.close() smtp.close()
if time.time() > toolate:
return (450,'No MX response within %f minutes'%(timeout/60.0))
return (450,'No MX servers available') # temp error return (450,'No MX servers available') # temp error
def create_msg(q,rcptlist,origmsg=None,template=None): def create_msg(q,rcptlist,origmsg=None,template=None):