delphi 使用TidIMAP4组件检索电子邮件,需要切换到使用现代身份验证

g6ll5ycj  于 2022-11-04  发布在  其他
关注(0)|答案(1)|浏览(121)

我写了一个程序,可以监控邮箱,检索邮件,并将内容放入数据库。我的电子邮件管理员通知我,我的应用程序使用的是基本身份验证,微软将从2022年10月开始停止对它的支持。他们告诉我,我需要使用现代身份验证。Indy组件TidIMAP4支持吗?网站上指向文档的链接似乎全部断开:https://www.indyproject.org/documentation/
这是我当前的连接代码,使用的是iatUserPass的默认AuthType。这是我需要更改的吗?iatSASL是现代身份验证吗?我该如何使用它?仅仅切换属性不再能够连接。我可能必须更改其他属性才能使用它。

procedure TdmMAARCEmails.InitializeIMAPConnection;
begin
  IMAPClient := TIdIMAP4.Create(self);
  try
    // IMAPClient.AuthType := iatSASL;
    OpenSSLHandler := TIdSSLIOHandlerSocketOpenSSL.Create(self);
    OpenSSLHandler.sslOptions.SSLVersions := [sslvTLSv1, sslvTLSv1_1, sslvTLSv1_2];
    IMAPClient.IOHandler := OpenSSLHandler;

    //  IMAPClient.Host := 'imap.gmail.com';
    IMAPClient.Host := FIniFile.ReadString('EMAIL', 'IMAPI_SERVER', '');
    IMAPClient.Port := FIniFile.ReadInteger('EMAIL', 'IMAPI_PORT', 993);
    IMAPClient.UseTLS := utUseImplicitTLS;
    IMAPClient.Username :=  self.UserName;
    IMAPClient.Password := self.Password;
    IMAPClient.Connect;
  except
    on E:Exception do
      writeln(E.Message);
  end;
end;
vuv7lop3

vuv7lop31#

Indy组件TidIMAP 4是否支持该功能?
Indy目前不 * 正式 * 支持“现代身份验证”(也称为OAuth 2.0)(open ticket #192)。

  • 非官方 *,目前Indy的GitHub repo中有一个sasl-oauth branch正在开始添加此支持。如果您要尝试使用此分支,您将负责从Microsoft获取必要的OAuth访问令牌(参见Authenticate an IMAP, POP or SMTP connection using OAuth-“注册应用”和“获取访问令牌”部分),然后您可以将该令牌分配给TIdIMAP4组件以验证其IMAP连接(该文档的“验证连接请求”部分)。

或者,在this repo上有一个第三方的OAuth 2实现。它是为Gmail SMTP设计的,但也应该可以用于/适应IMAP。
网站上的文档链接似乎都被破坏了
已知问题:Links to old Indy website pages are currently broken
使用默认的iatUserPass身份验证类型。这是我需要更改的吗?
是的。iatUserPass使用IMAP LOGIN <username> <password>命令,这是不推荐使用的命令。iatSASL使用IMAP AUTHENTICATE <mechanism> <parameters>命令。根据上述文档,Microsoft需要AUTHENTICATE XOAUTH2 ...命令。
iatSASL是现代身份验证吗?如何使用它?
AuthType设置为iatSASL只是启用“现代身份验证”的第一步。然后,您需要使用对任何所需的TIdSASL派生组件的引用来填写TIdIMAP4.SASLMechanisms属性,这些组件将处理实际的身份验证。
Indy有几个TIdSASL...类用于各种身份验证(CRAM-MD5,CRAM-SHA1,NTLM,Digest等),但还没有用于OAuth 2的sasl-oauth branch添加了一些新的TIdSASL...类,包括TIdSASLXOAuth2,它将涵盖这种情况(other repo有一个TIdSASLXOAuth类用于相同的任务)。
或者,您可以编写自己的TIdSASL派生类来处理身份验证。例如,如果您只想将TIdSASLXOAuth2/TIdSASLXOAuth实现复制到本地代码中。
只是切换属性不再工作连接。
正确,因为您的身份验证设置不完整。请参阅上文。

相关问题