2013-06-28 19 views
7

Otrzymuję wyjątek podczas używania SmtpClient w roli Azure Web lub Worker."Żądana funkcja nie jest obsługiwana" wyjątek podczas używania SmtpClient w roli Azure

I stworzył aplikację konsoli ręcznie uruchomić na roli VM poprzez RDP do reprodukcji:

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); 
     } 
    } 
} 

Lokalnie wysyła wiadomość e-mail po prostu w porządku. Na Azure uzyskać to:

 
    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 

Ustaliliśmy, że Azure maszyny mogą uzyskać dostęp do portu 587 na serwerze pocztowym, uruchamiając TCPing.exe na Azure ról poprzez PROW.

Odpowiedz

5

Najwyraźniej problemem była niedopasowana wersja NTLM między serwerami.

Po zalogowaniu do Azure ról i wyłączanie ustawienia "Wymagaj zabezpieczenia NTLMv2" dla klientów, a następnie pracował:

enter image description here

(Dzięki this answer i this answer inspiracji.)

Obecnie sprawdzanie, czy możemy zmodernizować nasz serwer SMTP, aby był kompatybilny z NTLMv2. W przeciwnym razie będziemy musieli skonfigurować zautomatyzowany kod, aby w jakiś sposób wyłączyć to ustawienie dla każdej wygenerowanej instancji roli.

Podobno ten kod działał w zeszłym miesiącu. Domyślam się, że ostatnia aktualizacja systemu Azure zmieniła domyślne ustawienia.

FYI: Klucz rejestru dla tego ustawienia jest

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

Aby zautomatyzować ustawienie klucz rejestru add a startup task zawierający polecenie reg add tak:

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

gdzie /f wymusza zastąpienie bieżącego ustawienia, a ^ pozwala po prostu przerwać polecenie na wiele wierszy, aby uzyskać lepszą czytelność. Upewnij się również, aby zapisać polecenie w kodowaniu ASCII, aby zapobiec issues during role startup.