2013-03-02 82 views
2

我有一個小型的tcp服務器,用於通過SMTP服務器發送郵件等。SMTP客戶端無法在本地主機上發送消息,在遠程主機上成功

問題是,它在我的開發機器上運行(遠程連接到smtp服務器)時工作正常,但是當我在與SMTP服務器(Windows Server 2008 R2)相同的機器上運行應用程序時,我得到以下例外:

System.Net.Mail.SmtpException:發送郵件失敗。 ---> System.IO.IOException:無法從傳輸連接讀取數據:net_io_connectionclosed。

SMTP服務器被配置爲只允許來自127.0.0.1的中繼和tcp應用程序綁定的IP地址,以及我的開發機器。它也被配置爲只允許來自同一個IP列表的連接。

C#的位來發送郵件如下:

var mail = new MailMessage(); 
mail.To.Add(recipient); 
mail.From = new MailAddress("[email protected]"); 
mail.Subject = "subject"; 
mail.Body = "message"; 
var smtpClient = new SmtpClient(MailServerAddress, Constants.MAIL_SERVER_PORT);   
smtpClient.Send(mail); 

MailServerAddress是當應用程序第一次運行定義。
我試着將它設置爲127.0.0.1和SMTP服務器的配置IP地址,但我仍然得到相同的異常。

檢查服務器日誌顯示沒有連接跡象,這符合上述例外情況。

我在這裏做錯了什麼?

+0

是您通過IIS SMTP服務器發送? – 2013-03-03 00:31:23

+0

@ sa_ddam213 - 是 – 2013-03-03 00:37:48

回答

2

在黑暗答案只是一個嘗試,但這種嘗試,因爲我大約3年前有類似的問題,但不記得了修復,但此行的代碼中脫穎而出,我當我看看

_client.DeliveryMethod = SmtpDeliveryMethod.PickupDirectoryFromIis; 

所以也許嘗試(假設你使用的是IIS用於SMTP):

var smtpClient = new SmtpClient(MailServerAddress, Constants.MAIL_SERVER_PORT); 
smtpClient.DeliveryMethod = SmtpDeliveryMethod.PickupDirectoryFromIis;   
smtpClient.Send(mail); 
+0

它的工作!我不知道該怎麼感謝你才足夠!! :d – 2013-03-03 00:47:44

0

回答here複製:

Unable to read data from the transport connection: net_io_connectionclosed 


What this error means is that System.net.mail was unable to find the smtp server. 

The answer will vary depending on whether you have a fixed IP or a dynamic IP but, 
basically, you need to assign a valid IP to your smtp server. 

With fixed IP's this is relatively straightforward. 
With dynamic IP's it takes a bit of tweaking. 

Open the IIS Manager and check the properties for the smtp server. 

In the Default SMTP Virtual Server's properties, in the "Access" tab, 
in the Connection Control and Relay dialogs, make sure that your local IP is assigned. 
(In my case, it's 10.0.0.2...) 

You may also need to modify your hosts file, to point 127.0.0.1 to your machine name. 
(\WINDOWS\system32\drivers\etc\hosts) 

Then, in your code, assign your machine name to the smtp client : 

SmtpClient client = New SmtpClient("yourmachinename") 
client.Send(mail) 

別的東西你可能有你的防火牆攔截測試。如果可以,請斷開互聯網並禁用防火牆,而不會造成安全風險。看看它是否有效。如果確實如此,則需要深入瞭解防火牆設置。如果沒有,那麼它確實可能是你的IP地址,如上所述。

+0

我試過了,可悲的是,我仍然得到相同的異常。 我已經確保smtp服務器的端口在防火牆中打開;是否還有其他屬性需要設置? – 2013-03-03 00:08:37

+0

@asafsitner好吧,我擔心我再也無法提供幫助,但它可能會幫助其他人知道您的遠程服務器的含義。您是否意味着回送從遠程服務器運行,或者您可以將smtp消息發送到遠程服務器? – FrostyFire 2013-03-03 00:11:35

+0

@JABFreewre - 當我在不同於託管SMTP服務器的機器上運行c#應用程序時,我可以毫無問題地發送郵件。當c#應用程序與SMTP服務器在同一臺機器上運行時,我得到該異常。 – 2013-03-03 00:17:15

相關問題