2013-06-28 25 views
7

Tôi nhận được ngoại lệ khi sử dụng SmtpClient trong vai trò Azure Web hoặc Worker."Chức năng được yêu cầu không được hỗ trợ" ngoại lệ khi sử dụng SmtpClient trong vai trò Azure

Tôi tạo ra một ứng dụng giao diện điều khiển bằng tay chạy trên vai trò máy ảo thông qua RDP để tái sản xuất:

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]acted.com"); 
     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); 
     } 
    } 
} 

tại địa phương nó sẽ gửi một email tốt. Trên Azure tôi có được điều này:

 
    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 

Tôi xác nhận rằng các máy Azure có thể truy cập vào cổng 587 trên máy chủ mail bằng cách chạy TCPing.exe vào vai trò Azure qua RDP.

Trả lời

5

Vì vậy, dường như vấn đề là phiên bản NTLM không khớp giữa các máy chủ.

Sau khi đăng nhập vào các vai trò Azure và vô hiệu hóa các thiết lập "Require NTLMv2 an ninh" cho khách hàng, sau đó nó làm việc:

enter image description here

(Nhờ this answerthis answer để tìm cảm hứng.)

Hiện nay nhìn thấy nếu chúng ta có thể nhận được máy chủ SMTP của chúng tôi được nâng cấp tương thích NTLMv2. Nếu không, chúng tôi sẽ phải thiết lập một số mã tự động để bằng cách nào đó vô hiệu hóa cài đặt đó trên từng cá thể vai trò được tạo.

Rõ ràng mã này đã hoạt động vào tháng trước. Vì vậy, tôi đoán một nâng cấp Azure OS gần đây đã thay đổi các thiết lập mặc định.

FYI: Chìa khóa registry cho thiết lập này là

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

Để tự động thiết lập các khóa đăng ký add a startup task chứa một lệnh reg add như sau:

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

trong đó /f buộc cài đặt hiện tại bị ghi đè và ^ chỉ cho phép ngắt lệnh thành nhiều dòng để dễ đọc hơn. Ngoài ra hãy chắc chắn để lưu lệnh trong mã hóa ASCII để ngăn chặn issues during role startup.

Các vấn đề liên quan