我有一台安装了邮件服务器的Windows Server 2008。对于每个进来的电子邮件,都会启动一个C#应用程序,它通过一组可选的过滤器来管理消息,然后决定是否让它通过。
我已经实现了几个“自制”过滤器,但我想添加一个以利用SpamAssassin的强大功能。由于SA是基于UNIX的,我正在使用它的窗口端口(SAWin32)。当我直接从命令行启动SpammAssassin时,会正确分析电子邮件:
spamassassin.exe -L -e < C:\SPAM.MAI
( - L只启用本地测试,如果测试的邮件是垃圾邮件,则会退出非零值
但是当我尝试从我的C#应用程序启动它时,它似乎不起作用,因为返回值总是等于2(即使对于ham消息):
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的经验?
非常感谢!
答案 0 :(得分:0)
经过一段时间阅读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执行命令然后终止。
希望这有助于某人!