VB.NET 实现 spamd 客户端 (spamc)






2.50/5 (2投票s)
.NET 实现 SpamAssassin 的网络客户端。
什么是 spamd 和 spamc?
我们从 SpamAssassin 开始。SA 可能是世界上最好的垃圾邮件过滤软件。但它是用 Perl 编写的,这意味着速度慢,尤其是在 Win32 平台上。因此,有一个小小的帮助,叫做 'spamd'。它是一个守护进程(UN*X 中 '服务' 的等效项),允许通过网络与 SA 通信,并限制调用 SA 的成本。而 spamc 是该守护进程的客户端组件。
这意味着您可以在独立的(或者甚至只有虚拟的)机器上运行类似 Unix 的操作系统,并在那里运行 SpamAssassin 和 spamd。然后,从您的 Windows 邮件服务器,需要做的就是使用 spamc 调用 spamd,并处理结果。
通信协议
好的,通信协议非常简单,并在 SpamAssassin 文档中描述。简而言之,您需要打开到 spamd 所在端口的 TCP 连接(通常是 783),然后发送命令头(例如,PROCESS SPAMC/1.0
),然后发送 RFC822 格式的消息源。然后您必须断开发送连接。
spamd 将使用 SpamAssassin 处理消息,并以相同的方式发送修改后的结果。
.NET 下的实现
.NET 实现非常简单,只有一个例外:由于需要单向连接关闭,我们不能使用 System.Net.Sockets.TcpClient
。我们必须深入一层,直接使用套接字通信。
简单而粗糙的概念代码可能如下所示
Module Module1
Sub Main()
Console.WriteLine("Preparing data...")
Dim SB As New System.Text.StringBuilder
SB.Append("PROCESS SPAMC/1.0")
SB.Append("\nSubject: Test spam mail (GTUBE)")
SB.Append("\nMessage-ID: <gtube1.1010101@example.net>")
SB.Append("\nDate: Wed, 23 Jul 2003 23:30:00 +0200")
SB.Append("\nFrom: Sender <sender@example.net>")
SB.Append("\nTo: Recipient <recipient@example.net>")
SB.Append("\nPrecedence: junk")
SB.Append("\nMIME-Version: 1.0")
SB.Append("\nContent-Type: text/plain; charset=us-ascii")
SB.Append("\nContent-Transfer-Encoding: 7bit")
SB.Append("\n")
SB.Append("\nIf your spam filter supports it," & _
" the GTUBE provides a test by which you")
SB.Append("\ncan verify that the filter is installed " & _
"correctly and is detecting incoming")
SB.Append("\nspam. You can send yourself a test mail " & _
"containing the following string of")
SB.Append("\ncharacters (in upper case and with " & _
"no white spaces and line breaks):")
SB.Append("\n")
SB.Append("\nXJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-" & _
"STANDARD-ANTI-UBE-TEST-EMAIL*C.34X")
SB.Append("\n")
SB.Append("\nYou should send this test mail from an account " & _
"outside of your network.")
SB.Append("\n")
SB.Replace("\n", vbCrLf)
Dim Buffer() As Byte = _
System.Text.Encoding.ASCII.GetBytes(SB.ToString())
Console.WriteLine("Sending data...")
Dim Socket As New System.Net.Sockets.Socket( _
System.Net.Sockets.AddressFamily.InterNetwork, _
System.Net.Sockets.SocketType.Stream, _
System.Net.Sockets.ProtocolType.Tcp)
Dim IPE As New System.Net.IPEndPoint( _
System.Net.IPAddress.Parse("192.168.168.105"), 783)
Socket.Connect(IPE)
Socket.Send(Buffer)
Socket.Shutdown(Net.Sockets.SocketShutdown.Send)
Console.WriteLine("Receiving data")
Dim R As Int32
Do
Dim RecBuf(1024) As Byte
R = Socket.Receive(RecBuf)
Console.Write(System.Text.Encoding.ASCII.GetString(RecBuf, 0, R))
Loop Until R = 0
Console.WriteLine("OK")
Console.ReadLine()
End Sub
End Module
结果
结果是 SpamdClient
类,它允许您将 spamc 功能合并到您的软件中。此外,还提供了一个控制台应用程序 (spamc.exe),允许您从命令行与 spamd 服务器通信。