SpamAssassin检查分数C#代码

8
有没有一种方法来检查ASP.Net应用程序中的分数?是否有类似于.Net的类或其他垃圾邮件过滤器? --编辑 我正在寻找一种在C#中检查电子邮件消息垃圾邮件得分的方法。

检查什么分数?您可能需要更详细地说明您正在尝试做什么。http://tinyurl.com/so-hints - Albin Sunnanbo
Ridvan,你想实现一个系统,从服务器获取电子邮件并检查哪些是垃圾邮件,哪些是好的吗?如果是这样,你想对好和坏的信息做什么? - Davide Piras
我正在尝试实现一个工具,如果提供了发件人、主题和正文,它将检查电子邮件消息的垃圾邮件得分。不是在我收到邮件时,而是在发送邮件之前,或者使用Web工具显示电子邮件的垃圾邮件得分。我看过这个网址http://www.codeproject.com/KB/recipes/BayesianCS.aspx,但对我来说它并不是真正的垃圾邮件判别器。 - Ridvan
有一个名为MailingCheck的桌面应用程序可以快速检查垃圾邮件。如果您想要编程使用,我认为您需要将spamassassin作为服务运行,并使用其服务接口查询分数。 - Rup
Postmark现在托管JSON Web服务,您也可以使用。 - Rup
2个回答

6
这是我为http://elasticemail.com编写的C#代码,用于连接正在运行的Spam Assassin电子邮件检查的超级简化的“只需检查分数”的代码。只需设置SA在服务器上运行并设置访问权限。

然后您就可以使用此代码调用它:

public class SimpleSpamAssassin
{
    public class RuleResult
    {
        public double Score = 0;
        public string Rule = "";
        public string Description = "";

        public RuleResult() { }
        public RuleResult(string line)
        {
            Score = double.Parse(line.Substring(0, line.IndexOf(" ")).Trim());
            line = line.Substring(line.IndexOf(" ") + 1);
            Rule = line.Substring(0, 23).Trim();
            Description = line.Substring(23).Trim();
        }
    }
    public static List<RuleResult> GetReport(string serverIP, string message) 
    {
        string command = "REPORT";

        StringBuilder sb = new StringBuilder();
        sb.AppendFormat("{0} SPAMC/1.2\r\n", command);
        sb.AppendFormat("Content-Length: {0}\r\n\r\n", message.Length);
        sb.AppendFormat(message);

        byte[] messageBuffer = Encoding.ASCII.GetBytes(sb.ToString());

        using (Socket spamAssassinSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp))
        {
            spamAssassinSocket.Connect(serverIP, 783);
            spamAssassinSocket.Send(messageBuffer);
            spamAssassinSocket.Shutdown(SocketShutdown.Send);

            int received;
            string receivedMessage = string.Empty;
            do
            {
                byte[] receiveBuffer = new byte[1024];
                received = spamAssassinSocket.Receive(receiveBuffer);
                receivedMessage += Encoding.ASCII.GetString(receiveBuffer, 0, received);
            }
            while (received > 0);

            spamAssassinSocket.Shutdown(SocketShutdown.Both);

            return ParseResponse(receivedMessage);
        }

    }

    private static List<RuleResult> ParseResponse(string receivedMessage)
    {
        //merge line endings
        receivedMessage = receivedMessage.Replace("\r\n", "\n");
        receivedMessage = receivedMessage.Replace("\r", "\n");
        string[] lines = receivedMessage.Split('\n');

        List<RuleResult> results = new List<RuleResult>();
        bool inReport = false;
        foreach (string line in lines)
        {
            if (inReport)
            {
                try
                {
                    results.Add(new RuleResult(line.Trim()));
                }
                catch
                {
                    //past the end of the report
                }
            }

            if (line.StartsWith("---"))
                inReport = true;
        }

        return results;
    }

}

使用起来非常简单:

List<RuleResult> spamCheckResult = SimpleSpamAssassin.GetReport(IP OF SA Server, FULL Email including headers);

它将返回你触发的垃圾邮件检查规则列表和得分影响。

在 spamAssassinSocket.Receive(receiveBuffer) 上出现错误 "System.Net.Sockets.SocketException: '远程主机强制关闭了一个现有的连接'" - Naveen

2

我不确定这是否是您正在寻找的内容,但是在 Code Project 上有一个 C# 包装器可以简化与 SpamAssassin 服务器的通信:

希望这有所帮助!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接