Delphi の IdImap4 で IDLE

Delphi の TIdImap4 で IDLE (メール受信を監視するコード)
ChatGPT や Gemini で間違ったコードばかり教えてくれるので、修正
procedure TForm1.Button1Click(Sender: TObject);
var
    Response: string;
begin
    if IdIMAP41.Connect() then begin
        try
            if IdIMAP41.SelectMailBox('INBOX') then begin
                IdIMAP41.IOHandler.WriteLn('TAG001 IDLE');

                Response := IdIMAP41.IOHandler.ReadLn;
                Memo1.Lines.Add('Server: ' + Response);
                if Pos('+', Response) <> 1 then begin
                    raise Exception.Create('IDLE not accepted: ' + Response);
                end;

                Memo1.Lines.Add('IDLE started... waiting for updates');
                try
                    while IdIMAP41.Connected do begin
                        Response := IdIMAP41.IOHandler.ReadLn;
                        Memo1.Lines.Add('Server: ' + Response);

                        if Pos('EXISTS', Response) > 0 then begin
                            Memo1.Lines.Add('New mail detected!');
                            Break;
                        end;
                    end;
                finally
                    IdIMAP41.IOHandler.WriteLn('TAG002 DONE');
                    Memo1.Lines.Add('IDLE stopped');
                end;
            end;
        finally
            IdIMAP41.Disconnect;
        end;
    end;
end;
  • WriteLn で直接コマンドを送る場合、コマンドの前にタグが必要です(タグは、どのコマンドに対するレスポンスかを判断するための任意の文字列です)
  • 実際に利用する場合はスレッドなどへ入れましょう




コメント