2013-06-28 15 views
7

Ich erhalte eine Ausnahme, wenn ich SmtpClient in einer Azure Web- oder Worker-Rolle verwende."Die angeforderte Funktion wird nicht unterstützt" Ausnahme bei der Verwendung von SmtpClient in der Azure-Rolle

Ich habe eine Konsolenanwendung manuell über die Rolle VMs über RDP laufen zu reproduzieren:

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("[email protected]", "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("[email protected]"); 
     message.To.Add(new MailAddress("[email protected]")); 

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

     mailClient.Send(message); 
     } 
    } 
} 

Lokal sendet eine E-Mail einfach gut. Auf Azure bekomme ich dies:

 
    Unhandled Exception: System.Net.Mail.SmtpException: Failure sending mail. ---> System.ComponentModel.Win32Exception: The function requested is not supported 
     at System.Net.NTAuthentication.GetOutgoingBlob(Byte[] incomingBlob, Boolean throwOnError, SecurityStatus& statusCode) 
     at System.Net.NTAuthentication.GetOutgoingBlob(String incomingBlob) 
     at System.Net.Mail.SmtpNtlmAuthenticationModule.Authenticate(String challenge, NetworkCredential credential, Object sessionCookie, String spn, ChannelBinding channelBindingToken) 
     at System.Net.Mail.SmtpConnection.GetConnection(ServicePoint servicePoint) 
     at System.Net.Mail.SmtpClient.Send(MailMessage message) 
     --- End of inner exception stack trace --- 
     at System.Net.Mail.SmtpClient.Send(MailMessage message) 
     at ConsoleApplication1.Program.Main() in c:\development\ConsoleApplication1\ConsoleApplication1\Program.cs:line 39 

Ich habe bestätigt, dass die Azure Maschinen Port 587 auf dem Mail-Server, indem Sie TCPing.exe auf die Azure-Rollen über RDP zugreifen können.

Antwort

5

Also anscheinend war das Problem eine nicht übereinstimmende NTLM-Version zwischen Servern.

Nachdem in die Azure Rollen Anmeldung und die Einstellung "erfordern NTLMv2-Sicherheit" für die Kunden zu deaktivieren, dann funktionierte es:

enter image description here

(Dank this answer und this answer für Inspiration.)

Aktuell sehen, ob wir unseren SMTP-Server auf NTLMv2-kompatibel bringen können. Andernfalls müssen wir einen automatisierten Code einrichten, um diese Einstellung für jede generierte Rolleninstanz zu deaktivieren.

Anscheinend arbeitete dieser Code letzten Monat. Ich nehme an, ein aktuelles Upgrade von Azure OS hat die Standardeinstellungen geändert.

Zur Info: Der Registrierungsschlüssel für diese Einstellung ist

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

Zur Automatisierung der Einstellung Registrierungsschlüssel add a startup task einen reg add Befehl wie folgt enthält:

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

wo /f erzwingt die aktuelle Einstellung überschrieben werden und ^ erlaubt nur den Befehl in mehrere Zeilen für eine bessere Lesbarkeit zu brechen. Stellen Sie außerdem sicher, dass der Befehl in ASCII-Codierung gespeichert wird, um issues during role startup zu verhindern.

Verwandte Themen