SmtpException(语法上无效的EHLO参数)

时间:2010-09-16 19:36:57

标签: .net

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

我认为我们的参数(userName,host,password和port)是正确的,就像我们在另一台服务器中部署相同的应用程序一样,一切正常。

我们遇到问题的服务器名称(机器名称是否包含下划线)可以负责此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) 

3 个答案:

答案 0 :(得分:1)

邮件服务器仅支持

EHLO。如果服务器以EHLO启动,则客户端可以使用EHLO(并隐含其他功能)。如果服务器以HELO开头,则它更基本,并且客户端无法回复EHLO,而不会得到(a)错误+失败或(b)错误+能力回退{{} 1}}(所以你可以得到错误,但仍然发送邮件)。

检查新服务器上运行的软件,可能是升级它还是将其切换到旧服务器上运行的软件(如果可能的话),或者某个地方可能存在阻止mailSettings使用高级问候语的设置。

答案 1 :(得分:1)

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

EDIT。

我找到了一个修复:有人发布了一个扩展的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()

答案 2 :(得分:0)

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

示例:

我有“PC-4-ПК”,在更改为“PC-4”后,everething工作正常。