Office 365 скоро потребует TLS 1.2 , но ваш код заставляет Indy вместо этого использовать TLS 1.0. Официально Office 365 больше не поддерживает TLS 1.0 или 1.1, но на данный момент он все еще принимает сессии 1.0 / 1.1, но это изменится в ближайшие месяцы.
Так что, по крайней мере, вам нужно измените это:
TIdSSLIOHandlerSocketOpenSSL(idSMTP1.IOHandler).SSLOptions.Method := sslvTLSv1;
На это:
TIdSSLIOHandlerSocketOpenSSL(idSMTP1.IOHandler).SSLOptions.Method := sslvTLSv1_2;
Или лучше, на это:
TIdSSLIOHandlerSocketOpenSSL(idSMTP1.IOHandler).SSLOptions.SSLVersions := [sslvTLSv1, sslvTLSv1_1, sslvTLSv1_2];
При этом, используя TIdSASLLogin
в качестве единственного Механизм SASL точно такой же, как при использовании TIdSMTP.AuthType=satDefault
. Они оба отправляют одну и ту же команду AUTH LOGIN
на сервер. И эта команда - то, что терпит неудачу. Но невозможно точно знать, почему это происходит. «Аутентификация неудачна» - слишком общее c сообщение об ошибке, и есть много причин, почему эта ошибка возникает в Office 365. Возможно, вы используете неправильное имя пользователя / пароль. Возможно, IP-адрес, разрешенный по имени хоста, отправляемого TIdSMTP
в его команде EHLO
1 , не занесен в белый список на сервере. Кто знает.
1: попробуйте задать для свойства TIdSMTP.HeloName
полное доменное имя для своего клиентского компьютера, которое можно получить из GetComputerNameEx()
.