【问题标题】:The remote name could not be resolved when sending mail using SMTP with Host as IP address使用主机作为 IP 地址的 SMTP 发送邮件时无法解析远程名称
【发布时间】:2016-09-28 08:51:28
【问题描述】:
MailMessage message = new MailMessage();
message.Subject = "test";
message.Body = "test";
message.To.Add("test@gmail.com");
message.From = new MailAddress("bob@internalhost.com");
SmtpClient smtp = new SmtpClient();
smtp.DeliveryMethod = SmtpDeliveryMethod.Network;
smtp.UseDefaultCredentials = false;
smtp.Host = "172.22.0.20";
smtp.Port = 25;
smtp.Send(message);

知道为什么我可能会收到错误

无法解析远程名称。

显然不需要解析,因为我已经指定了 IP 地址。我可以在端口 25 上 ping IP 甚至 telnet 并成功发送电子邮件。但是,我无法发送电子邮件。

我运行了wireshark 跟踪,看起来没有任何流量正在发送到 172.22.0.20

【问题讨论】:

  • 添加并检查它是否适用于真或假smtp.EnableSsl = false
  • 还需要加NetworkCredential nc = new NetworkCredential(EmailFrom, tEmailFromPassword);
  • @LeeTickett,您的设置非常独特,可以匿名访问 SMTP 服务器。即使您指定了smtp.UseDefaultCredentials = false。它将尝试设置凭据以访问 SMTP。使用smtp.Credentials = new NetworkCredential(),您明确表示该请求将匿名进行。我猜在你的情况下smtpconnection 通过错误的路径进入,你会收到误导性的错误消息。
  • 可能是一个红鲱鱼,但 smpt 主机是一个字符串,你给它分配了一个数字:smtp.Host = 172.22.0.20; - 不确定你是如何编译的,如果问题再次发生,请包括完整的代码和错误消息/StackTrace。
  • 如果您在工作中这样做,您是否在网络防火墙后面?防火墙或防病毒软件是否会导致问题?您可能想尝试与您的系统管理员讨论此问题。您也可以尝试在家中使用家用计算机运行代码。如果仍然无法正常工作,请(暂时)禁用您的防病毒软件并重试。

标签: c# .net windows smtpclient


【解决方案1】:

我使用此代码并且它在我的最终工作正常 确保您使用正确的 IP 地址和端口号。我认为您的端口号不正确。 (打开您的电子邮件 ID 并检查邮件配置)

MailMessage mail = new MailMessage("bob@internalhost.com", "Toemai@email.com");
mail.Subject = "Subject";
mail.IsBodyHtml = true;
mail.Body = "this is email body";

SmtpClient client = new SmtpClient("172.22.0.20");
client.DeliveryMethod = SmtpDeliveryMethod.Network;
client.UseDefaultCredentials = false;
client.Credentials = new System.Net.NetworkCredential("bob@internalhost.com", "password");
client.Port = 25;

client.Send(mail);

