Wie kann ich eine bestimmte E-Mail abrufen, die auf einem bestimmten Text in der Nachricht basiert? Zum Beispiel, wie die Google Mail-Suche funktioniert. Wenn Sie nach einem bestimmten Text suchen, der sich in der E-Mail befindet, ruft Google Mail die Nachricht ab, die mit dem Text verknüpft ist. Vorzugsweise ohne Schleifen.Wie wird nach einer bestimmten E-Mail-Nachricht im IMAP-Postfach gesucht?
5
A
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;
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. –
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
Ich denke, es könnte eine Möglichkeit geben, um reinen HTML oder Text in Google Mail-Einstellungen zurückgeben. –