3
votes

Can anyone diagnose my failure to connect to smtp.office365.com using Delphi 2010 and Indy 10.5.5?

I have read the code examples provided by Indy expert Remy Lebeau in this question: Using INDY 10 SMTP with Office365.

I have taken each of the two alternate code samples (one using AuthType satDefault and the other satSASL) from that question and cut-and-pasted them into a console application. In each case get the following error when run:

EIdOSSLUnderlyingCryptoError: Error connecting with SSL.
Error connecting with SSL.
error:1408F10B:SSL routines:SSL3_GET_RECORD:wrong version number

When I change UseTLS to utUseExplicitTLS (as suggested in some other answers that state a plain text connection is required before attempting TLS) I get the following error:

EIdOSSLConnectError: Error connecting with SSL.
Error connecting with SSL.
EOF was observed that violates the protocol

I notice some references in other answers to setting SSLOptions.SSLVersions instead of SSLOptions.Method (which is said to be deprecated) but that property does not appear to exist on TIdSSLIOHandlerSocketOpenSSL in my version of Indy.

I believe I have the version of Indy which shipped with the D2010 updates but that it's somewhat out-of-date. I would be willing to update a newer version if one exists but can't seem to find anyway to do so without installing SVN, learning it, checking out from Development, and recompiling.

Finally, I've tried running all four variants of my console application with no DLLs present in the executable directory and with the DLLs from OpenSSL v1.0.2h present without any apparent effect.

EDIT: One other piece of information. The SMTP credentials supplied by the client (this project sends emails through a single dedicated outbound email address) is of the form [email protected], rather than @office365.

1
Do you still use SSLv3? Try to switch to TLS 1.0 - smooty86
Yes, my code uses SSLv3 but how can I make that switch without access to SSLVersions property? - Larry Lustig
Looking further, I see the constant sslvTLSv1 can be assigned to the Method property. I still get the wrong version number message (referring to SSL3_GET_RECORD) just as before. - Larry Lustig
But! Combing sslvTLSv1 with utUseExplicitTLS appears to work. Testing further. - Larry Lustig
@LarryLustig: yes, that is what you need to do. - Remy Lebeau

1 Answers

2
votes

Apparently, since Remy wrote the answer in the linked question, Office365 has stopped supporting SSLv3 (presumably to avoid a known exploit) and now requires TLS. The code from his answer in the original question works if you change these two lines:

idSMTP1.UseTLS := utUseImplicitTLS;
TIdSSLIOHandlerSocketOpenSSL(idSMTP1.IOHandler).SSLOptions.Method := sslvSSLv3;

to:

idSMTP1.UseTLS := utUseExplicitTLS;
TIdSSLIOHandlerSocketOpenSSL(idSMTP1.IOHandler).SSLOptions.Method := sslvTLSv1;