将 INDY 10 SMTP 与 Office365 一起使用 [英] Using INDY 10 SMTP with Office365
问题描述
我不熟悉 INDY SMTP 组件.我想用 INDY 和 Office 365 发送邮件.这是一个很好的话题,对我有很大帮助:SMTP Indy 组件安全和身份验证属性有什么作用?但是我没有弄清楚如何使用SASL.Office365 地址是 smtp.office365.com,端口为 587 和 TLS.所以我在表单中添加了一个 SMTP 和一个 OpenSSL-IOHandler 并设置了属性.但我没有工作,应用程序只是冻结.我需要知道如何在 Office365 中使用 SASL.
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.
谢谢.
推荐答案
Office365 仅支持 TLS 端口 587 上的 LOGIN
SASL.
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):
将
TIdSMTP.AuthType
属性设置为satDefault
,它使用 SMTPAUTH LOGIN
命令:
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;
将 TIdSMTP.AuthType
属性设置为 satSASL
并使用 TIdSASLLogin
,它使用相同的 SMTP AUTH LOGIN
命令:
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;
更新:Office365 不再支持 SSL v3,您现在必须使用 TLS v1.x:
Update: Office365 no longer supports SSL v3, you must use TLS v1.x now:
(idSMTP1.IOHandler).SSLOptions.Method := sslvTLSv1;
这篇关于将 INDY 10 SMTP 与 Office365 一起使用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!