2015-07-22 31 views
5

tôi đang cố gắng để kết nối với iCloud qua SmtpClientMailkit SMTP - STARTTLS & TLS cờ

Các thiết lập Tôi đang sử dụng như sau:

tên

Server: smtp.mail.me.com
SSL Required : Có
Nếu bạn thấy thông báo lỗi khi sử dụng SSL, hãy thử sử dụng TLS hoặc STARTTLS thay thế.
Cổng: 587
SMTP Authentication Required: Có - với tên truy cập và mật khẩu liên quan

Nếu tôi sử dụng SSL tôi nhận được "Handshake thất bại do định dạng gói tin bất ngờ"

Nếu tôi không sử dụng SSL thị giác studio debugger treo trên kết nối.

Tôi nghĩ rằng vấn đề là tôi không nói cho SmtpClient sử dụng tls nhưng tôi không thể tìm thấy tài liệu về cách thực hiện việc này.

Mã này là như sau:

using (var client = new SmtpClient()) { 
    client.Timeout = 1000 * 20; 
    //client.Capabilities. 
    client.AuthenticationMechanisms.Remove ("XOAUTH2"); 

    client.Connect("SMTP.mail.me.com", 587, false); //dies here 
    //client.Connect(servername, port, useSsl); 
    //can I set tls or starttls here?? 
    client.Authenticate(username, password); 
    client.Send(FormatOptions.Default, message); 
} 

Am Tôi có thể đặt TLS hoặc STARTTLS bằng tay. Một điều tôi đã thử là sau nhưng có vẻ như không hoạt động

client.Connect(new Uri("smtp://" + servername + ":" + port + "/?starttls=true")); 

Cảm ơn bạn đã giúp đỡ về điều này.

+0

Tại sao bạn chuyển 'false' cho cờ' useSSL' nếu bạn đang nói bạn yêu cầu 'SSL'? – Rob

+0

@Rob Tôi đã thử với sự thật và tôi nhận được một cái bắt tay không thành công do định dạng gói tin không mong muốn. iCloud đề xuất điều này: "Nếu bạn thấy thông báo lỗi khi sử dụng SSL, hãy thử sử dụng TLS hoặc STARTTLS thay thế." – cavej03

Trả lời

8

Phương thức Connect() mà bạn đang sử dụng chỉ cho phép bật/tắt kết nối được bao bọc SSL không giống với StartTLS.

Do sự nhầm lẫn, tôi đã thực hiện một phương pháp Connect() riêng biệt mà làm cho điều này rõ ràng hơn những gì đang xảy ra:

using (var client = new SmtpClient()) { 
    // Note: don't set a timeout unless you REALLY know what you are doing. 
    //client.Timeout = 1000 * 20; 

    // Removing this here won't do anything because the AuthenticationMechanisms 
    // do not get populated until the client connects to the server. 
    //client.AuthenticationMechanisms.Remove ("XOAUTH2"); 

    client.Connect ("smtp.mail.me.com", 587, SecureSocketOptions.StartTls); 

    client.AuthenticationMechanisms.Remove ("XOAUTH2"); 

    client.Authenticate (username, password); 
    client.Send (message); 
} 

Hãy thử điều đó.

+0

hoạt động này .. @ cavej03 vui lòng chấp nhận anwser này – om471987

0

Bạn có thể đặt tùy chọn của bạn để "SecureSocketOptions.Auto" cái gì đó như

await client.ConnectAsync(mailService.Host, mailService.Port, SecureSocketOptions.Auto); 

MailKit này sẽ tự động quyết định sử dụng SSL hoặc TLS.

+0

Nó sử dụng để quyết định điều gì? Số cổng? –

+0

Số cổng bạn phải đặt trong mô hình của mình. Nó chỉ là số cổng từ google mail hoặc những gì bao giờ hết. Vì vậy, tôi chỉ cần gọi mô hình của tôi và yêu cầu cảng và máy chủ từ DB của tôi .... Nhưng điều quan trọng ở đây là "SecureSocketOptions.Auto" – error505

+0

@PaulKnopf Có, MailKit sử dụng cổng để quyết định. Nó không phải là hệ thống tốt nhất trên thế giới, nhưng nó hoạt động 99% thời gian. – jstedfast

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