我们刚刚更改了.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)
答案 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工作正常。