【问题标题】:SmtpException (Syntactically invalid EHLO argument)SmtpException(语法上无效的 EHLO 参数)
【发布时间】:2013-12-13 21:37:14
【问题描述】:

我们刚刚更改了 .net mailSettings 以针对新的 smtp 服务器,但在尝试发送电子邮件时遇到以下问题“参数或参数中的语法错误。服务器响应是:语法上无效的 EHLO 参数”

我假设我们的参数(用户名、主机、密码和端口)是正确的,就像我们在另一台服务器上部署相同的应用程序一样,一切正常。

我们有问题的服务器的名称(机器名称包含下划线)是否可以对此 Smtp 异常负责?如果是这样,最好的解决方法应该是什么?

谢谢!

编辑:

我们正在使用基本的.net System.Net.Mail.SmtpClient,例如

Client = new System.Net.Mail.SmtpClient(host, Convert.ToInt32(port))
{
    Credentials = new NetworkCredential(username, password)
};
Client.Send(message); /*where message is an instance of MailMessage */
(host xx.xx.gridserver.com, userName xx@xxx.com, port 587) 

【问题讨论】:

  • 我不认为服务器名称有问题,否则您根本不会得到响应。您使用的是内置的 .NET Smtp 类吗?

标签: .net


【解决方案1】:

EHLO 仅可选地被邮件服务器支持。如果服务器以EHLO 开头,则客户端可以使用EHLO(并暗示更多功能)。如果服务器以HELO 开头,它更基本,并且客户端不能在没有得到(a)错误+失败或(b)错误+回退HELO的情况下回复EHLO(所以你可能会收到错误,但仍会发送邮件)。

检查新服务器上运行的软件,也许升级或切换到旧服务器上运行的软件(如果可能的话),或者可能有一个设置阻止 mailSettings 使用高级问候语。

【讨论】:

    【解决方案2】:

    根据this link,下划线可能是问题所在。我们遇到了完全相同的问题,在名称中带有下划线的主机上也是如此。

    编辑。

    我确实找到了解决方法:有人发布了一个扩展的 SmtpClient,它使用反射来覆盖私有主机变量。 See here for the fix.

    请注意,私有字段的名称在不同的.NET 运行时版本之间已更改,因此修改代码如下:

    /// <summary>
    /// Returns the private "localHostName" field.
    /// </summary>
    /// <returns>
    /// The <see cref="FieldInfo"/> for the private
    /// "localHostName" field.
    /// </returns>
    /// <remarks>In earlier versions of .NET this private field was 'localHostName', now it is 'clientDomain'</remarks>
    private static FieldInfo GetLocalHostNameField()
    {
      const BindingFlags flags = BindingFlags.Instance | BindingFlags.NonPublic;
      System.Reflection.FieldInfo result = typeof(SmtpClient).GetField("clientDomain", flags);
      if (null == result)
        result = typeof(SmtpClient).GetField("localHostName", flags);
      return result;
    }
    

    用法:

    SmtpClientEx client = new SmtpClientEx();
    client.LocalHostName = "localhost";
    
    MailMessage msg = new MailMessage();
    ...
    msg.Send()
    

    【讨论】:

    • 我们找不到解决方案来修复它,所以我们决定使用另一个 smtp 服务器。它正在使用它。我敢打赌,可能是我们服务器名称上的下划线,没有被 smtp 服务器接受。
    【解决方案3】:

    尝试从计算机名称中删除 下划线非拉丁字母

    例子:

    我有“PC-4-ПК”,更改为“PC-4”后一切正常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-06
      • 2015-04-25
      • 2020-01-16
      • 2016-07-24
      相关资源
      最近更新 更多