我不熟悉INDY SMTP组件.我想用INDY和Office 365发送邮件.这是一个很好的主题,它帮助了我很多:
What do the SMTP Indy component security and authentication properties do?
但我没想出如何使用SASL. Office365地址是smtp.office365.com,端口为587和TLS.所以我在表单中添加了一个SMTP和一个OpenSSL-IOHandler并设置了属性.但我没有工作,应用程序只是冻结.我需要知道如何在Office365中使用SASL.
但我没想出如何使用SASL. Office365地址是smtp.office365.com,端口为587和TLS.所以我在表单中添加了一个SMTP和一个OpenSSL-IOHandler并设置了属性.但我没有工作,应用程序只是冻结.我需要知道如何在Office365中使用SASL.
谢谢.
解决方法
Office365仅支持TLS端口587上的LOGIN SASL.
当我尝试它时,以下代码对我来说很好(所有这些设置也可以在设计时设置):
>将TIdSMTP.AuthType属性设置为satDefault,它使用SMTP AUTH LOGIN命令:
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;
>将TIdSMTP.AuthType属性设置为satSASL并使用TIdSAsllogin,它使用相同的SMTP AUTH LOGIN命令:
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.Message])); raise; end; end; finally idSMTP1.Free; end;
更新:Office365不再支持SSL v3,您必须立即使用TLS v1.x:
(idSMTP1.IOHandler).SSLOptions.Method := sslvTLSv1;