问题
I'm not familar with the INDY SMTP component. I want to send a mail with INDY and Office 365. Here is a nice topic which helped me a lot: What do the SMTP Indy component security and authentication properties do? But I did not figured out how to use SASL. Office365 adress is smtp.office365.com with port 587 and TLS. So I added an SMTP and an OpenSSL-IOHandler to my form and setted the properties. But I didn't work, the app is just freezing. I need to know how to use SASL with Office365.
Thanks.
回答1:
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 tosatDefault
, which uses the SMTPAUTH 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 tosatSASL
and usingTIdSASLLogin
, which uses the same SMTPAUTH 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;
来源:https://stackoverflow.com/questions/17734414/using-indy-10-smtp-with-office365