Das Message-Objekt musst Du vorher auch erzeugen. Ausserdem solltest Dir das Ergebnis von Checkmessages in einer Variablen speichern - sonst hat der Schleifenindex jedesmal einen anderen Wert, da Du ja die Mails mit Delete löschst:
Delphi-Quellcode:
MessageCount := idpop31.CheckMessages;
for i := 1 to MessageCount do
begin
IdMessage1 := TIdMessage.Create(NIL);
IdPop31.Retrieveheader(i,IdMessage1);
...
idpop31.Delete(i);
IdMessage1.Free;
end;