38

无法在 Windows Vista Business 中测试从 .NET 代码发送电子邮件。

我正在编写代码,一旦经过验证,我将迁移到 SSIS 包。该代码是通过电子邮件向收件人列表发送错误消息。

代码如下,但是当我执行代码时出现异常。

我创建了一个简单的类来发送邮件......设计可能会更好,我正在测试功能,然后再实现更强大的功能、方法等。

namespace LabDemos
{
    class Program
    {
        static void Main(string[] args)
        {
            Mailer m = new Mailer();
            m.test();    
        }
    }
}

namespace LabDemos
{
    class MyMailer
    {    
        List<string> _to = new List<string>();
        List<string> _cc = new List<string>();
        List<string> _bcc = new List<string>();
        String _msgFrom = "";
        String _msgSubject = "";
        String _msgBody = "";            

        public void test(){
        //create the mail message
        MailMessage mail = new MailMessage();

        //set the addresses
        mail.From = new MailAddress("me@domain.com");            

        //set the content
        mail.Subject = "This is an email";
        mail.Body = "this is a sample body";
        mail.IsBodyHtml = false;    

        //send the message
        SmtpClient smtp = new SmtpClient();
        smtp.Host = "emailservername";
        smtp.Port = 25;
        smtp.UseDefaultCredentials = true;
        smtp.Send(mail);            
    }
}

异常消息

Inner Exception
{"Unable to read data from the transport connection: net_io_connectionclosed."}

Stack Trace
"   at System.Net.Mail.SmtpReplyReaderFactory.ProcessRead(Byte[] buffer, Int32 offset, Int32 read, Boolean readLine)\r\n   at System.Net.Mail.SmtpReplyReaderFactory.ReadLines(SmtpReplyReader caller, Boolean oneLine)\r\n   at System.Net.Mail.SmtpReplyReaderFactory.ReadLine(SmtpReplyReader caller)\r\n   at System.Net.Mail.SmtpConnection.GetConnection(String host, Int32 port)\r\n   at System.Net.Mail.SmtpTransport.GetConnection(String host, Int32 port)\r\n   at System.Net.Mail.SmtpClient.GetConnection()\r\n   at System.Net.Mail.SmtpClient.Send(MailMessage message)"


Outer Exception
  System.Net.Mail.SmtpException was unhandled
  Message="Failure sending mail."
  Source="System"
  StackTrace:
       at System.Net.Mail.SmtpClient.Send(MailMessage message)
       at LabDemos.Mailer.test() in C:\Users\username\Documents\Visual Studio 2008\Projects\LabDemos\LabDemos\Mailer.cs:line 40
       at LabDemos.Program.Main(String[] args) in C:\Users\username\Documents\Visual Studio 2008\Projects\LabDemos\LabDemos\Program.cs:line 48
       at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
       at System.AppDomain.nExecuteAssembly(Assembly assembly, String[] args)
       at System.Runtime.Hosting.ManifestRunner.Run(Boolean checkAptModel)
       at System.Runtime.Hosting.ManifestRunner.ExecuteAsAssembly()
       at System.Runtime.Hosting.ApplicationActivator.CreateInstance(ActivationContext activationContext, String[] activationCustomData)
       at System.Runtime.Hosting.ApplicationActivator.CreateInstance(ActivationContext activationContext)
       at System.Activator.CreateInstance(ActivationContext activationContext)
       at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssemblyDebugInZone()
       at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       at System.Threading.ThreadHelper.ThreadStart()
  InnerException: System.IO.IOException
       Message="Unable to read data from the transport connection: net_io_connectionclosed."
       Source="System"
       StackTrace:
            at System.Net.Mail.SmtpReplyReaderFactory.ProcessRead(Byte[] buffer, Int32 offset, Int32 read, Boolean readLine)
            at System.Net.Mail.SmtpReplyReaderFactory.ReadLines(SmtpReplyReader caller, Boolean oneLine)
            at System.Net.Mail.SmtpReplyReaderFactory.ReadLine(SmtpReplyReader caller)
            at System.Net.Mail.SmtpConnection.GetConnection(String host, Int32 port)
            at System.Net.Mail.SmtpTransport.GetConnection(String host, Int32 port)
            at System.Net.Mail.SmtpClient.GetConnection()
            at System.Net.Mail.SmtpClient.Send(MailMessage message)
       InnerException: 
4

12 回答 12

16

有几件事会导致这个问题,这里是我发现的一些事情。问题:您提到“Exchange”——这是一个交换服务器吗?主机是否需要身份验证(可能您需要向客户端添加身份验证)?我首先会尝试将主机分配给静态 IP 地址而不是主机名,以查看它是否首先有效。如果是这样,则很可能是 DNS 映射有问题。

如果您使用虚拟化运行 Exchange 服务器,则需要将 SmtpClient 配置为虚拟服务器的主机 IP,而不是物理托管服务器名称或 IP。右键单击默认 SMTP 虚拟服务器,选择属性,然后转到访问选项卡,单击中继,然后将发送 SMTP 请求的计算机的 IP 地址添加到 SMTP 服务器。(ASP.net 网站)

如果这不起作用,那是因为服务器阻止您发送 SMTP 数据包。您需要确保将发送 SMTP 消息的框添加到 SMTP 服务器。这是通过 IIS 的身份验证选项卡完成的。

我还想指出,您应该处置邮件客户端,或者在“使用”语句中使用客户端。这将确保将“QUIT”发送到服务器并正常关闭连接。

using(SmtpClient smtp = new SmtpClient())
{
    smtp.Host = "emailservername";
    smtp.Port = 25;
    smtp.UseDefaultCredentials = true;
    smtp.Send(mail)
}
于 2011-04-29T12:44:38.960 回答
7

重新启动 IIS。我知道这听起来很傻,重新启动一切。(很抱歉碰到一个旧线程)。但有时重新启动 IIS 会很神奇。我遇到了完全相同的问题并重新启动解决了它。

可能发生了暂时无法解析名称“localhost”的原因。我只是在这里发帖,以便现在面对它的人可能会在尝试进一步调查之前尝试这个快速修复。希望能帮助到你

于 2012-06-28T11:37:19.947 回答
6

如果您在 SMTP 服务设置中指定了 IP 地址,请确保您在 IIS7 中指定了该机器的 IP 地址,而不是将localhost.

IIS7 可以轻松选择“localhost”,但如果 IP 为 10.0.0.1,则会导致此错误

于 2010-04-11T06:52:38.537 回答
6

如果您在 IIS 7 中使用 localhost(使用 Localhost),请将其更改为机器的 IP 地址,而不是 localhost 或 127.0.0.1

还可以按照以下链接相应地更新您的邮件服务器中继:

信箱不可用。服务器响应为:5.7.1 无法为 abc@xyz.com 中继

于 2012-12-06T17:22:17.980 回答
3

Vista 和 Windows 7 没有任何 SMTP 服务器,此功能自 Windows XP 以来已被删除,因此您需要明确设置您的 SMTP 服务器,市场上有几种工具可以用于此,您可以检查一下。此外,一旦您配置了 SMTP,请记住检查您将用于发送电子邮件的服务器名称。

于 2011-01-31T11:20:16.747 回答
2

我遇到了同样的问题,因为我的服务器(虚拟服务器)上有多个 IP,并且我的主机指向localhost,而我的 SMTP 虚拟服务器被分配给一个特定的 IP:

