2015-07-22 3 views
5

Я пытаюсь подключиться к ICloud через SmtpClientMailkit SMTP - StartTLS & TLS флаги

Настройки я использую следующие:

имя

Сервер: smtp.mail.me.com
SSL Требуется : Да
Если вы видите сообщение об ошибке при использовании SSL, попробуйте вместо этого использовать TLS или STARTTLS.
Порт: 587
SMTP Authentication Required: Да - с соответствующим именем пользователя и паролем

Если я использую SSL я получаю «Рукопожатие не удалось из-за неожиданный формат пакет»

Если я не использую SSL визуальной отладчик студии висит на подключении.

Я думаю, проблема в том, что я не говорю SmtpClient использовать tls, но я не могу найти документацию о том, как это сделать.

Код выглядит следующим образом:

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

Могу ли я в состоянии установить TLS или StartTLS вручную. Одна вещь, которую я постарался, - это следующее, но, похоже, не работает

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

Спасибо за любую помощь.

+0

Почему вы передаете 'false' для флага' useSSL', если вы говорите, что вам нужен 'SSL'? – Rob

+0

@Rob Я пробовал использовать true, и я получил сообщение об ошибке из-за неожиданного формата пакета. iCloud предлагает следующее: «Если вы видите сообщение об ошибке при использовании SSL, попробуйте вместо этого использовать TLS или STARTTLS». – cavej03

ответ

8

Используемый метод Connect() позволяет включать/отключать подключенные SSL-соединения, что не то же самое, что и StartTLS.

Из-за путаницы, я реализовал отдельный Connect() метод, который делает это более очевидным, что происходит:

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

попробовать.

+0

это работает .. @ cavej03 пожалуйста, примите это anwser – om471987

0

Вы можете установить опции "SecureSocketOptions.Auto" что-то вроде этого

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

MailKit автоматически решит использовать SSL или TLS.

+0

Что он использует, чтобы решить? Номер порта? –

+0

Номер порта, который вы должны установить в своей модели. Это просто номер порта из почты Google или что-то еще. Поэтому я просто позвоню своей модели и попрошу порт и хост из моего БД ... Но здесь важно «SecureSocketOptions.Auto» – error505

+0

@PaulKnopf Да, MailKit использует порт для принятия решения. Это не лучшая система в мире, но она работает в 99% случаев. – jstedfast

Смежные вопросы