spamassassin检查分数C#代码

Posted

技术标签:

【中文标题】spamassassin检查分数C#代码【英文标题】:spamassassin check score C# code 【发布时间】:2011-06-29 15:25:35 【问题描述】:

有没有办法在 ASP.Net 应用程序中检查分数? .Net 的类或类似的东西?其他垃圾邮件过滤器怎么样。 --编辑 我正在寻找一种方法来检查 C# 中电子邮件的垃圾邮件分数。

【问题讨论】:

查看什么分数?您可能会更详细地了解您正在尝试做的事情。 tinyurl.com/so-hints Ridvan,你想实现一个从服务器获取电子邮件并检查什么是垃圾邮件和什么是好的系统吗?如果是这样,您希望如何处理好消息和坏消息? 我正在尝试实现一个工具,如果提供了 From、Subject 和 Body,它将检查电子邮件的垃圾邮件分数。不是在我收到电子邮件时,而是在发送电子邮件之前,或者是显示电子邮件垃圾邮件分数的网络工具。我见过这个codeproject.com/KB/recipes/BayesianCS.aspx,但对我来说这不是真正的垃圾邮件刺客 MailingCheck 是一款快速桌面应用程序。如果您想要程序化使用,我认为您可能必须将 spamassassin 作为服务运行并使用其服务接口来查询分数。 邮戳host a JSON web service你也可以使用 【参考方案1】:

这是我为http://elasticemail.com 编写的从 C# 连接到正在运行的垃圾邮件刺客电子邮件检查的超级简化的“只需检查分数”代码。只需将 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: '现有连接被远程主机强行关闭'【参考方案2】:

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

A C# Wrapper for the SpamAssassin Protocol

希望有帮助!

【讨论】:

以上是关于spamassassin检查分数C#代码的主要内容,如果未能解决你的问题,请参考以下文章

MAPS和SpamAssassin分别是什么,如何工作?

C#按分数对行进行排序

C#分数背包o(n logn)解

c#部分---用结构体的题目- //请输入班级人数,输入每个人的学号,姓名,和语文分数数学分数和英语分数(要求使用结构体)

小数在c#中变成不正确的分数

在 C# 中以编程方式检查字符串是不是包含有效的 C# 代码