2012-11-28 10 views

Antwort

4

Sie suchen nach der SearchMailBox Methode. Hier ein einfaches Beispiel, in dem Sie davon ausgehen, dass der IMAP-Client (in diesem Fall die IMAPClient-Variable vom Typ TIdIMAP4) bereits mit dem Google Mail-Server verbunden ist. Für diejenigen, die danach suchen, schauen Sie zum Beispiel unter this post und setzen Sie diesen Code innerhalb der try..finally Block in der Nähe von IMAPClient.Connect und IMAPClient.Disconnect.

var 
    // in this example is not shown how to connect to Gmail IMAP server but 
    // it's expected that the IMAPClient object is already connected there 
    IMAPClient: TIdIMAP4; 

procedure TForm1.Button1Click(Sender: TObject); 
var 
    I: Integer; 
    MsgObject: TIdMessage; 
    SearchInfo: array of TIdIMAP4SearchRec; 
begin 
    // if the mailbox selection succeed, then... 
    if IMAPClient.SelectMailBox('INBOX') then 
    begin 
    // set length of the search criteria to 1 
    SetLength(SearchInfo, 1); 
    // the SearchKey set to skBody means to search only in message body texts 
    // for more options and explanation, see comments at the TIdIMAP4SearchKey 
    // enumeration in the IdIMAP4.pas unit 
    SearchInfo[0].SearchKey := skBody; 
    // term you want to search 
    SearchInfo[0].Text := 'Search term'; 

    // if the search in the selected mailbox succeed, then... 
    if IMAPClient.SearchMailBox(SearchInfo) then 
    begin 
     // iterate the search results 
     for I := 0 to High(IMAPClient.MailBox.SearchResult) do 
     begin 
     // make an instance of the message object 
     MsgObject := TIdMessage.Create(nil); 
     try 
      // try to retrieve currently iterated message from search results 
      // and if this succeed you can work with the MsgObject 
      if IMAPClient.Retrieve(IMAPClient.MailBox.SearchResult[I], 
      MsgObject) then 
      begin 
      // here you have retrieved message in the MsgObject variable, so 
      // let's do what what you need with the >> MsgObject << 
      end; 
     finally 
      MsgObject.Free; 
     end; 
     end; 
    end; 
    end; 
end; 

Hier ist die schnelle Implementierung der IMAP-Suche nach UTF-8-Zeichensatz. Es nutzt zwischengeschaltetes Klasse aufgrund geschützt ParseSearchResult Methode:

type 
    TBasicSearchKey = (bskBcc, bskBody, bskCc, bskFrom, bskHeader, bskKeyword, 
    bskSubject, bskText, bskTo); 
const 
    IMAPSearchKeys: array [TBasicSearchKey] of string = ('BCC', 'BODY', 'CC', 
    'FROM', 'HEADER', 'KEYWORD', 'SUBJECT', 'TEXT', 'TO'); 
type 
    TIdIMAP4 = class(IdIMAP4.TIdIMAP4) 
    public 
    function SearchMailBoxUTF8(const ASearchText: string; 
     ASearchKey: TBasicSearchKey): Boolean; 
    end; 

implementation 

{ TIdIMAP4 } 

function TIdIMAP4.SearchMailBoxUTF8(const ASearchText: string; 
    ASearchKey: TBasicSearchKey): Boolean; 
var 
    SearchText: RawByteString; 
begin 
    Result := False; 
    CheckConnectionState(csSelected); 

    SearchText := UTF8Encode(ASearchText); 
    SendCmd(Format('SEARCH CHARSET UTF-8 %s {%d}', [IMAPSearchKeys[ASearchKey], 
    Length(SearchText)]), ['SEARCH']); 
    if LastCmdResult.Code = IMAP_CONT then 
    IOHandler.WriteLn(SearchText, TEncoding.UTF8); 

    if GetInternalResponse(LastCmdCounter, ['SEARCH'], False) = IMAP_OK then 
    begin 
    ParseSearchResult(FMailBox, LastCmdResult.Text); 
    Result := True; 
    end; 
end; 

Und die Nutzung:

procedure TForm1.Button1Click(Sender: TObject); 
var 
    I: Integer; 
    MsgObject: TIdMessage; 
begin 
    if IMAPClient.SelectMailBox('INBOX') and 
    IMAPClient.SearchMailBoxUTF8('Search term', bskText) then 
    begin 
    for I := 0 to High(IMAPClient.MailBox.SearchResult) do 
    begin 
     MsgObject := TIdMessage.Create(nil); 
     try 
     if IMAPClient.Retrieve(IMAPClient.MailBox.SearchResult[I], 
      MsgObject) then 
     begin 
      // here you have retrieved message in the MsgObject variable, so 
      // let's do what what you need with the >> MsgObject << 
     end; 
     finally 
     MsgObject.Free; 
     end; 
    end; 
    end; 
end; 
+0

Ist diese Rückkehr HTML oder reinen Text? Denn wenn Sie in E-Mails, die reiner Text sind, nach etwas suchen, funktioniert das OK. Wenn sie HTML sind, wird die Suche nicht funktionieren. –

+0

Es hängt von der IMAP-Zielimplementierung des Befehls ['SEARCH'] (http://tools.ietf.org/html/rfc1730#section-6.4.4) ab, aber in diesem Fall wird nicht in einer Textnachricht gesucht Teile leider. Guter Punkt zu erwähnen. – TLama

+0

Ich denke, es könnte eine Möglichkeit geben, um reinen HTML oder Text in Google Mail-Einstellungen zurückgeben. –