我不熟悉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。
感谢。
答案 0 :(得分:13)
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.ClassName, E.Message]));
raise;
end;
end;
finally
idSMTP1.Free;
end;
更新:Office365不再支持SSL v3,您必须立即使用TLS v1.x:
(idSMTP1.IOHandler).SSLOptions.Method := sslvTLSv1;