C# 无法从Win7上的windows服务发送SMTP电子邮件

C# 无法从Win7上的windows服务发送SMTP电子邮件,c#,email,windows-7,smtp,smtp-auth,C#,Email,Windows 7,Smtp,Smtp Auth,我正在使用c#.NET 4.0编写一个Windows服务(我的开发工作站是Windows 7)。 目的是在处理过程中出现错误时,直接从服务发送电子邮件。 我加入了一段代码片段,以展示我正在努力实现的目标: try { string emailAddresses = "me@sample.com"; string emailCCAddresses = "you@sample.com";

我正在使用c#.NET 4.0编写一个Windows服务(我的开发工作站是Windows 7)。 目的是在处理过程中出现错误时,直接从服务发送电子邮件。 我加入了一段代码片段,以展示我正在努力实现的目标:

try
        {
                string emailAddresses = "me@sample.com";
                string emailCCAddresses = "you@sample.com";

                //Send the email
                using (MailMessage mailMsg = new MailMessage())
                {
                    mailMsg.To.Add(emailAddresses);
                    mailMsg.From = new MailAddress("winService@sample.com");
                    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服务中工作。然而,完全相同的代码将在WinXP机器上运行,效果非常好。注意,这不能作为控制台应用程序进行测试。它需要作为服务运行才能查看行为。我将相同的代码放在控制台应用程序中,它在我的Win7机器上运行良好

此外,我还启用了telnet客户端和服务器windows功能,并能够通过命令提示符成功发送电子邮件

我尝试了一些方法,试图找出原因(没有成功)——

  • 显式设置NetworkCredential并设置UseDefaultCredentials=false。 emailClient.Credentials=新系统.Net.NetworkCredential(“用户名”、“pwd”、“域1”)

  • 将服务的“登录为”选项更改为“我的用户ID”和“pwd”

  • 发件人和收件人的电子邮件地址是真实的,而不是虚假的地址(在我的真实代码中是!)
我能找到的唯一区别是windows服务是在本地系统帐户下安装的。但是将登录更改为应该会导致它使用我的身份验证详细信息/代码中指定的凭据。我办公室的IT人员说,他看到的唯一区别是,我的消息是作为中继发送的(不确定这意味着什么,因为当更新到我的登录名时,发件人/收件人和登录帐户并没有改变结果)

我看到的例外情况是:

引发SMTP异常:System.Net.Mail.SmtpException:发送邮件失败。-->System.Net.WebException:无法连接到远程服务器-->System.Net.Sockets.SocketException:试图以访问权限XXX.XXX.XXX禁止的方式访问套接字 位于System.Net.Sockets.Socket.DoConnect(端点端点快照,SocketAddress SocketAddress) 在System.Net.ServicePoint.ConnectSocketInternal(布尔连接失败、套接字s4、套接字s6、套接字和套接字、IP地址和地址、ConnectSocketState状态、IAsyncResult asyncResult、Int32超时、异常和异常)

任何想法都很感激


我觉得这与windows 7的安全策略/功能有关,希望可以像更改默认设置一样简单。

我发现这是我们新工作笔记本电脑上的安全策略,it部门拒绝让我们更改它。我们的测试服务器没有同样的问题,当然也不是Windows7,所以我不能100%确定。尝试通过命令行发送电子邮件,以查看您的电脑是否允许smtp


同样的代码在win xp或windows server机器上运行时效果很好,而该机器没有任何限制

您可以作为当前用户运行该服务。只需在服务安装程序中选择“用户”选项,它将作为当前用户工作。我今天也犯了同样的错误,我找到了这个解决方案。我希望这对任何人都有帮助。

您是否有正在运行的防火墙?快速搜索最初抛出的SocketException消息(“试图以其访问权限所禁止的方式访问套接字…”)这表明,许多经历过相同问题的人确定他们的防火墙软件阻止了服务发送邮件,并通过禁用防火墙或在其配置中为他们的服务添加允许规则来解决问题。我确实考虑过这一点。。但我能够通过控制台应用程序(相同的代码,只是不是服务)和命令提示符发送smtp电子邮件。另外,我的同事(同一团队和访问权限)在他的windows xp机器上运行该服务,他能够发送电子邮件。我们检查了它,他们告诉我们没有被阻止。我敢打赌,是服务运行时使用的身份导致了问题。我不知道他们是否更改了XP和Win 7之间的默认设置,但我知道他们更改了IIS应用程序池。我确实启用了telnet(Win 7中默认禁用telnet)通过命令提示符发送电子邮件。一旦安装了该服务,我就将登录名更改为以我的身份运行,与本地系统帐户不同…仍然没有来自该服务的电子邮件。当您更改“登录”参数时是否出现异常?