2012-11-28 16 views

cevap

4

SearchMailBox yöntemini arıyorsunuz. IMAP istemcisini (bu durumda, TIdIMAP4 türünün IMAPClient değişkeni) zaten Gmail sunucusuna bağlı olduğunuzu beklemenizi bekleyen basit bir örnek. Bunun nasıl yapılacağını arayanlar için, this post ve numaralı telefonlardan numaralı telefona numaralı telefon kodunu IMAPClient.Connect ve IMAPClient.Disconnect no'lu telefon numaralarının no'lu numaralarına ekleyin.

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; 

İşte IMF-8 karakter kümesinin IMAP aramasının hızlı uygulaması.

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; 

Ve kullanım:

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

bu dönüş HTML veya saf metni mu dolayı korunan ParseSearchResult yönteme araya konulmuş sınıfını kullanır? Çünkü e-postalarda saf metin olan bir şey ararsanız Tamam çalışır. HTML iseniz, arama çalışmaz. –

+0

['SEARCH'] (http://tools.ietf.org/html/rfc1730#section-6.4.4) komutunun hedef IMAP sunucusu uygulamasına bağlıdır, ancak bu durumda metin iletisinde arama yapmaz. maalesef parçalar. Bahsetmek için iyi bir nokta. – TLama

+0

Sanırım gmail ayarlarında saf html veya metin döndürmek için bir yol olabilir. –