2010-07-10 70 views
0

我有安裝了郵件服務器的Windows Server 2008。對於每一封郵件來說,都會啓動一個C#應用程序,通過一組可選的過濾器來管理郵件,然後決定是否讓它通過。從C#控制檯啓動時,無法讀取spamassassin的返回值

我有alrealdy幾個「自制」過濾器實施,但我想增加一個利用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(); 

我想知道是否有我的代碼和/ o有問題如果任何人有經驗從C#控制檯應用程序啓動SAWin32?

非常感謝!

+0

將文件名設置爲@「cmd.exe/c C:\ spamassassin.exe」時發生了什麼? ? – 2010-08-16 17:33:37

+0

感謝您的幫助。我改變了文件名,並且拋出了System.ComponenteModel.Win32Exception異常,告訴我文件名無效。 – jdecuyper 2010-08-16 17:44:13

回答

0

挖了一會兒,讀伊恩·普的評論後,我終於得到了它的工作:

 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執行該命令,然後終止。

希望這可以幫助別人!