c# - 无法从 Win7 上的 Windows 服务发送 SMTP 电子邮件

标签 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";

                //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 客户端和服务器窗口功能,并且能够通过命令提示符成功发送电子邮件。

我尝试了一些方法来找出原因(没有成功)-

  • 显式设置 NetworkCredential 并设置 UseDefaultCredentials = false。 emailClient.Credentials = new System.Net.NetworkCredential("用户名","pwd","Domain1");

  • 将服务的登录身份选项更改为我的用户 ID 和密码

  • 发件人和收件人电子邮件地址是真实的,而不是虚拟地址(在我的真实代码中是这样!)

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

我看到被捕获的异常是:

SMTP Exception thrown : System.Net.Mail.SmtpException: Failure sending mail. ---> System.Net.WebException: Unable to connect to the remote server ---> System.Net.Sockets.SocketException: An attempt was made to access a socket in a way forbidden by its access permissions XXX.XXX.XXX.XXX XX at System.Net.Sockets.Socket.DoConnect(EndPoint endPointSnapshot, SocketAddress socketAddress) at System.Net.ServicePoint.ConnectSocketInternal(Boolean connectFailure, Socket s4, Socket s6, Socket& socket, IPAddress& address, ConnectSocketState state, IAsyncResult asyncResult, Int32 timeout, Exception& exception)

欢迎任何想法!

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

最佳答案

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

关于c# - 无法从 Win7 上的 Windows 服务发送 SMTP 电子邮件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9779856/

相关文章:

c# - 如何使用 C# SMTP 客户端对 Domainkeys/DKIM 电子邮件进行签名?

PHP 通过电子邮件自动通知,其背后的逻辑

c++ - 应用程序仅在您以管理员身份运行时运行?

node.js - 如何安装 Node mysql?

c# - Active Directory 公钥使用

c# - 即使 SignalR SelfHost 服务器上的连接未关闭,是否可能会触发 OnDisconnected 事件?

ios - 使用 SwiftUI 发送电子邮件

python - 系统还原后无法从 Windows 7 卸载 Python 3.4.2

c# - c# 中的这个 foreach 是怎么回事?

c# - 使用 System.ComponentModel.DataAnnotations 进行模型绑定(bind)