2013-06-28 20 views
7

Ricevo un'eccezione quando si utilizza SmtpClient in un ruolo di Azure Web o Worker."La funzione richiesta non è supportata" eccezione quando si utilizza SmtpClient nel ruolo di Azure

ho creato una console app per eseguire manualmente il ruolo VM via RDP di riprodursi:

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

Localmente invia una e-mail che bene. Su Azure ottengo questo:

 
    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 

ho confermato che le macchine Azure possono accedere alla porta 587 del server di posta eseguendo TCPing.exe sui ruoli Azure tramite RDP.

risposta

5

Quindi apparentemente il problema era una versione NTLM non corrispondente tra i server.

dopo l'accesso al ruolo Azure e disabilitando l'impostazione "Richiedi protezione NTLMv2" per i clienti, poi ha funzionato:

enter image description here

(Grazie a this answer e this answer di ispirazione.)

Attualmente vedendo se siamo in grado di ottenere il nostro server SMTP aggiornato per essere compatibile con NTLMv2. Altrimenti dovremo impostare un codice automatizzato per disabilitare in qualche modo quell'impostazione su ogni istanza di ruolo generata.

Apparentemente questo codice ha funzionato il mese scorso. Quindi suppongo che un recente aggiornamento del sistema operativo di Azure abbia cambiato le impostazioni predefinite.

FYI: La chiave di registro per questa impostazione è

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

per automatizzare l'impostazione del chiave di registro add a startup task contenente un comando reg add come questo:

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

dove /f impone la sovrascrittura dell'impostazione corrente e ^ consente di suddividere il comando in più righe per una migliore leggibilità. Assicurati inoltre di salvare il comando nella codifica ASCII per impedire issues during role startup.

Problemi correlati