我对 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 上更新到最新版本。
如果有人能够识别问题并提供一个可行的示例/在哪里可以找到示例,那将非常有帮助。
使用应用程序密码并将
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');