7

在 Azure Web 或辅助角色中使用 SmtpClient 时出现异常。

我创建了一个控制台应用程序以通过 RDP 在角色 VM 上手动运行以重现:

using System;
using System.Net;
using System.Net.Mail;
using System.Text;

namespace ConsoleApplication1
{
   class Program
   {
      static void Main()
      {
         var mailClient = new SmtpClient("mail.redacted.com", 587);
         mailClient.EnableSsl = true;
         mailClient.DeliveryFormat = SmtpDeliveryFormat.International;
         mailClient.DeliveryMethod = SmtpDeliveryMethod.Network;

         mailClient.UseDefaultCredentials = false;//SET THIS FIRST OR IT WIPES OUT CREDENTIALS
         NetworkCredential netCreds = new NetworkCredential("mail@redacted.com", "12345 same combination on my luggage");
         mailClient.Credentials = netCreds;

         MailMessage message = new MailMessage();
         message.SubjectEncoding = Encoding.UTF8;
         message.BodyEncoding = Encoding.UTF8;
         message.IsBodyHtml = false;

         message.From = new MailAddress("mike@redacted.com");
         message.To.Add(new MailAddress("mike@redacted.com"));

         message.Subject = "testing " + DateTime.UtcNow;
         message.Body = "The quick brown fox jumped over the lazy dogs.";

         mailClient.Send(message);
      }
   }
}

在本地它发送电子邮件就好了。在 Azure 上,我得到了这个:

    未处理的异常:System.Net.Mail.SmtpException:发送邮件失败。---> System.ComponentModel.Win32Exception: 请求的函数不受支持
       在 System.Net.NTAuthentication.GetOutgoingBlob(字节 []incomingBlob,布尔 throwOnError,SecurityStatus & statusCode)
       在 System.Net.NTAuthentication.GetOutgoingBlob(字符串传入Blob)
       在 System.Net.Mail.SmtpNtlmAuthenticationModule.Authenticate(字符串质询,NetworkCredential 凭据,对象 sessionCookie,字符串 spn,ChannelBinding channelBindingToken)
       在 System.Net.Mail.SmtpConnection.GetConnection(ServicePoint servicePoint)
       在 System.Net.Mail.SmtpClient.Send(MailMessage 消息)
       --- 内部异常堆栈跟踪结束 ---
       在 System.Net.Mail.SmtpClient.Send(MailMessage 消息)
       在 c:\development\ConsoleApplication1\ConsoleApplication1\Program.cs:line 39 中的 ConsoleApplication1.Program.Main()

我已经确认 Azure 机器可以通过 RDP 在 Azure 角色上运行 TCPing.exe 来访问邮件服务器上的端口 587。

4

1 回答 1

5

所以显然问题是服务器之间的 NTLM 版本不匹配。

登录到 Azure 角色并为客户端禁用“需要 NTLMv2 安全性”设置后,它就起作用了:

在此处输入图像描述

(感谢这个答案这个答案的灵感。)

目前看看我们是否可以将我们的 SMTP 服务器升级为与 NTLMv2 兼容。否则,我们将不得不设置一些自动代码,以某种方式禁用每个生成的角色实例上的设置。

显然,这段代码上个月有效。所以我猜测最近的 Azure OS 升级改变了默认设置。

仅供参考:此设置的注册表项是

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\MSV1_0] "NtlmMinClientSec"=dword:20000000

要自动设置注册表项,请添加一个包含如下命令的启动任务:reg add

reg add HKLM\SYSTEM\CurrentControlSet\Control\Lsa\MSV1_0 ^
 /v NtlmMinClientSec ^
 /t REG_DWORD ^
 /d 0x20000000 ^
 /f

where/f强制覆盖当前设置,^只允许将命令分成多行以提高可读性。还要确保以 ASCII 编码保存命令,以防止角色启动期间出现问题

于 2013-06-28T21:27:39.970 回答