 <smtp deliveryMethod="Network">
       <network host="localhost" port="25" defaultCredentials="false"/>
 </smtp>

有两种解决方案:

  1. 更改您的代码并将主机设置为 SMTP 虚拟服务器使用的特定 IP,而不是 localhost。
  2. 将 SMTP 虚拟服务器 IP 更改为所有未分配

查看/更改 SMTP 虚拟服务器 IP:右键单击默认 SMTP 虚拟服务器,选择属性,在常规选项卡上更改/查看 IP 地址。

希望这可以为遇到同样问题的人节省一天的时间。

于 2015-02-12T00:39:25.973 回答
1

我发现 Vista Business OS 没有附带 IIS SMTP。我怀疑这是拼图中缺失的部分。有没有人在这个问题上遇到过运气?

于 2009-07-28T23:31:56.987 回答
1

我在过去 6 小时内遇到了这个问题,我对此很陌生,所以我试图通过以下方式解决这个问题

1) 我打开了命令提示符(例如 Ctrl + R 键入 cmd 并回车)。
2) 并检查 SMTP 服务器 ping 并检查响应。
3)如果它得到响应,那么没关系,移动下一步 4 其他明智的 smtp 名称是错误的。
4)然后我通过 telnet smtp 端口(例如 25 )检查是否打开。
5) 使用这个 cmd 我们检查 SMTP 响应。
6) telnet "yoursmtpname" "portno" (eg telnet smtp.gmail.com 25)
7) 如果 telnet 不工作,请安装或从控制面板添加新功能。
8) 如果它工作,那么它是通过结果。
9) 220 mx.google.com ESMTP 。

使用上述步骤,我们可以确定 smtp 连接是否已准备好发送邮件。

于 2014-07-24T12:11:50.767 回答
1

您的代码是否不完整。破折号在识别它时是正确的。其他然后检查 smtp 组件是否已安装或不检查链接文本

于 2011-01-19T11:59:07.067 回答
1

我使用 .NET Framework v4.5 在 VB 中开发了一个 Windows 服务应用程序,最近遇到了这个问题。

首先,有一点背景 - 在尝试处理错误“服务不可用,关闭传输通道。服务器响应是:错误:一个会话中的消息太多”后,我遇到了 OP 的错误,通过调用 Dispose 方法解决了这个错误在每封电子邮件发送后的 SmtpClient 对象上。为了安全起见,我还在 MailMessage 对象上调用了 Dispose。

好的,现在“一个会话中的消息太多”问题已解决,但现在我偶尔会收到“无法从传输连接读取数据:net_io_connectionclosed”错误。惊人的。事实证明,我没有始终如一地实现我的电子邮件类——在一种情况下,它被处理掉了,而在另一种情况下却没有。

这是一个为我解决了这两个问题的示例(它在 VB 中,但您明白了):

With New clsEmail(True)
    With .Message
        .To.Add("user@domain.com")
        .Subject = msgSubject
        .Body = msgContents
    End With

    .Server.Send(.Message)
    .Server.Dispose()
    .Message.Dispose()
End With

除其他外,我的电子邮件类具有 2 个属性 - 消息 (System.Net.Mail.MailMessage) 和服务器 (System.Net.Mail.SmtpClient),这是本示例中要处理的内容。

在我的服务中发送电子邮件的每个实例都以这种方式实现后,在数百封电子邮件之后,我没有遇到任何问题。

于 2015-08-11T19:35:22.083 回答
0

升级到 .NET 4.0 并应用所有安全更新

于 2011-04-29T06:20:04.460 回答
0

我在一个月内面临同样的问题。我尝试了微软官方网站上提供的所有可能的解决方案。最后,我找到了它的根本原因。我已将 web.config 文件中的 targetFramework 从 4.5.2 更新到4.6.1

编译 debug="true" targetFramework="4.6.1" httpRuntime maxRequestLength="183500800" executionTimeout="3600" targetFramework="4.6.1" enableVersionHeader="false"

上述解决方案对我有用,现在我的电子邮件已从应用程序成功触发。

于 2022-02-18T11:47:43.853 回答