2012-03-20 152 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

相关问题