PhysiologyWeb Logo  Search
PhysiologyWeb Loading...

Delphi Code - Search for Microsoft Outlook Emails with Attachments
Here is a simple Delphi procedure that searches for Microsoft Outlook emails within a defined date range, and further refines the search to only emails that have one or more attachments. A cautionary note is in order here. Many of the attachments are images and htm links that may not be considered true file attachments. Additional code is needed to extract the attached files. This simple code can be modified further to perform sophisticated Outlook email searches. The code works well whether or not Outlook is already open. However, please note that the code will not work if Outlook is closed, and your installed Outlook requires any form of authentication upon launching the program. The most relevant parts of the code are highlighted. Comments are included to explain the code. If you copy and paste the code into your program, be sure to change the form and procedure names to match your setup. For additional Outlook automation solutions, see Microsoft Outlook Automation with Delphi.
procedure TForm1.SearchForMicrosoftOutlookEmailsWithAttachments(Sender: TObject);
var
Count: Integer;
StartDate, EndDate: TDate;
OutlookFindString: String;
OutlookApplication, OutlookNameSpace, OutlookFolder, OutlookFolderEmailItems, OutlookMailItem: Variant;
begin
//be sure ComObj and Variants units are included in the "uses" clause

Count := 0;

StartDate := StrToDate('7/25/2022'); //start of date window
EndDate := StrToDate('7/31/2022'); //end date for search window
EndDate := EndDate + 1; //make the search inclusive for the specified window

OutlookFindString := '[ReceivedTime] >= "' + FormatDateTime('ddddd h:nn AMPM', StartDate) + '" and [ReceivedTime] < "' + FormatDateTime('ddddd h:nn AMPM', EndDate) + '"';

OutlookApplication := Null;
OutlookNameSpace := Null;
OutlookFolder := Null;
OutlookFolderEmailItems := Null;
OutlookMailItem := Null;

try
//create Outlook OLE
OutlookApplication := CreateOleObject('Outlook.Application');
except
OutlookApplication := Null;
//add error/exception handling code as desired
end;

If VarIsNull(OutlookApplication) = False then
begin
try
OutlookNameSpace := OutlookApplication.GetNameSpace('MAPI');
OutlookNameSpace.Logon('', '', False, True);
OutlookFolder := OutlookNameSpace.GetDefaultFolder(6); //6 is Inbox
OutlookFolderEmailItems := OutlookFolder.Items;

OutlookFolderEmailItems.Sort('[ReceivedTime]', False); //True = descending; False = ascending

try
OutlookMailItem := Null;
OutlookMailItem := OutlookFolderEmailItems.Find(OutlookFindString);
//reference
//https://docs.microsoft.com/en-us/office/vba/api/outlook.items.find
repeat
If (VarIsNull(OutlookMailItem) = False) and (VarIsEmpty(OutlookMailItem) = False) then
begin
//add code to handle emails as desired
//here we capture a summary of the emails found
//we will only look at those with one or more attachments
//be sure a Memo1 VCL object exists
If OutlookMailItem.Attachments.Count > 0 then
begin
Count := Count + 1;
Memo1.Lines.Add(IntToStr(Count) + ' | Sent: ' + DateTimeToStr(OutlookMailItem.ReceivedTime) + ' | From: ' + OutlookMailItem.SenderName);
end;
//refereces
//https://docs.microsoft.com/en-us/office/vba/api/outlook.mailitem
//https://docs.microsoft.com/en-us/office/vba/api/outlook.mailitem.attachments
end;
OutlookMailItem := Unassigned;
OutlookMailItem := OutlookFolderEmailItems.FindNext;
//reference
//https://docs.microsoft.com/en-us/office/vba/api/outlook.items.findnext
until (VarIsNull(OutlookMailItem) = True) or (VarIsEmpty(OutlookMailItem) = True);
except
//add error/exception handling code as desired
end;
finally
OutlookMailItem := Unassigned;
OutlookFolderEmailItems := Unassigned;
OutlookFolder := Unassigned;
OutlookNameSpace := Unassigned;
OutlookApplication := Unassigned;
end;
end;
end;






Posted: Saturday, July 30, 2022