65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.50/5 (2投票s)

2004 年 6 月 28 日

CPOL

1分钟阅读

viewsIcon

52621

downloadIcon

159

.NET 实现 SpamAssassin 的网络客户端。

什么是 spamd 和 spamc?

我们从 SpamAssassin 开始。SA 可能是世界上最好的垃圾邮件过滤软件。但它是用 Perl 编写的,这意味着速度慢,尤其是在 Win32 平台上。因此,有一个小小的帮助,叫做 'spamd'。它是一个守护进程(UN*X 中 '服务' 的等效项),允许通过网络与 SA 通信,并限制调用 SA 的成本。而 spamc 是该守护进程的客户端组件。

这意味着您可以在独立的(或者甚至只有虚拟的)机器上运行类似 Unix 的操作系统,并在那里运行 SpamAssassinspamd。然后,从您的 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 服务器通信。

© . All rights reserved.