【发布时间】:2012-04-04 12:14:33
【问题描述】:
我正在使用 c# .NET 4.0 编写 Windows 服务(我的开发工作站是 Windows 7)。 目的是在处理过程中出现错误时直接从服务发送电子邮件。 我已经包含了一个代码 sn-p 来显示我想要实现的目标:
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 服务中都不起作用。然而,完全相同的代码将在 Win XP 机器上完美运行。警告,这不能作为控制台应用程序进行测试。它需要作为服务运行才能看到行为。我将相同的代码放在控制台应用程序中,它在我的 win 7 机器上运行良好。
此外,我启用了 telnet 客户端和服务器 windows 功能,并且能够通过命令提示符成功发送电子邮件。
我尝试了一些方法来尝试找出原因(没有奏效) -
明确设置 NetworkCredential 并设置 UseDefaultCredentials = false。 emailClient.Credentials = new System.Net.NetworkCredential("username","pwd","Domain1");
将服务的登录身份选项更改为我的用户 ID 和密码
- From 和 To 电子邮件地址是真实的,而不是虚拟地址(在我的真实代码中!)
我能找到的唯一区别是 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 套接字地址) 在 System.Net.ServicePoint.ConnectSocketInternal(Boolean connectFailure, Socket s4, Socket s6, Socket& 套接字, IPAddress& 地址, ConnectSocketState 状态, IAsyncResult asyncResult, Int32 超时, Exception& 异常)
感谢任何想法!
我觉得这与 Windows 7 安全策略/功能有关,希望可能像更改默认设置一样简单。
【问题讨论】:
-
你有防火墙运行吗?对最初抛出的 SocketException 消息的快速谷歌(“尝试以访问权限禁止的方式访问套接字......”)表明许多遇到相同问题的人确定他们的防火墙软件阻止了服务发送邮件,并通过禁用防火墙或在其配置中为其服务添加允许规则来解决此问题。
-
我确实考虑过。但我能够通过控制台应用程序(相同的代码,只是不是服务)和命令提示符发送 smtp 电子邮件。此外,在他的 windows xp 机器上运行该服务的我的同事(相同的团队和访问权限)能够发送电子邮件。我们与 IT 进行了核对,他们告诉我们我们没有被阻止。
-
我敢打赌,是服务运行的身份导致了问题。我不知道他们是否更改了 XP 和 Win 7 之间的默认设置,但我知道他们为 IIS 应用程序池做了更改。
-
我确实启用了 telnet(在 win 7 中默认禁用)以通过命令提示符发送电子邮件。安装该服务后,我将登录名更改为以我身份运行,而不是本地系统帐户...仍然没有来自该服务的电子邮件。
-
更改“登录”参数时是否出现异常?
标签: c# email windows-7 smtp smtp-auth