让我们假设一个典型的设置,其中从 sendmail 调用 procmail 以将传入的电子邮件过滤到正确的邮箱中。是在与 sendmail 的传入 SMTP 连接仍处于活动状态时完成,还是在电子邮件已被接受后完成?
如果是前者,那么我理解 procmail 可能会返回到 sendmail 一个错误,以便 sendmail 回复一个错误代码,例如554 Transaction failed
在接受SMTP DATA时,而不是通常的 200?
在我的例子中,sendmail 从别名数据库调用 procmail,条目如下:
theaddres: theaddres-somedomain-com.virtual
theaddres-somedomain-com.virtual: |"/usr/libexec/sm.bin/someuser.virtual somedomain@theaddress"
然后执行 procmail 脚本:
root@mda:/etc/mail # less /usr/libexec/sm.bin/someuser.virtual
/usr/local/bin/procmail -a $1 /usr/local/etc/procmailrc/someuser.virtual
编辑:
添加更详细的解释。首先,我想确定下面概述的基于维基百科示例的流程在 SMTP 协议中是否可行。如果是,那么是否可以使用 procmail。然后,如果没有(我猜是这种情况),是否存在可能的实现(例如 milter)。
S: 220 smtp.example.com ESMTP Postfix
C: HELO relay.example.org
S: 250 Hello relay.example.org, I am glad to meet you
C: MAIL FROM:<[email protected]>
S: 250 Ok
C: RCPT TO:<[email protected]>
S: 250 Ok
C: RCPT TO:<[email protected]>
S: 250 Ok
C: DATA
S: 354 End data with <CR><LF>.<CR><LF>
C: From: "Bob Example" <[email protected]>
C: To: "Alice Example" <[email protected]>
C: Cc: [email protected]
C: Date: Tue, 15 January 2008 16:02:43 -0500
C: Subject: Test message
C:
C: Hello Alice.
C: This is a test message with 5 header fields and 4 lines in the message body.
Now this is what I would like to see:
S (after receiving the first 2 lines out of 4): 452 Requested action not taken: insufficient system storage
C: QUIT
S: 221 Bye
{The server closes the connection}
因此,服务器停止接收电子邮件(例如,因为它在电子邮件中检测到序列“这是一条测试消息”)并用错误回复客户端。在这种情况下,它是 452,但它可能是响应DATA 请求的任何有效错误。客户可能会也可能不会回应 QUIT,我不在乎。
这可能取决于 SMTP 协议是如何在 TCP 级别实现的。我可以将从客户端接收到的数据量限制为 50 个初始字节(例如通过限制 TCP 帧的大小)吗?SMTP 协议是否允许我在客户端发送 DATA 内容时回复错误?
此外,如果服务器在接收到 DATA 的初始部分后故意断开连接(而不是尝试向客户端发送错误),则与传输电子邮件时 TCP 连接意外断开没有什么不同。表现良好的 MTA 会尝试重新连接并重新发送电子邮件,垃圾邮件发送者可能不会费心重试。