2016-01-21 28 views
5

Tôi có một SmtpClient đơn giản:Làm thế nào để xử lý chính xác System.Net.Mail.SmtpException?

var smtp = new SmtpClient { Host = host, ...}; 
smtp.Send(message); 

tôi có thể có một máy chủ khác nhau: smtp.gmail.com, smtp.yandex.ru, vv

Khi smtp.Send(message); thực hiện Tôi có ngoại lệ khác nhau (phụ thuộc vào máy chủ) do cùng một vấn đề - Xác minh 2 yếu tố bị tắt.

Đối với gmail của mình System.Net.Mail.SmtpException: The SMTP server requires a secure connection or the client was not authenticated. The server response was: 5.5.1 Authentication Required.

Đối với yahoo và Yandex của nó System.Net.Mail.SmtpException depth 0: The operation has timed out. (0x80131500)

tôi làm không phải bây giờ về những người khác gửi các nhà cung cấp ngoại lệ nhưng làm thế nào để ngoại lệ chính xác ném ("bạn cần phải bật xác minh 2 yếu tố") chỉ một lần? Có thể không? Hoặc làm thế nào để giảm thiểu trùng lặp mã?

Trả lời

0

Tôi không chắc chắn cách bạn chọn máy chủ để sử dụng (tuyên bố if hoặc switch?) Nhưng bạn có thể xem xét thêm hai lớp khách hàng mới kế thừa từ SmtpClient, ví dụ: cho một YahooClient:

class YahooClient : SmtpClient { 

    private const string Host = "smtp.yahoo.com"; 

    Send(MailMessage message) { 

      /// Call base send and handle exception    
      try { 
      base.Send(message) 
      } 
      catch(ex as SmtpException) { 
       // Handle accordingly 
      } 
    } 
} 

Hơn nữa, bạn có thể giới thiệu thực hiện một giao diện phù hợp và sử dụng IoC (hoặc mô hình chiến lược vv) để tiêm cho khách hàng chính xác dựa trên cấu hình của bạn, ví dụ .

class YahooClient : SmtpClient, IMySmtpClient { 

} 

interface IMySmtpClient { 
    void Send(MailMessage message); 
} 

class ConsumingMailSender(IMySmtpClient client) { 

     // Create message and send 
     var message = new MailMessage etc.... 

     client.Send(message); 
} 

Đây có lẽ là quá mức cần thiết nhưng có thể tránh vi phạm SRP và phải thực hiện logic có điều kiện trong phương pháp bạn đang sử dụng để gửi email trong

+0

'host' đó là một tham số trong phương pháp này: 'công cộng void Send (chuỗi host) ' –

+0

Vì vậy, thay vì gửi tên máy chủ như là một chuỗi trong phương thức, bạn sẽ gửi triển khai SmtpClient. Điều này thường được thực hiện bằng cách sử dụng Dependency Injection. Bạn cũng có thể làm điều đó bằng cách tạo lớp khách hàng SmtpClass thích hợp (ví dụ: YahooSmtpClass) trong 'chuyển đổi' hoặc' if' dựa trên cấu hình của bạn hoặc điều kiện khác. – Graham

+0

Không cần cho các khách hàng khác nhau. Nhưng một lớp bộ xử lý lỗi có thể chọn bởi tên miền máy chủ (từ tệp cấu hình) sẽ hoạt động – TomTom

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