Невозможно прочитать возвращаемое значение из spamassassin при запуске из консоли C # - PullRequest
0 голосов
/ 10 июля 2010

У меня 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();

Я хотел бы знать, если что-то не так с моим кодом и / или есть ли у кого-нибудь опыт запуска SAWin32 из консольного приложения C #?

Большое спасибо!

1 Ответ

0 голосов
/ 17 августа 2010

Поработав некоторое время и прочитав комментарий Яна П, я наконец-то получил его:

        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 выполнить команду и затем завершиться.

Надеюсь, это кому-нибудь поможет!

...