Office365 only supports the LOGIN
SASL on TLS port 587.
The following code works fine for me when I just tried it (all of these settings can also be set up at design-time as well):
setting the TIdSMTP.AuthType
property to satDefault
, which uses the SMTP AUTH LOGIN
command:
var
idSMTP1: TIdSMTP;
begin
idSMTP1 := TIdSMTP.Create(nil);
try
idSMTP1.IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(idSMTP1);
idSMTP1.UseTLS := utUseExplicitTLS;
TIdSSLIOHandlerSocketOpenSSL(idSMTP1.IOHandler).SSLOptions.Method := sslvSSLv3;
idSMTP1.Host := 'smtp.office365.com';
idSMTP1.Port := 587;
idSMTP1.AuthType := satDefault;
idSMTP1.Username := ...;
idSMTP1.Password := ...;
try
idSMTP1.Connect;
try
idSMTP1.Authenticate;
finally
idSMTP1.Disconnect;
end;
ShowMessage('OK');
except
on E: Exception do
begin
ShowMessage(Format('Failed!'#13'[%s] %s', [E.ClassName, E.Message]));
raise;
end;
end;
finally
idSMTP1.Free;
end;
setting the TIdSMTP.AuthType
property to satSASL
and using TIdSASLLogin
, which uses the same SMTP AUTH LOGIN
command:
var
idSMTP1: TIdSMTP;
idSASLLogin: TIdSASLLogin;
idUserPassProvider: TIdUserPassProvider;
begin
idSMTP1 := TIdSMTP.Create(nil);
try
idSMTP1.IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(idSMTP1);
idSMTP1.UseTLS := utUseExplicitTLS;
TIdSSLIOHandlerSocketOpenSSL(idSMTP1.IOHandler).SSLOptions.Method := sslvSSLv3;
idSMTP1.Host := 'smtp.office365.com';
idSMTP1.Port := 587;
idSASLLogin := TIdSASLLogin.Create(idSMTP1);
idUserPassProvider := TIdUserPassProvider.Create(idSASLLogin);
idSASLLogin.UserPassProvider := idUserPassProvider;
idUserPassProvider.Username := ...;
idUserPassProvider.Password := ...;
idSMTP1.AuthType := satSASL;
idSMTP1.SASLMechanisms.Add.SASL := idSASLLogin;
try
idSMTP1.Connect;
try
idSMTP1.Authenticate;
finally
idSMTP1.Disconnect;
end;
ShowMessage('OK');
except
on E: Exception do
begin
ShowMessage(Format('Failed!'#13'[%s] %s', [E.ClassName, E.Message]));
raise;
end;
end;
finally
idSMTP1.Free;
end;
Update: Office365 no longer supports SSL v3, you must use TLS v1.x now:
(idSMTP1.IOHandler).SSLOptions.Method := sslvTLSv1;
TIdSMTP
. So there is no way to diagnose your problem. – MilkmanTIdSMTP
decide for you which SASL to use based on Office365's actual capabilities it reports whenTIdSMTP
connects to it (you must haveTIdSMTP.UseEHLO
set to True for that to work). – MilkmanTIdSMTP
andTLS=utUseExplicitTLS
on port 587, it connects just fine without freezing, and the only SASL that it reports support for isLOGIN
(LOGIN
is not secure, but the use of TLS makes up for that). There is a momentary freeze while it tries to validate my credentials, but then it unfreezes and throws an authentication error, as expected (since I don't have an Office365 account). – MilkmanLOGIN
SASL withTIdSMTP
: 1) setTIdSMTP.AuthType=satDefault
and useTIdSMTP.Username
andTIdSMTP.Password
, 2) setTIdSMTP.AuthType=satSASL
, attachTIdSASLLogin
to theTIdSMTP.SASLMechanisms
collection, and attach aTIdUserPassProvider
toTIdSASLLogin
. – Milkman