如何在sendmail环境中检测是否存在邮件代理
出处:IBM 作者:IBM 时间:2007-12-27 16:51:39
容提要:
说明:
作为广泛应用的邮件服务器软件,sendmail需要和各种smtp的客户端软件打交道。在这些smtp客户端软件中,有些软件是真正的邮件软件,比如Microsoft Outlook Express;有些是有着特殊目的的应用程序,比如Norton Antivirus。 有些应用程序会截断邮件客户端和sendmail的连接,以“邮件代理”的形式接收客户端的数据,对数据进行处理(比如Norton Antivirus使用这种方式来扫描外出邮件中的病毒),然后转发给sendmail。 这种“邮件代理”程序可能是善意的也可能是恶意的。但是,当sendmail和邮件客户端软件的通信出现问题的时候,应该首先着手检测此类“邮件代理”程序是否存在以便进一步排除它们的影响。 sendmail服务程序具有记录smtp会话的功能,大部分邮件客户端软件也有类似的功能。我们可以通过对比服务器和客户端上的会话记录来判断邮件代理程序是否存在。 首先,您需要用 -X参数运行sendmail: #startsrc -s sendmail -a"-bd -q 30m -X /tmp/smtp.sessions" 注意: 在一个生产环境中,-X参数可能会产生大量的日志信息。请只在进行测试或故障排除时使用-X参数。 一个典型的客户机-服务器smtp会话会被这样地记录在/tmp/smtp.sessions中: 127184 >>> 220 marshak.austin.ibm.com ESMTP Sendmail Tue, 1 Nov 2005 10:31:22 -0600 127184 <<< HELO IBM8370FEC6B24^M 127184 >>> 250 marshak.austin.ibm.com Hello [9.53.167.160], pleased to meet you 127184 <<< MAIL FROM: <liuqingc@marshak.austin.ibm.com>^M 200898 >>> 250 2.1.0 <liuqingc@marshak.austin.ibm.com>... Sender ok 200898 <<< RCPT TO: <liuqingc@marshak.austin.ibm.com>^M 200898 >>> 250 2.1.5 <liuqingc@marshak.austin.ibm.com>... Recipient ok 200898 <<< DATA^M 200898 >>> 354 Enter mail, end with "." on a line by itself 200898 <<< Message-ID: <000f01c5df01$88a95fd0$a0a73509@austin.ibm.com>^M 200898 <<< From: "internship test" <liuqingc@marshak.austin.ibm.com>^M 200898 <<< To: <liuqingc@marshak.austin.ibm.com>^M 200898 <<< Subject: test^M 200898 <<< Date: Tue, 1 Nov 2005 10:29:06 -0600^M ...... 其中"<<<"表示sendmail服务接收到的信息,而">>>"则表示sendmail服务向客户端发送的信息。如果邮件客户端直接和sendmail服务会话,那么在客户端的smtp会话中所记录的文本信息应该和/tmp/smtp.sessions一致。我们可以利用这个特点来检测邮件代理的存在。 让我们用一个例子来说明。 /tmp/smtp.sessions: 127184 >>> 220 marshak.austin.ibm.com ESMTP Sendmail Tue, 1 Nov 2005 10:31:22 -0600 127184 <<< HELO IBM8370FEC6B24^M 127184 >>> 250 marshak.austin.ibm.com Hello [9.53.167.160], pleased to meet you 127184 <<< MAIL FROM: <liuqingc@marshak.austin.ibm.com>^M 200898 >>> 250 2.1.0 <liuqingc@marshak.austin.ibm.com>... Sender ok 200898 <<< RCPT TO: <liuqingc@marshak.austin.ibm.com>^M 200898 >>> 250 2.1.5 <liuqingc@marshak.austin.ibm.com>... Recipient ok 200898 <<< DATA^M 200898 >>> 354 Enter mail, end with "." on a line by itself 200898 <<< Message-ID: <000f01c5df01$88a95fd0$a0a73509@austin.ibm.com>^M 200898 <<< From: "internship test" <liuqingc@marshak.austin.ibm.com>^M 200898 <<< To: <liuqingc@marshak.austin.ibm.com>^M 200898 <<< Subject: test^M 200898 <<< Date: Tue, 1 Nov 2005 10:29:06 -0600^M 200898 <<< X-Priority: 3^M 200898 <<< X-MSMail-Priority: Normal^M 200898 <<< X-Mailer: Microsoft Outlook Express 6.00.2800.1506^M 200898 <<< X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1506^M 200898 <<< ^M 200898 <<< test^M 200898 <<< ^M 200898 <<< ^M 200898 <<< .^M 200898 >>> 250 2.0.0 jA1GVM5200898 Message accepted for delivery 邮件客户端软件的记录: SMTP: 10:38:54 [rx] 220 marshak.austin.ibm.com ESMTP Sendmail Tue, 1 Nov 2005 10:40:03 -0600 SMTP: 10:38:54 [tx] HELO IBM8370FEC6B24 SMTP: 10:38:54 [rx] 250 marshak.austin.ibm.com Hello [9.53.167.160], pleased to meet you SMTP: 10:38:54 [tx] RSET SMTP: 10:38:54 [rx] 250 2.0.0 Reset state SMTP: 10:38:54 [tx] MAIL FROM: <liuqingc@marshak.austin.ibm.com> SMTP: 10:38:54 [rx] 250 2.1.0 <liuqingc@marshak.austin.ibm.com>... Sender ok SMTP: 10:38:54 [tx] RCPT TO: <liuqingc@marshak.austin.ibm.com> SMTP: 10:38:54 [rx] 250 2.1.5 <liuqingc@marshak.austin.ibm.com>... Recipient ok SMTP: 10:38:54 [tx] DATA SMTP: 10:38:54 [rx] 354 Please start mail input. SMTP: 10:38:54 [tx] . SMTP: 10:38:54 [rx] 250 Mail queued for delivery. 我们可以看到,在要求客户端输入邮件信息时,sendmail发出的信息是“354 Enter mail, end with "." on a line by itself”,而邮件客户端收到的信息是“354 Please start mail input.”。由此可知有邮件代理程序存在于邮件客户端与sendmail之间。 如果您的邮件客户端不支持记录smtp会话的功能,您可以采用以下两种方法: 1、使用支持smtp会话记录的客户端进行测试; 2、使用telnet命令连接到sendmail服务器的25端口,手工输入HELO,MAIL FROM,RCPT TO,DATA等命令。