2012-03-20 150 views
5

我正在使用c#.NET 4.0編寫Windows服務(我的開發工作站是Windows 7)。 目的是在處理過程中發生錯誤時直接發送來自服務的電子郵件。 我已經包含的代碼片段顯示什麼我想實現:無法從Win7上的Windows服務發送SMTP電子郵件

try 
     { 
       string emailAddresses = "[email protected]"; 
       string emailCCAddresses = "[email protected]"; 

       //Send the email 
       using (MailMessage mailMsg = new MailMessage()) 
       { 
        mailMsg.To.Add(emailAddresses); 
        mailMsg.From = new MailAddress("[email protected]"); 
        mailMsg.CC.Add(emailCCAddresses); 
        mailMsg.Subject = " Error Message "; 
        mailMsg.Body = DateTime.Now + " : Invalid File Encountered." ; 

        ////Creating the file attachment 
        using (Attachment data = new Attachment("C:\\users\\sample.xml", MediaTypeNames.Application.Octet)) 
        { 
         //Add timestamp info for the file 
         ContentDisposition disposition = data.ContentDisposition; 
         disposition.ModificationDate = File.GetLastWriteTime("C:\\users\\sample.xml"); 
         mailMsg.Attachments.Add(data); 

        SmtpClient emailClient = new SmtpClient("example.Sample.com", 25); 
        emailClient.DeliveryMethod = SmtpDeliveryMethod.Network; 
        emailClient.UseDefaultCredentials = true; 
        emailClient.Send(mailMsg); 
        } 
       }//end using 

      } 
      catch (Exception e) 
      { 
       Console.WriteLine(e.ToString()); 
      } 

我面臨的問題是 - 電子郵件選項不從服務贏得任何的Windows 7機器上工作。然而,完全相同的代碼將在Win XP機器上工作得很好。警告,這不能作爲控制檯應用程序進行測試。它需要作爲服務運行以查看行爲。我將相同的代碼放在控制檯應用程序中,它在我的win 7機器上運行良好。

此外,我啓用了telnet客戶端和服務器窗口功能,並能夠通過命令提示符成功發送電子郵件。

我嘗試了一些東西,試圖找出原因(沒有工作) -

  • 明確設置的NetworkCredential並設置UseDefaultCredentials =假。 emailClient.Credentials = new System.Net.NetworkCredential(「username」,「pwd」,「Domain1」);

  • 更改日誌作爲服務的選項是我的用戶名和PWD

  • 從和對方的電子郵件地址是真實的,而不是虛擬地址(在我真正的代碼是!)

我能找到的唯一區別是windows服務安裝在本地系統帳戶下。但將登錄更改爲應使其使用我的驗證詳細信息/代碼中指定的憑據。我辦公室的IT人員表示,他看到的唯一區別是我的信息是作爲中繼發送的(不知道當更新到我的登錄信息時沒有改變結果,這意味着什麼意思是從/到並登錄爲帳戶)

例外,我看到被抓的是:

SMTP拋出異常:System.Net.Mail.SmtpException:發送郵件失敗。 ---> System.Net.WebException:無法連接到遠程服務器---> System.Net.Sockets.SocketException:試圖通過其訪問權限禁止訪問套接字XXX.XXX.XXX .XXX XX 在System.Net.Sockets.Socket.DoConnect(端點endPointSnapshot,爲SocketAddress的SocketAddress) 在System.Net.ServicePoint.ConnectSocketInternal(布爾connectFailure,插座s4中,插座S6中,插座&插座,ip地址&地址,ConnectSocketState狀態,IAsyncResult asyncResult,Int32超時,例外&例外)

任何想法,感激!

我覺得它與Windows 7安全策略/功能有關,希望可以像更改默認設置一樣簡單。

+0

你有沒有運行防火牆?對於最初拋出的SocketException消息(「嘗試以訪問權限禁止的方式嘗試訪問套接字...」),發現了一個快速Google,這表明許多遇到相同問題的人確定他們的防火牆軟件阻止了服務發送郵件並通過禁用防火牆或在其配置中爲其服務添加允許規則來解決該問題。 – Iridium 2012-03-20 06:59:00

+0

我確實在想這件事..但是我能夠通過控制檯應用程序(相同的代碼,而不是服務)並通過命令提示符發送smtp電子郵件。另外,在他的windows xp機器上運行服務的同事(同一團隊和訪問權限)能夠發送電子郵件。我們檢查了IT,他們告訴我們我們沒有被封鎖。 – PreethaA 2012-03-20 23:26:04

+0

我敢打賭,這是導致問題的服務運行的標識。我不知道他們是否改變了XP和Win 7之間的默認值,但是我知道他們是爲IIS應用程序池做的。 – 2012-04-10 20:39:37

回答

0

我發現這是我們新工作筆記本電腦的安全策略,IT部門拒絕讓我們改變它。我們的測試服務器沒有相同的問題,因爲它不是Windows 7,所以我不能100%確定。嘗試通過命令行發送電子郵件,以查看您的電腦是否允許使用smtp。

同樣的代碼工作的勝利XP或Windows Server機器,沒有甲肝任何限制

1

您可以爲當前用戶運行服務精細WHN運行。只需在服務安裝程序中選擇選項USER,它將以當前用戶身份運行。今天我得到了同樣的錯誤,我找到了這個解決方案。我希望這對任何人都有幫助。 enter image description here

相關問題