#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-соединение и начать все сначала.