Delphi 2010:IMAP4 不使用 gmail 进行身份验证

问题描述 投票:0回答:1

我对 Indy 很陌生,所以如果这里有一些明显的问题,我深表歉意。

我正在尝试从 Gmail 收件箱中检索电子邮件,然后将它们保存到一组

TIdMessage
对象中。

我找不到任何详细说明如何设置它的文档,也找不到工作示例(Indy 文档已损坏),而且我处理电子邮件的知识基本上为零。

procedure TfrmEmail.LoadInbox;
var
  IMAP:TIdIMAP4;
  iLength,i:integer;
  SSL:TIdSSLIOHandlerSocketOpenSSL;
begin
  SSL:=TIdSSLIOHandlerSocketOpenSSL.Create(nil);
  //Set-Up SSL
  with SSL.SSLOptions do
  begin
    Method:=sslvTLSv1;
    Mode:=sslmClient;
    VerifyMode:=[];
    VerifyDepth:=0;
  end;

  IMAP:=TIdIMAP4.Create(Nil);
  //IMAP settings
  with IMAP do
  begin
    IOHandler:=SSL;
    Host:='imap.gmail.com';
    Port:=993;
    Username:={[email protected]};
    Password:={app password};
    UseTLS:=utUseImplicitTLS;
    Connect; //works up until here
    SelectMailBox('INBOX');//error here
  end;

  iLength:=IMAP.RetrieveMailBoxSize;
  ShowMessage(inttostr(iLength));
  SetLength(ArrInboxMessages,iLength);
  for i := 1 to iLength do
  begin
    IMAP.Retrieve(i,ArrInboxMessages[i]);
    end;
  end;
  IMAP.Disconnect;
  IMAP.Free;
end;

我的代码在

Connect
部分之前一直有效,但是一旦我尝试选择收件箱,我就会收到异常:
EIdConnectionStateError

我的连接状态未经身份验证,我认为这是因为我没有使用 SASL 身份验证。

另一个问题可能是我使用的是 TLSv1,但这适用于 SMTP,并且我无法在 Delphi 2010 上更新到最新版本。

如果有人能够识别问题并提供一个可行的示例/在哪里可以找到示例,那将非常有帮助。

delphi imap indy gmail-imap
1个回答
0
投票

使用应用程序密码并将

TIdIMAP4.AuthType
设置为
iatUserPass
(其默认设置)应该可以正常工作,您不需要使用 SASL+OAuth(尽管 GMail 更喜欢这样做)。

您展示的代码对我来说看起来不错。

TIdIMAP4.Connect()
有一个可选的
AAutoLogin
参数,默认为
True
,因此应在
TIdIMAP4.Login()
退出之前调用
Connect()
。如果
Login()
失败,您将收到不同的异常,并且无法首先到达
SelectMailBox()

话虽如此,您收到的

EIdConnectionStateError
异常意味着当您调用
TIdIMAP4.ConnectionState
时,
csAuthenticated
不是
csSelected
(或
SelectMailBox()
)。这应该是不可能的,除非
Login()
被绕过,即如果
AAutoLogin=False
。如果需要,您可以尝试在
Login()
之后和
Connect()
之前显式调用
SelectMailBox()
,例如:

Connect;
if ConnectionState <> csAuthenticated then Login;
SelectMailBox('INBOX');
© www.soinside.com 2019 - 2024. All rights reserved.