1

我有一个安装了邮件服务器的 Windows Server 2008。对于收到的每封电子邮件,都会启动一个 C# 应用程序,该应用程序通过一组可选过滤器对消息进行管道传输,然后决定是否让它通过。

我已经实现了几个“自制”过滤器,但我想添加一个以利用 SpamAssassin 的强大功能。由于 SA 是基于 UNIX 的,我正在使用它的窗口端口 ( SAWin32 )。当我直接从命令行启动 SpammAssassin 时,电子邮件被正确分析:

spamassassin.exe  -L -e < C:\SPAM.MAI

(-L 仅启用本地测试,如果测试的邮件是垃圾邮件,则 -e 以非零值退出)

但是当我尝试从我的 C# 应用程序启动它时,它似乎不起作用,因为返回值始终等于 2(即使对于火腿消息):

Process proc = new Process();
proc.StartInfo.FileName = @"C:\spamassassin.exe";
proc.StartInfo.Arguments = " -L -e < C:\SPAM.MAI";
proc.StartInfo.CreateNoWindow = false;
proc.StartInfo.WindowStyle = ProcessWindowStyle.Normal;
proc.Start();
proc.WaitForExit();
int exitCode = proc.ExitCode;
Console.WriteLine("Exit code: " + exitCode);
proc.Close();

我想知道我的代码是否有问题和/或是否有人有从 C# 控制台应用程序启动 SAWin32 的经验?

非常感谢!

4

1 回答 1

1

在挖掘了一段时间并阅读了 Ian P 的评论后,我终于让它工作了:

        Process p = new Process();
        p.StartInfo.RedirectStandardOutput = true;
        p.StartInfo.UseShellExecute = false;

        p.StartInfo.Arguments = @" /C C:\spamassassin.exe -e -L < C:\SPAM_TEST.MAI";
        p.StartInfo.FileName = @"C:\WINDOWS\System32\cmd.exe";
        p.OutputDataReceived += (sender, arguments) => Console.WriteLine("Received output: {0}", arguments.Data);
        p.Start();
        p.BeginOutputReadLine();
        p.WaitForExit();
        Console.WriteLine("Exit code: " + p.ExitCode);
        p.Close();

/C 参数告诉 CMD 执行命令然后终止。

希望这对某人有帮助!

于 2010-08-17T15:39:13.483 回答