如何在IMAP邮箱中搜索特定的电子邮件?

时间:2012-11-28 19:33:20

标签: delphi delphi-xe2 imap

如何根据邮件中包含的某些文字检索特定的电子邮件?例如Gmail搜索的工作原理。如果您搜索电子邮件中的特定文本,则Gmail将检索与该文本关联的邮件。最好没有任何循环。

1 个答案:

答案 0 :(得分:4)

您正在寻找SearchMailBox方法。这是一个简单的示例,期望您已经连接到Gmail服务器的IMAP客户端(在这种情况下,TIdIMAP4类型的IMAPClient变量)。对于那些希望如何操作的人,请查看this post此代码放在try..finally IMAPClient.Connect附近的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; 。 }。

ParseSearchResult

以下是针对UTF-8字符集的IMAP搜索的快速实现。由于受保护的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; 方法,它使用插入的类:

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;

用法:

{{1}}