Что я должен отправить после СТАРТОВ?

#c #smtp #starttls

Вопрос:

Я использую smtp.gmail.com и порт 587. После успешного подключения я отправляю EHLO и получаю следующее:

 250-smtp.gmail.com at your service, [62.16.4.123]
250-SIZE 35882577
250-8BITMIME
250-STARTTLS
250-ENHANCEDSTATUSCODES
250-PIPELINING
250-CHUNKING
250 SMTPUTF
 

Я выбираю STARTTLS , и после этого я не знаю, что отправить на сервер, а также войти в систему и отправить электронное письмо.

Если я отправлю что-то вроде AUTH LOGIN или зашифрованный логин base64 с паролем, соединение будет разорвано.

Может ли кто-нибудь объяснить, что мой клиент должен отправить, чтобы успешно завершить STARTTLS переговоры?

Или мне следует начать все сначала с нового SSL-соединения?

Ответ №1:

После отправки (незашифрованной) STARTTLS команды, если сервер вернет какой-либо ответ , кроме 220 , обработайте его с ошибкой и при необходимости перейдите к другим командам SMTP (хотя на данный момент единственное, что действительно имеет смысл, — это QUIT ).

Если сервер вернется 220 STARTTLS , вам необходимо выполнить фактическое TLS-квитирование по существующему TCP-соединению, начиная с ПРИВЕТСТВИЯ КЛИЕНТА TLS. Какая бы библиотека TLS, которую вы используете в своем сокете, не могла бы справиться с этим за вас, не внедряйте это с нуля.

Если рукопожатие TLS успешно, вы можете отправлять дальнейшие команды SMTP (по каналу, зашифрованному TLS), начиная с нового EHLO (поскольку возможности сервера могут и, вероятно, изменятся, особенно доступные AUTH схемы), затем AUTH , MAIL FROM , RCPT TO , DATA / BDAT и т.д. и, наконец QUIT , по мере необходимости.

Если рукопожатие TLS завершается неудачно, TCP-соединение остается в неизвестном состоянии, поэтому дальнейшая связь по протоколу SMTP невозможна. Все, что вы можете сделать в этот момент, — это закрыть TCP-соединение и начать все сначала.