【讨论】:

    【解决方案2】:

    我测试了你的代码:

    static void Main(string[] args)
            {
                try
                {
                    MailMessage message = new MailMessage();
                    message.Subject = "test";
                    message.Body = "test";
                    message.To.Add("atmane.elbouachri@gmail.com");
                    message.From = new MailAddress("atmane.elbouachri@softeam.fr");
                    SmtpClient smtp = new SmtpClient();
                    smtp.DeliveryMethod = SmtpDeliveryMethod.Network;
                    smtp.UseDefaultCredentials = false;
                    smtp.Host = "127.0.0.1";
                    smtp.Port = 25;
                    smtp.Send(message);
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex);
                    Console.ReadLine();
                }
            }
    

    而且看起来不错。我使用了 smtp4dev 工具,它完成了这个:

    220 localhost smtp4dev ready
    EHLO Aepro
    250-Nice to meet you.
    250-8BITMIME
    250-STARTTLS
    250-AUTH=CRAM-MD5 PLAIN LOGIN ANONYMOUS
    250-AUTH CRAM-MD5 PLAIN LOGIN ANONYMOUS
    250 SIZE
    MAIL FROM:<atmane.elbouachri@softeam.fr>
    250 Okey dokey
    RCPT TO:<atmane.elbouachri@gmail.com>
    250 Recipient accepted
    RSET
    250 Rset completed
    RSET
    250 Rset completed
    MAIL FROM:<atmane.elbouachri@softeam.fr>
    250 Okey dokey
    RCPT TO:<atmane.elbouachri@gmail.com>
    250 Recipient accepted
    DATA
    354 End message with period
    MIME-Version: 1.0
    

    但是当我放一个假IP时我有一个例外(女巫是正常的)。

    我认为你的 IP 不好,或者你的防火墙肯定有问题

    【讨论】:

      【解决方案3】:

      下面的代码在我的最后工作正常.....

      MailMessage mailMessage = new MailMessage("abc@xyz.in", "receiver@xyz.in");
      mailMessage.Priority = System.Net.Mail.MailPriority.High;
      mailMessage.Body = "message";
      mailMessage.IsBodyHtml = true;
      SmtpClient smtpClient = new SmtpClient("host/IP", 25);
      NetworkCredential credentials = new NetworkCredential("abc@xyz.in", "password");
      smtpClient.Credentials = credentials;
      smtpClient.DeliveryMethod = SmtpDeliveryMethod.Network;
      smtpClient.Credentials = credentials;
      smtpClient.Send(mailMessage);
      

      【讨论】:

        【解决方案4】:

        如果您的代码在服务应用程序池中运行 - 您需要将流程模型中高级设置下的标识设置为“网络服务”,而不是默认的“应用程序池标识”。如果你这样做,它每次都会起作用。如果您不这样做,则有些电子邮件有效,有些则无效。这是一个奇怪的许可。

        【讨论】:

        • 我几天前使用 log4net smtp appender 遇到了这个问题。一些电子邮件有效。有些没有。我完全被吓坏了。但是你瞧,我在 StackOverflow 上发现了一个类似的问题,它提供了解决方案(如上所述)并且效果很好。我现在和你分享。
        【解决方案5】:

        此处出现类似问题:System.Net.WebException: The remote name could not be resolved:

        如您所见,包裹在 try-catch 语句中的简单轮询机制​​可以让您有机会在向用户报告之前多次尝试您的方法块(偶尔会失败)。

        【讨论】:

          【解决方案6】:

          我看到的问题是这一行:

          smtp.Host = 172.22.0.20; 
          

          smtp.Host 需要字符串。所以,应该是smtp.Host = "172.22.0.20";除此之外,请添加下面的代码,以便我们看到错误

          try 
          {
              smtp.Send(mail); 
          }
          catch (Exception e) 
          {
              Debug.WriteLine("Exception Message: " + e.Message);
          }
          

          【讨论】:

          • 那是我的错误......代码实际上是从 app.config 中提取 IP。当我复制/粘贴到 SO 时,我用 IP 替换了它。不幸的是,这不是问题。 e.Message 是the remote name could not be resolved
          • @LeeTickett,没问题!如果您从 web.config 中提取它,请粘贴主机和端口的 web.config。它应该如下所示,您的交付方式应该是 smtp.DeliveryMethod = SmtpDeliveryMethod.PickupDirectoryFromIis:
          【解决方案7】:

          您的 IP 地址不正确,或者您可能在防火墙下工作。还要检查您的 DNS 设置。

          【讨论】:

            【解决方案8】:

            也许反向名称是强制性的,您是否尝试在主机文件中为该 IP 注册一个名称? (当然也可以在您的 DNS 中)

            尝试添加:

            172.22.0.20 my-smtp.example
            

            【讨论】:

              猜你喜欢
              • 2013-01-29
              • 2017-08-20
              • 2011-03-12
              • 2013-03-25
              • 2014-10-13
              • 2020-02-07
              • 2021-01-04
              • 2021-10-08
              • 2020-08-25
              相关资源
              最近更新 更多