MS Exchange API
MS Exchange API
MS Exchange API via CDO (Collaboration Data Objects)
CDO (Collaboration Data Objects) Base Library.
( Talking to MS-Exchange server.) This is a vast subject that is beyond the scope of this article to detail all here. This library provides the basic building blocks for someone who wants to develop using CDO. There are many references on the Net, but your best source is the CDO.HLP file that ships on the Exchange CD or site http://www.cdolive.com/start.htmhttp://www.cdolive.com/start.htm. The cdolive.com site is an excellent reference site which discusses all aspects including installation, versions and also downloads. (CDO.HLP is downloadable from here)
My basic class provides the following functionality ..
Utility functions and methods
function CdoNothing(Obj : OleVariant) : boolean;
function CdoDefaultProfile : string;
function VarNothing : IDispatch;
procedure CdoDisposeList(WorkList : TList);
procedure CdoDisposeObjects(WorkStrings : TStrings);
procedure CdoDisposeNodes(WorkData : TTreeNodes);
Create constructors that allow Default profile logon,Specific profile logon and an Impersonated user logon with profile. (This is required for successful logon in Windows Service Applications)
constructor Create; overload;
constructor Create(const Profile : string); overload;
constructor Create(const Profile : string;
const UserName : string;
const Domain : string;
const Password : string); overload;
Methods for loading stringlists, treeviews etc. and Object iteration.
function LoadAddressList(StringList : TStrings) : boolean;
function LoadObjectList(const FolderOle : OleVariant;
List : TList) : boolean;
function LoadEMailTree(TV : TTreeView;
Expand1stLevel : boolean = false;
SubjectMask : string = '') : boolean;
function LoadContactList(const FolderOle : OleVariant;
Items : TStrings) : boolean; overload;
function LoadContactList(const FolderName : string;
Items : TStrings) : boolean; overload;
procedure ShowContactDetails(Contact : OleVariant);
The above load various lists into stringlists,lists or treeviews. Freeing of lists,object constructs within these data structures are freed at each successive call to the load, however the final Deallocation is the responsibility of the developer, You can do this yourself or use the utility functions CdoDisposeXXX(). See code documentation for further understanding.
function First(const FolderOle : OleVariant;
out ItemOle : OleVariant) : boolean;
function Last(const FolderOle : OleVariant;
out ItemOle : OleVariant) : boolean;
function Next(const FolderOle : OleVariant;
out ItemOle : OleVariant) : boolean;
function Prior(const FolderOle : OleVariant;
out ItemOle : OleVariant) : boolean;
function AsString(const ItemOle : Olevariant;
const FieldIdConstant : DWORD) : string;
The above provide iterations thru object such as Inbox,Contacts etc. The AsString returns a fields value from the object such as Email Address,Name,Company Name etc. (There are miriads of these defined in the CONST section "Field Tags").
Properties
property CurrentUser : OleVariant read FCurrentUser;
property Connected : boolean read FConnected;
property LastErrorMess : string read FlastError;
property LastErrorCode : DWORD read FlastErrorCode;
property InBox : OleVariant read FOleInBox;
property OutBox : OleVariant read FOleOutBox;
property DeletedItems : Olevariant read FOleDeletedItems;
property SentItems : Olevariant read FOleSentItems;
property GlobalAddressList : Olevariant read FOleGlobalAddressList;
property Contacts : Olevariant read FOleContacts;
property Session : OleVariant read FOleSession;
property Version : string read GetFVersion;
property MyName : string read FMyName;
property MyEMailAddress : string read FMyEMailAddress;
The Create constructor sets up the predefined objects InBox, OutBox, DeletedItems, SentItems, GlobalAddressList, Session and Contacts. The other properties are self explanatary.
As I mentioned earlier the functionality of CDO is vast as objects such as InBox have many methods and properties that included Updating,Inserting Deleting etc. The CDO.HLP file will help to expose these for you. My class is the base of CDO to help simplify building applications and is probably best demonstrated by code snippet examples. Believe me a whole book could be written on this subject, but it is well worth studying as a faster alternative to using MS Outlook API.
uses Cdo_Lib;
var
Cdo: TcdoSession;
MailItem: OleVariant;
// Iterate thru Emails in InBox
begin
Cdo := TCdoSession.Create;
if Cdo.Active then
begin
Cdo.First(Cdo.InBox, MailItem);
while true do
begin
if not Cdo.Nothing(MailItem) then
begin
Subject := MailItem.Subject;
EMailAddress := Cdo.AsString(MailItem.Sender, CdoPR_EMAIL_AT_ADDRESS);
EMailName := MailItem.Sender.Name;
BodyText := MailItem.Text;
// Do something with data and delete the EMail
MailItem.Delete;
// Get the next Email
end;
MailItem := Cdo.Next(Cdo.Inbox.MailItem);
end;
end;
Cdo.Free;
end;
// Example of loading emails into a treeview and displaying on treeview click
unit UBrowse;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ComCtrls, ToolWin, Menus, ExtCtrls, StdCtrls, Buttons, ImgList,
CDO_Lib;
type
TFBrowse = class(TForm)
Panel1: TPanel;
Panel3: TPanel;
Label1: TLabel;
Label2: TLabel;
lbFrom: TLabel;
lbDate: TLabel;
Memo1: TMemo;
Panel2: TPanel;
OKBtn: TBitBtn;
tvCalls: TTreeView;
ImageList1: TImageList;
StatusBar1: TStatusBar;
procedure FormShow(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure tvCallsClick(Sender: TObject);
procedure btnPrintClick(Sender: TObject);
private
{ Private declarations }
Doc: OleVariant;
Cdo: TCdoMapiSession;
public
{ Public declarations }
end;
var
FBrowse: TFBrowse;
implementation
{$R *.DFM}
procedure TFBrowse.FormShow(Sender: TObject);
var
TN: TTreeNode;
begin
Screen.Cursor := crHourGlass;
Application.ProcessMessages;
Cdo := TCdoMapiSession.Create;
Cdo.LoadEMailTree(tvCalls, true, '*Support ---*');
tvCalls.SortType := stText;
TN := tvCalls.Items[0];
TN.Expand(false);
tvCalls.SetFocus;
Screen.Cursor := crDefault;
end;
procedure TFBrowse.FormClose(Sender: TObject; var Action: TCloseAction);
begin
CdoDisposeNodes(TvCalls.Items);
Cdo.Free;
end;
procedure TFBrowse.tvCallsClick(Sender: TObject);
var
TN: TTreeNode;
begin
TN := tvCalls.Selected;
Memo1.Clear;
lbFrom.Caption := '';
lbDate.Caption := '';
if TN.Data <> nil then
begin
Doc := TOleVarPtr(TN.Data)^;
btnPrint.Enabled := true;
Memo1.Text := Doc.Text;
lbFrom.Caption := Doc.Sender.Name;
lbDate.Caption := FormatDateTime('dd/mm/yyyy hh:nn', Doc.TimeSent);
end;
end;
end.
unit CDO_Lib;
// =============================================================================
// CDO and MAPI Library (See CDO.HLP)
//
// The object model for the CDO Library is hierarchical. The following table
// shows the containment hierarchy. Each indented object is a child of the
// object under which it is indented. An object is the parent of every object
// at the next level of indentation under it. For example, an Attachments
// collection and a Recipients collection are both child objects of a
// Message object, and a Messages collection is a parent object of a
// Message object. However, a Messages collection is not a parent object of a
// Recipients collection.
//
// Session
// AddressLists collection
// AddressList
// Fields collection
// Field
// AddressEntries collection
// AddressEntry
// Fields collection
// Field
// AddressEntryFilter
// Fields collection
// Field
// Folder (Inbox or Outbox)
// Fields collection
// Field
// Folders collection
// Folder
// Fields collection
// Field
// [ Folders ... Folder ... ]
// Messages collection
// AppointmentItem
// RecurrencePattern
// GroupHeader
// MeetingItem
// Message
// Attachments collection
// Attachment
// Fields collection
// Field
// Fields collection
// Field
// Recipients collection
// Recipient
// AddressEntry
// Fields collection
// Field
// MessageFilter
// Fields collection
// Field
// InfoStores collection
// InfoStore
// Fields collection
// Field
// Folder [as expanded under Folders]
//
// The notation "[ Folders ... Folder ... ]" signifies that any Folder object
// can contain a Folders collection of subfolders, and each subfolder can
// contain a Folders collection of more subfolders, nested to an
// arbitrary level.
// =============================================================================
interface
uses Forms, Windows, SysUtils, Classes, Registry, ComObj, Variants, ComCtrls,
Controls, Masks;
const
// MAPI Property Tags
// Field Tags
CdoPR_7BIT_DISPLAY_NAME = $39FF001E;
CdoPR_AB_DEFAULT_DIR = $3D060102;
CdoPR_AB_DEFAULT_PAB = $3D070102;
CdoPR_AB_PROVIDER_ID = $36150102;
CdoPR_AB_PROVIDERS = $3D010102;
CdoPR_AB_SEARCH_PATH = $3D051102;
CdoPR_AB_SEARCH_PATH_UPDATE = $3D110102;
CdoPR_ACCESS = $0FF40003;
CdoPR_ACCESS_LEVEL = $0FF70003;
CdoPR_ACCOUNT = $3A00001E;
CdoPR_ACKNOWLEDGEMENT_MODE = $00010003;
CdoPR_ADDRTYPE = $3002001E;
CdoPR_ALTERNATE_RECIPIENT = $3A010102;
CdoPR_ALTERNATE_RECIPIENT_ALLOWED = $0002000B;
CdoPR_ANR = $360C001E;
CdoPR_ASSISTANT = $3A30001E;
CdoPR_ASSISTANT_TELEPHONE_NUMBER = $3A2E001E;
CdoPR_ASSOC_CONTENT_COUNT = $36170003;
CdoPR_ATTACH_ADDITIONAL_INFO = $370F0102;
CdoPR_ATTACH_DATA_BIN = $37010102;
CdoPR_ATTACH_DATA_OBJ = $3701000D;
CdoPR_ATTACH_ENCODING = $37020102;
CdoPR_ATTACH_EXTENSION = $3703001E;
CdoPR_ATTACH_FILENAME = $3704001E;
CdoPR_ATTACH_LONG_FILENAME = $3707001E;
CdoPR_ATTACH_LONG_PATHNAME = $370D001E;
CdoPR_ATTACH_METHOD = $37050003;
CdoPR_ATTACH_MIME_TAG = $370E001E;
CdoPR_ATTACH_NUM = $0E210003;
CdoPR_ATTACH_PATHNAME = $3708001E;
CdoPR_ATTACH_RENDERING = $37090102;
CdoPR_ATTACH_SIZE = $0E200003;
CdoPR_ATTACH_TAG = $370A0102;
CdoPR_ATTACH_TRANSPORT_NAME = $370C001E;
CdoPR_ATTACHMENT_X400_PARAMETERS = $37000102;
CdoPR_AUTHORIZING_USERS = $00030102;
CdoPR_AUTO_FORWARD_COMMENT = $0004001E;
CdoPR_AUTO_FORWARDED = $0005000B;
CdoPR_BEEPER_TELEPHONE_NUMBER = $3A21001E;
CdoPR_BIRTHDAY = $3A420040;
CdoPR_BODY = $1000001E;
CdoPR_BODY_CRC = $0E1C0003;
CdoPR_BUSINESS_ADDRESS_CITY = $3A27001E;
CdoPR_BUSINESS_ADDRESS_COUNTRY = $3A26001E;
CdoPR_BUSINESS_ADDRESS_POST_OFFICE_BOX = $3A2B001E;
CdoPR_BUSINESS_ADDRESS_POSTAL_CODE = $3A2A001E;
CdoPR_BUSINESS_ADDRESS_STATE_OR_PROVINCE = $3A28001E;
CdoPR_BUSINESS_ADDRESS_STREET = $3A29001E;
CdoPR_BUSINESS_FAX_NUMBER = $3A24001E;
CdoPR_BUSINESS_HOME_PAGE = $3A51001E;
CdoPR_BUSINESS_TELEPHONE_NUMBER = $3A08001E;
CdoPR_BUSINESS2_TELEPHONE_NUMBER = $3A1B001E;
CdoPR_CALLBACK_TELEPHONE_NUMBER = $3A02001E;
CdoPR_CAR_TELEPHONE_NUMBER = $3A1E001E;
CdoPR_CELLULAR_TELEPHONE_NUMBER = $3A1C001E;
CdoPR_CHILDRENS_NAMES = $3A58101E;
CdoPR_CLIENT_SUBMIT_TIME = $00390040;
CdoPR_COMMENT = $3004001E;
CdoPR_COMMON_VIEWS_ENTRYID = $35E60102;
CdoPR_COMPANY_MAIN_PHONE_NUMBER = $3A57001E;
CdoPR_COMPANY_NAME = $3A16001E;
CdoPR_COMPUTER_NETWORK_NAME = $3A49001E;
CdoPR_CONTACT_ADDRTYPES = $3A54101E;
CdoPR_CONTACT_DEFAULT_ADDRESS_INDEX = $3A550003;
CdoPR_CONTACT_EMAIL_ADDRESSES = $3A56101E;
CdoPR_CONTACT_ENTRYIDS = $3A531102;
CdoPR_CONTACT_VERSION = $3A520048;
CdoPR_CONTAINER_CLASS = $3613001E;
CdoPR_CONTAINER_CONTENTS = $360F000D;
CdoPR_CONTAINER_FLAGS = $36000003;
CdoPR_CONTAINER_HIERARCHY = $360E000D;
CdoPR_CONTAINER_MODIFY_VERSION = $36140014;
CdoPR_CONTENT_CONFIDENTIALITY_ALGORITHM_ID = $00060102;
CdoPR_CONTENT_CORRELATOR = $00070102;
CdoPR_CONTENT_COUNT = $36020003;
CdoPR_CONTENT_IDENTIFIER = $0008001E;
CdoPR_CONTENT_INTEGRITY_CHECK = $0C000102;
CdoPR_CONTENT_LENGTH = $00090003;
CdoPR_CONTENT_RETURN_REQUESTED = $000A000B;
CdoPR_CONTENT_UNREAD = $36030003;
CdoPR_CONTENTS_SORT_ORDER = $360D1003;
CdoPR_CONTROL_FLAGS = $3F000003;
CdoPR_CONTROL_ID = $3F070102;
CdoPR_CONTROL_STRUCTURE = $3F010102;
CdoPR_CONTROL_TYPE = $3F020003;
CdoPR_CONVERSATION_INDEX = $00710102;
CdoPR_CONVERSATION_KEY = $000B0102;
CdoPR_CONVERSATION_TOPIC = $0070001E;
CdoPR_CONVERSION_EITS = $000C0102;
CdoPR_CONVERSION_PROHIBITED = $3A03000B;
CdoPR_CONVERSION_WITH_LOSS_PROHIBITED = $000D000B;
CdoPR_CONVERTED_EITS = $000E0102;
CdoPR_CORRELATE = $0E0C000B;
CdoPR_CORRELATE_MTSID = $0E0D0102;
CdoPR_COUNTRY = $3A26001E;
CdoPR_CREATE_TEMPLATES = $3604000D;
CdoPR_CREATION_TIME = $30070040;
CdoPR_CREATION_VERSION = $0E190014;
CdoPR_CURRENT_VERSION = $0E000014;
CdoPR_CUSTOMER_ID = $3A4A001E;
CdoPR_DEF_CREATE_DL = $36110102;
CdoPR_DEF_CREATE_MAILUSER = $36120102;
CdoPR_DEFAULT_PROFILE = $3D04000B;
CdoPR_DEFAULT_STORE = $3400000B;
CdoPR_DEFAULT_VIEW_ENTRYID = $36160102;
CdoPR_DEFERRED_DELIVERY_TIME = $000F0040;
CdoPR_DELEGATION = $007E0102;
CdoPR_DELETE_AFTER_SUBMIT = $0E01000B;
CdoPR_DELIVER_TIME = $00100040;
CdoPR_DELIVERY_POINT = $0C070003;
CdoPR_DELTAX = $3F030003;
CdoPR_DELTAY = $3F040003;
CdoPR_DEPARTMENT_NAME = $3A18001E;
CdoPR_DEPTH = $30050003;
CdoPR_DETAILS_TABLE = $3605000D;
CdoPR_DISC_VAL = $004A000B;
CdoPR_DISCARD_REASON = $00110003;
CdoPR_DISCLOSE_RECIPIENTS = $3A04000B;
CdoPR_DISCLOSURE_OF_RECIPIENTS = $0012000B;
CdoPR_DISCRETE_VALUES = $0E0E000B;
CdoPR_DISPLAY_BCC = $0E02001E;
CdoPR_DISPLAY_CC = $0E03001E;
CdoPR_DISPLAY_NAME = $3001001E;
CdoPR_DISPLAY_NAME_PREFIX = $3A45001E;
CdoPR_DISPLAY_TO = $0E04001E;
CdoPR_DISPLAY_TYPE = $39000003;
CdoPR_DL_EXPANSION_HISTORY = $00130102;
CdoPR_DL_EXPANSION_PROHIBITED = $0014000B;
CdoPR_EMAIL_ADDRESS = $3003001E;
CdoPR_EMAIL_AT_ADDRESS = $39FE001E;
CdoPR_END_DATE = $00610040;
CdoPR_ENTRYID = $0FFF0102;
CdoPR_EXPIRY_TIME = $00150040;
CdoPR_EXPLICIT_CONVERSION = $0C010003;
CdoPR_FILTERING_HOOKS = $3D080102;
CdoPR_FINDER_ENTRYID = $35E70102;
CdoPR_FOLDER_ASSOCIATED_CONTENTS = $3610000D;
CdoPR_FOLDER_TYPE = $36010003;
CdoPR_FORM_CATEGORY = $3304001E;
CdoPR_FORM_CATEGORY_SUB = $3305001E;
CdoPR_FORM_CLSID = $33020048;
CdoPR_FORM_CONTACT_NAME = $3303001E;
CdoPR_FORM_DESIGNER_GUID = $33090048;
CdoPR_FORM_DESIGNER_NAME = $3308001E;
CdoPR_FORM_HIDDEN = $3307000B;
CdoPR_FORM_HOST_MAP = $33061003;
CdoPR_FORM_MESSAGE_BEHAVIOR = $330A0003;
CdoPR_FORM_VERSION = $3301001E;
CdoPR_FTP_SITE = $3A4C001E;
CdoPR_GENDER = $3A4D0002;
CdoPR_GENERATION = $3A05001E;
CdoPR_GIVEN_NAME = $3A06001E;
CdoPR_GOVERNMENT_ID_NUMBER = $3A07001E;
CdoPR_HASATTACH = $0E1B000B;
CdoPR_HEADER_FOLDER_ENTRYID = $3E0A0102;
CdoPR_HOBBIES = $3A43001E;
CdoPR_HOME_ADDRESS_CITY = $3A59001E;
CdoPR_HOME_ADDRESS_COUNTRY = $3A5A001E;
CdoPR_HOME_ADDRESS_POST_OFFICE_BOX = $3A5E001E;
CdoPR_HOME_ADDRESS_POSTAL_CODE = $3A5B001E;
CdoPR_HOME_ADDRESS_STATE_OR_PROVINCE = $3A5C001E;
CdoPR_HOME_ADDRESS_STREET = $3A5D001E;
CdoPR_HOME_FAX_NUMBER = $3A25001E;
CdoPR_HOME_TELEPHONE_NUMBER = $3A09001E;
CdoPR_HOME2_TELEPHONE_NUMBER = $3A2F001E;
CdoPR_ICON = $0FFD0102;
CdoPR_IDENTITY_DISPLAY = $3E00001E;
CdoPR_IDENTITY_ENTRYID = $3E010102;
CdoPR_IDENTITY_SEARCH_KEY = $3E050102;
CdoPR_IMPLICIT_CONVERSION_PROHIBITED = $0016000B;
CdoPR_IMPORTANCE = $00170003;
CdoPR_INCOMPLETE_COPY = $0035000B;
CdoPR_INITIAL_DETAILS_PANE = $3F080003;
CdoPR_INITIALS = $3A0A001E;
CdoPR_INSTANCE_KEY = $0FF60102;
CdoPR_INTERNET_APPROVED = $1030001E;
CdoPR_INTERNET_ARTICLE_NUMBER = $0E230003;
CdoPR_INTERNET_CONTROL = $1031001E;
CdoPR_INTERNET_DISTRIBUTION = $1032001E;
CdoPR_INTERNET_FOLLOWUP_TO = $1033001E;
CdoPR_INTERNET_LINES = $10340003;
CdoPR_INTERNET_MESSAGE_ID = $1035001E;
CdoPR_INTERNET_NEWSGROUPS = $1036001E;
CdoPR_INTERNET_NNTP_PATH = $1038001E;
CdoPR_INTERNET_ORGANIZATION = $1037001E;
CdoPR_INTERNET_PRECEDENCE = $1041001E;
CdoPR_INTERNET_REFERENCES = $1039001E;
CdoPR_IPM_ID = $00180102;
CdoPR_IPM_OUTBOX_ENTRYID = $35E20102;
CdoPR_IPM_OUTBOX_SEARCH_KEY = $34110102;
CdoPR_IPM_RETURN_REQUESTED = $0C02000B;
CdoPR_IPM_SENTMAIL_ENTRYID = $35E40102;
CdoPR_IPM_SENTMAIL_SEARCH_KEY = $34130102;
CdoPR_IPM_SUBTREE_ENTRYID = $35E00102;
CdoPR_IPM_SUBTREE_SEARCH_KEY = $34100102;
CdoPR_IPM_WASTEBASKET_ENTRYID = $35E30102;
CdoPR_IPM_WASTEBASKET_SEARCH_KEY = $34120102;
CdoPR_ISDN_NUMBER = $3A2D001E;
CdoPR_KEYWORD = $3A0B001E;
CdoPR_LANGUAGE = $3A0C001E;
CdoPR_LANGUAGES = $002F001E;
CdoPR_LAST_MODIFICATION_TIME = $30080040;
CdoPR_LATEST_DELIVERY_TIME = $00190040;
CdoPR_LOCALITY = $3A27001E;
CdoPR_LOCATION = $3A0D001E;
CdoPR_MAIL_PERMISSION = $3A0E000B;
CdoPR_MANAGER_NAME = $3A4E001E;
CdoPR_MAPPING_SIGNATURE = $0FF80102;
CdoPR_MDB_PROVIDER = $34140102;
CdoPR_MESSAGE_ATTACHMENTS = $0E13000D;
CdoPR_MESSAGE_CC_ME = $0058000B;
CdoPR_MESSAGE_CLASS = $001A001E;
CdoPR_MESSAGE_DELIVERY_ID = $001B0102;
CdoPR_MESSAGE_DELIVERY_TIME = $0E060040;
CdoPR_MESSAGE_DOWNLOAD_TIME = $0E180003;
CdoPR_MESSAGE_FLAGS = $0E070003;
CdoPR_MESSAGE_RECIP_ME = $0059000B;
CdoPR_MESSAGE_RECIPIENTS = $0E12000D;
CdoPR_MESSAGE_SECURITY_LABEL = $001E0102;
CdoPR_MESSAGE_SIZE = $0E080003;
CdoPR_MESSAGE_SUBMISSION_ID = $00470102;
CdoPR_MESSAGE_TO_ME = $0057000B;
CdoPR_MESSAGE_TOKEN = $0C030102;
CdoPR_MHS_COMMON_NAME = $3A0F001E;
CdoPR_MIDDLE_NAME = $3A44001E;
CdoPR_MINI_ICON = $0FFC0102;
CdoPR_MOBILE_TELEPHONE_NUMBER = $3A1C001E;
CdoPR_MODIFY_VERSION = $0E1A0014;
CdoPR_MSG_STATUS = $0E170003;
CdoPR_NDR_DIAG_CODE = $0C050003;
CdoPR_NDR_REASON_CODE = $0C040003;
CdoPR_NEWSGROUP_NAME = $0E24001E;
CdoPR_NICKNAME = $3A4F001E;
CdoPR_NNTP_XREF = $1040001E;
CdoPR_NON_RECEIPT_NOTIFICATION_REQUESTED = $0C06000B;
CdoPR_NON_RECEIPT_REASON = $003E0003;
CdoPR_NORMALIZED_SUBJECT = $0E1D001E;
CdoPR_OBJECT_TYPE = $0FFE0003;
CdoPR_OBSOLETED_IPMS = $001F0102;
CdoPR_OFFICE_LOCATION = $3A19001E;
CdoPR_OFFICE_TELEPHONE_NUMBER = $3A08001E;
CdoPR_OFFICE2_TELEPHONE_NUMBER = $3A1B001E;
CdoPR_ORGANIZATIONAL_ID_NUMBER = $3A10001E;
CdoPR_ORIG_MESSAGE_CLASS = $004B001E;
CdoPR_ORIGIN_CHECK = $00270102;
CdoPR_ORIGINAL_AUTHOR_ADDRTYPE = $0079001E;
CdoPR_ORIGINAL_AUTHOR_EMAIL_ADDRESS = $007A001E;
CdoPR_ORIGINAL_AUTHOR_ENTRYID = $004C0102;
CdoPR_ORIGINAL_AUTHOR_NAME = $004D001E;
CdoPR_ORIGINAL_AUTHOR_SEARCH_KEY = $00560102;
CdoPR_ORIGINAL_DELIVERY_TIME = $00550040;
CdoPR_ORIGINAL_DISPLAY_BCC = $0072001E;
CdoPR_ORIGINAL_DISPLAY_CC = $0073001E;
CdoPR_ORIGINAL_DISPLAY_NAME = $3A13001E;
CdoPR_ORIGINAL_DISPLAY_TO = $0074001E;
CdoPR_ORIGINAL_EITS = $00210102;
CdoPR_ORIGINAL_ENTRYID = $3A120102;
CdoPR_ORIGINAL_SEARCH_KEY = $3A140102;
CdoPR_ORIGINAL_SENDER_ADDRTYPE = $0066001E;
CdoPR_ORIGINAL_SENDER_EMAIL_ADDRESS = $0067001E;
CdoPR_ORIGINAL_SENDER_ENTRYID = $005B0102;
CdoPR_ORIGINAL_SENDER_NAME = $005A001E;
CdoPR_ORIGINAL_SENDER_SEARCH_KEY = $005C0102;
CdoPR_ORIGINAL_SENSITIVITY = $002E0003;
CdoPR_ORIGINAL_SENT_REPRESENTING_ADDRTYPE = $0068001E;
CdoPR_ORIGINAL_SENT_REPRESENTING_EMAIL_ADDR = $0069001E;
CdoPR_ORIGINAL_SENT_REPRESENTING_ENTRYID = $005E0102;
CdoPR_ORIGINAL_SENT_REPRESENTING_NAME = $005D001E;
CdoPR_ORIGINAL_SENT_REPRESENTING_SEARCH_KEY = $005F0102;
CdoPR_ORIGINAL_SUBJECT = $0049001E;
CdoPR_ORIGINAL_SUBMIT_TIME = $004E0040;
CdoPR_ORIGINALLY_INTENDED_RECIP_ADDRTYPE = $007B001E;
CdoPR_ORIGINALLY_INTENDED_RECIP_EMAIL_ADDR = $007C001E;
CdoPR_ORIGINALLY_INTENDED_RECIP_ENTRYID = $10120102;
CdoPR_ORIGINALLY_INTENDED_RECIPIENT_NAME = $00200102;
CdoPR_ORIGINATING_MTA_CERTIFICATE = $0E250102;
CdoPR_ORIGINATOR_AND_DL_EXPANSION_HISTORY = $10020102;
CdoPR_ORIGINATOR_CERTIFICATE = $00220102;
CdoPR_ORIGINATOR_DELIVERY_REPORT_REQUESTED = $0023000B;
CdoPR_ORIGINATOR_NON_DELIVERY_REPORT_REQ = $0C08000B;
CdoPR_ORIGINATOR_REQUESTED_ALTERNATE_RECIP = $0C090102;
CdoPR_ORIGINATOR_RETURN_ADDRESS = $00240102;
CdoPR_OTHER_ADDRESS_CITY = $3A5F001E;
CdoPR_OTHER_ADDRESS_COUNTRY = $3A60001E;
CdoPR_OTHER_ADDRESS_POST_OFFICE_BOX = $3A64001E;
CdoPR_OTHER_ADDRESS_POSTAL_CODE = $3A61001E;
CdoPR_OTHER_ADDRESS_STATE_OR_PROVINCE = $3A62001E;
CdoPR_OTHER_ADDRESS_STREET = $3A63001E;
CdoPR_OTHER_TELEPHONE_NUMBER = $3A1F001E;
CdoPR_OWN_STORE_ENTRYID = $3E060102;
CdoPR_OWNER_APPT_ID = $00620003;
CdoPR_PAGER_TELEPHONE_NUMBER = $3A21001E;
CdoPR_PARENT_DISPLAY = $0E05001E;
CdoPR_PARENT_ENTRYID = $0E090102;
CdoPR_PARENT_KEY = $00250102;
CdoPR_PERSONAL_HOME_PAGE = $3A50001E;
CdoPR_PHYSICAL_DELIVERY_BUREAU_FAX_DELIVERY = $0C0A000B;
CdoPR_PHYSICAL_DELIVERY_MODE = $0C0B0003;
CdoPR_PHYSICAL_DELIVERY_REPORT_REQUEST = $0C0C0003;
CdoPR_PHYSICAL_FORWARDING_ADDRESS = $0C0D0102;
CdoPR_PHYSICAL_FORWARDING_ADDRESS_REQUESTED = $0C0E000B;
CdoPR_PHYSICAL_FORWARDING_PROHIBITED = $0C0F000B;
CdoPR_PHYSICAL_RENDITION_ATTRIBUTES = $0C100102;
CdoPR_POST_FOLDER_ENTRIES = $103B0102;
CdoPR_POST_FOLDER_NAMES = $103C001E;
CdoPR_POST_OFFICE_BOX = $3A2B001E;
CdoPR_POST_REPLY_DENIED = $103F0102;
CdoPR_POST_REPLY_FOLDER_ENTRIES = $103D0102;
CdoPR_POST_REPLY_FOLDER_NAMES = $103E001E;
CdoPR_POSTAL_ADDRESS = $3A15001E;
CdoPR_POSTAL_CODE = $3A2A001E;
CdoPR_PREFERRED_BY_NAME = $3A47001E;
CdoPR_PREPROCESS = $0E22000B;
CdoPR_PRIMARY_CAPABILITY = $39040102;
CdoPR_PRIMARY_FAX_NUMBER = $3A23001E;
CdoPR_PRIMARY_TELEPHONE_NUMBER = $3A1A001E;
CdoPR_PRIORITY = $00260003;
CdoPR_PROFESSION = $3A46001E;
CdoPR_PROFILE_NAME = $3D12001E;
CdoPR_PROOF_OF_DELIVERY = $0C110102;
CdoPR_PROOF_OF_DELIVERY_REQUESTED = $0C12000B;
CdoPR_PROOF_OF_SUBMISSION = $0E260102;
CdoPR_PROOF_OF_SUBMISSION_REQUESTED = $0028000B;
CdoPR_PROVIDER_DISPLAY = $3006001E;
CdoPR_PROVIDER_DLL_NAME = $300A001E;
CdoPR_PROVIDER_ORDINAL = $300D0003;
CdoPR_PROVIDER_SUBMIT_TIME = $00480040;
CdoPR_PROVIDER_UID = $300C0102;
CdoPR_RADIO_TELEPHONE_NUMBER = $3A1D001E;
CdoPR_RCVD_REPRESENTING_ADDRTYPE = $0077001E;
CdoPR_RCVD_REPRESENTING_EMAIL_ADDRESS = $0078001E;
CdoPR_RCVD_REPRESENTING_ENTRYID = $00430102;
CdoPR_RCVD_REPRESENTING_NAME = $0044001E;
CdoPR_RCVD_REPRESENTING_SEARCH_KEY = $00520102;
CdoPR_READ_RECEIPT_ENTRYID = $00460102;
CdoPR_READ_RECEIPT_REQUESTED = $0029000B;
CdoPR_READ_RECEIPT_SEARCH_KEY = $00530102;
CdoPR_RECEIPT_TIME = $002A0040;
CdoPR_RECEIVE_FOLDER_SETTINGS = $3415000D;
CdoPR_RECEIVED_BY_ADDRTYPE = $0075001E;
CdoPR_RECEIVED_BY_EMAIL_ADDRESS = $0076001E;
CdoPR_RECEIVED_BY_ENTRYID = $003F0102;
CdoPR_RECEIVED_BY_NAME = $0040001E;
CdoPR_RECEIVED_BY_SEARCH_KEY = $00510102;
CdoPR_RECIPIENT_CERTIFICATE = $0C130102;
CdoPR_RECIPIENT_NUMBER_FOR_ADVICE = $0C14001E;
CdoPR_RECIPIENT_REASSIGNMENT_PROHIBITED = $002B000B;
CdoPR_RECIPIENT_STATUS = $0E150003;
CdoPR_RECIPIENT_TYPE = $0C150003;
CdoPR_RECORD_KEY = $0FF90102;
CdoPR_REDIRECTION_HISTORY = $002C0102;
CdoPR_REFERRED_BY_NAME = $3A47001E;
CdoPR_REGISTERED_MAIL_TYPE = $0C160003;
CdoPR_RELATED_IPMS = $002D0102;
CdoPR_REMOTE_PROGRESS = $3E0B0003;
CdoPR_REMOTE_PROGRESS_TEXT = $3E0C001E;
CdoPR_REMOTE_VALIDATE_OK = $3E0D000B;
CdoPR_RENDERING_POSITION = $370B0003;
CdoPR_REPLY_RECIPIENT_ENTRIES = $004F0102;
CdoPR_REPLY_RECIPIENT_NAMES = $0050001E;
CdoPR_REPLY_REQUESTED = $0C17000B;
CdoPR_REPLY_TIME = $00300040;
CdoPR_REPORT_ENTRYID = $00450102;
CdoPR_REPORT_NAME = $003A001E;
CdoPR_REPORT_SEARCH_KEY = $00540102;
CdoPR_REPORT_TAG = $00310102;
CdoPR_REPORT_TEXT = $1001001E;
CdoPR_REPORT_TIME = $00320040;
CdoPR_REPORTING_DL_NAME = $10030102;
CdoPR_REPORTING_MTA_CERTIFICATE = $10040102;
CdoPR_REQUESTED_DELIVERY_METHOD = $0C180003;
CdoPR_RESOURCE_FLAGS = $30090003;
CdoPR_RESOURCE_METHODS = $3E020003;
CdoPR_RESOURCE_PATH = $3E07001E;
CdoPR_RESOURCE_TYPE = $3E030003;
CdoPR_RESPONSE_REQUESTED = $0063000B;
CdoPR_RESPONSIBILITY = $0E0F000B;
CdoPR_RETURNED_IPM = $0033000B;
CdoPR_ROW_TYPE = $0FF50003;
CdoPR_ROWID = $30000003;
CdoPR_RTF_COMPRESSED = $10090102;
CdoPR_RTF_IN_SYNC = $0E1F000B;
CdoPR_RTF_SYNC_BODY_COUNT = $10070003;
CdoPR_RTF_SYNC_BODY_CRC = $10060003;
CdoPR_RTF_SYNC_BODY_TAG = $1008001E;
CdoPR_RTF_SYNC_PREFIX_COUNT = $10100003;
CdoPR_RTF_SYNC_TRAILING_COUNT = $10110003;
CdoPR_SEARCH = $3607000D;
CdoPR_SEARCH_KEY = $300B0102;
CdoPR_SECURITY = $00340003;
CdoPR_SELECTABLE = $3609000B;
CdoPR_SEND_INTERNET_ENCODING = $3A710003;
CdoPR_SEND_RICH_INFO = $3A40000B;
CdoPR_SENDER_ADDRTYPE = $0C1E001E;
CdoPR_SENDER_EMAIL_ADDRESS = $0C1F001E;
CdoPR_SENDER_ENTRYID = $0C190102;
CdoPR_SENDER_NAME = $0C1A001E;
CdoPR_SENDER_SEARCH_KEY = $0C1D0102;
CdoPR_SENSITIVITY = $00360003;
CdoPR_SENT_REPRESENTING_ADDRTYPE = $0064001E;
CdoPR_SENT_REPRESENTING_EMAIL_ADDRESS = $0065001E;
CdoPR_SENT_REPRESENTING_ENTRYID = $00410102;
CdoPR_SENT_REPRESENTING_NAME = $0042001E;
CdoPR_SENT_REPRESENTING_SEARCH_KEY = $003B0102;
CdoPR_SENTMAIL_ENTRYID = $0E0A0102;
CdoPR_SERVICE_DELETE_FILES = $3D10101E;
CdoPR_SERVICE_DLL_NAME = $3D0A001E;
CdoPR_SERVICE_ENTRY_NAME = $3D0B001E;
CdoPR_SERVICE_EXTRA_UIDS = $3D0D0102;
CdoPR_SERVICE_NAME = $3D09001E;
CdoPR_SERVICE_SUPPORT_FILES = $3D0F101E;
CdoPR_SERVICE_UID = $3D0C0102;
CdoPR_SERVICES = $3D0E0102;
CdoPR_SPOOLER_STATUS = $0E100003;
CdoPR_SPOUSE_NAME = $3A48001E;
CdoPR_START_DATE = $00600040;
CdoPR_STATE_OR_PROVINCE = $3A28001E;
CdoPR_STATUS = $360B0003;
CdoPR_STATUS_CODE = $3E040003;
CdoPR_STATUS_STRING = $3E08001E;
CdoPR_STORE_ENTRYID = $0FFB0102;
CdoPR_STORE_PROVIDERS = $3D000102;
CdoPR_STORE_RECORD_KEY = $0FFA0102;
CdoPR_STORE_STATE = $340E0003;
CdoPR_STORE_SUPPORT_MASK = $340D0003;
CdoPR_STREET_ADDRESS = $3A29001E;
CdoPR_SUBFOLDERS = $360A000B;
CdoPR_SUBJECT = $0037001E;
CdoPR_SUBJECT_IPM = $00380102;
CdoPR_SUBJECT_PREFIX = $003D001E;
CdoPR_SUBMIT_FLAGS = $0E140003;
CdoPR_SUPERSEDES = $103A001E;
CdoPR_SUPPLEMENTARY_INFO = $0C1B001E;
CdoPR_SURNAME = $3A11001E;
CdoPR_TELEX_NUMBER = $3A2C001E;
CdoPR_TEMPLATEID = $39020102;
CdoPR_TITLE = $3A17001E;
CdoPR_TNEF_CORRELATION_KEY = $007F0102;
CdoPR_TRANSMITABLE_DISPLAY_NAME = $3A20001E;
CdoPR_TRANSPORT_KEY = $0E160003;
CdoPR_TRANSPORT_MESSAGE_HEADERS = $007D001E;
CdoPR_TRANSPORT_PROVIDERS = $3D020102;
CdoPR_TRANSPORT_STATUS = $0E110003;
CdoPR_TTYTDD_PHONE_NUMBER = $3A4B001E;
CdoPR_TYPE_OF_MTS_USER = $0C1C0003;
CdoPR_USER_CERTIFICATE = $3A220102;
CdoPR_USER_X509_CERTIFICATE = $3A701102;
CdoPR_VALID_FOLDER_MASK = $35DF0003;
CdoPR_VIEWS_ENTRYID = $35E50102;
CdoPR_WEDDING_ANNIVERSARY = $3A410040;
CdoPR_X400_CONTENT_TYPE = $003C0102;
CdoPR_X400_DEFERRED_DELIVERY_CANCEL = $3E09000B;
CdoPR_XPOS = $3F050003;
CdoPR_YPOS = $3F060003;
// General
PR_IPM_PUBLIC_FOLDERS_ENTRYID = $66310102;
CdoDefaultFolderCalendar = 0;
CdoDefaultFolderContacts = 5;
CdoDefaultFolderDeletedItems = 4;
CdoDefaultFolderInbox = 1;
CdoDefaultFolderJournal = 6;
CdoDefaultFolderNotes = 7;
CdoDefaultFolderOutbox = 2;
CdoDefaultFolderSentItems = 3;
CdoDefaultFolderTasks = 8;
// Message Recipients
CdoTo = 1;
CdoCc = 2;
CdoBcc = 3;
// Attachment Types
CdoFileData = 1;
CdoFileLink = 2;
CdoOLE = 3;
CdoEmbeddedMessage = 4;
// AddressEntry DisplayType
CdoUser = 0; // A local messaging user.
CdoDistList = 1; // A public distribution list.
CdoForum = 2; // A forum, such as a bulletin board or a public folder.
CdoAgent = 3; // An automated agent, such as Quote-of-the-Day.
CdoOrganization = 4;
// A special address entry defined for large groups, such as a helpdesk.
CdoPrivateDistList = 5; // A private, personally administered distribution list.
CdoRemoteUser = 6; // A messaging user in a remote messaging system.
// Error Codes
CdoE_OK = 0;
CdoE_ACCOUNT_DISABLED = $80040124;
CdoE_AMBIGUOUS_RECIP = $80040700;
CdoE_BAD_CHARWIDTH = $80040103;
CdoE_BAD_COLUMN = $80040118;
CdoE_BAD_VALUE = $80040301;
CdoE_BUSY = $8004010B;
CdoE_CALL_FAILED = $80004005;
CdoE_CANCEL = $80040501;
CdoE_COLLISION = $80040604;
CdoE_COMPUTED = $8004011A;
CdoE_CORRUPT_DATA = $8004011B;
CdoE_CORRUPT_STORE = $80040600;
CdoE_DECLINE_COPY = $80040306;
CdoE_DISK_ERROR = $80040116;
CdoE_END_OF_SESSION = $80040200;
CdoE_EXTENDED_ERROR = $80040119;
CdoE_FAILONEPROVIDER = $8004011D;
CdoE_FOLDER_CYCLE = $8004060B;
CdoE_HAS_FOLDERS = $80040609;
CdoE_HAS_MESSAGES = $8004060A;
CdoE_INTERFACE_NOT_SUPPORTED = $80004002;
CdoE_INVALID_ACCESS_TIME = $80040123;
CdoE_INVALID_BOOKMARK = $80040405;
CdoE_INVALID_ENTRYID = $80040107;
CdoE_INVALID_OBJECT = $80040108;
CdoE_INVALID_PARAMETER = $80070057;
CdoE_INVALID_TYPE = $80040302;
CdoE_INVALID_WORKSTATION_ACCOUNT = $80040122;
CdoE_LOGON_FAILED = $80040111;
CdoE_MISSING_REQUIRED_COLUMN = $80040202;
CdoE_NETWORK_ERROR = $80040115;
CdoE_NO_ACCESS = $80070005;
CdoE_NO_RECIPIENTS = $80040607;
CdoE_NO_SUPPORT = $80040102;
CdoE_NO_SUPPRESS = $80040602;
CdoE_NON_STANDARD = $80040606;
CdoE_NOT_ENOUGH_DISK = $8004010D;
CdoE_NOT_ENOUGH_MEMORY = $8007000E;
CdoE_NOT_ENOUGH_RESOURCES = $8004010E;
CdoE_NOT_FOUND = $8004010F;
CdoE_NOT_IN_QUEUE = $80040601;
CdoE_NOT_INITIALIZED = $80040605;
CdoE_NOT_ME = $80040502;
CdoE_OBJECT_CHANGED = $80040109;
CdoE_OBJECT_DELETED = $8004010A;
CdoE_PASSWORD_CHANGE_REQUIRED = $80040120;
CdoE_PASSWORD_EXPIRED = $80040121;
CdoE_SESSION_LIMIT = $80040112;
CdoE_STRING_TOO_LONG = $80040105;
CdoE_SUBMITTED = $80040608;
CdoE_TABLE_EMPTY = $80040402;
CdoE_TABLE_TOO_BIG = $80040403;
CdoE_TIMEOUT = $80040401;
CdoE_TOO_BIG = $80040305;
CdoE_TOO_COMPLEX = $80040117;
CdoE_TYPE_NO_SUPPORT = $80040303;
CdoE_UNABLE_TO_ABORT = $80040114;
CdoE_UNABLE_TO_COMPLETE = $80040400;
CdoE_UNCONFIGURED = $8004011C;
CdoE_UNEXPECTED_ID = $80040307;
CdoE_UNEXPECTED_TYPE = $80040304;
CdoE_UNKNOWN_CPID = $8004011E;
CdoE_UNKNOWN_ENTRYID = $80040201;
CdoE_UNKNOWN_FLAGS = $80040106;
CdoE_UNKNOWN_LCID = $8004011F;
CdoE_USER_CANCEL = $80040113;
CdoE_VERSION = $80040110;
CdoE_WAIT = $80040500;
CdoW_APPROX_COUNT = $00040482;
CdoW_CANCEL_MESSAGE = $00040580;
CdoW_ERRORS_RETURNED = $00040380;
CdoW_NO_SERVICE = $00040203;
CdoW_PARTIAL_COMPLETION = $00040680;
CdoW_POSITION_CHANGED = $00040481;
type
TOleVarPtr = ^OleVariant;
TCdoMapiSession = class(TObject)
private
FImpersonated: boolean;
FLastErrorCode: DWORD;
FMyName,
FMyEMailAddress,
FLastError: string;
FCurrentUser,
FOleGlobalAddressList,
FOleDeletedItems,
FOleOutBox, FOleSentItems,
FOleInbox, FOleContacts,
FOleSession: OleVariant;
FConnected: boolean;
function GetFVersion: string;
protected
procedure SetOleFolders;
public
// System
constructor Create; overload;
constructor Create(const Profile: string); overload;
constructor Create(const Profile: string;
const UserName: string;
const Domain: string;
const Password: string); overload;
destructor Destroy; override;
// User
function LoadAddressList(StringList: TStrings): boolean;
function LoadObjectList(const FolderOle: OleVariant; List: TList): boolean;
function LoadEMailTree(TV: TTreeView; Expand1stLevel: boolean = false;
SubjectMask: string = ''): boolean;
function LoadContactList(const FolderOle: OleVariant;
Items: TStrings): boolean; overload;
function LoadContactList(const FolderName: string;
Items: TStrings): boolean; overload;
procedure ShowContactDetails(Contact: OleVariant);
function First(const FolderOle: OleVariant; out ItemOle: OleVariant): boolean;
function Last(const FolderOle: OleVariant; out ItemOle: OleVariant): boolean;
function Next(const FolderOle: OleVariant; out ItemOle: OleVariant): boolean;
function Prior(const FolderOle: OleVariant; out ItemOle: OleVariant): boolean;
function AsString(const ItemOle: Olevariant; const FieldIdConstant: DWORD):
string;
// Properties
property CurrentUser: OleVariant read FCurrentUser;
property Connected: boolean read FConnected;
property LastErrorMess: string read FlastError;
property LastErrorCode: DWORD read FlastErrorCode;
property InBox: OleVariant read FOleInBox;
property OutBox: OleVariant read FOleOutBox;
property DeletedItems: Olevariant read FOleDeletedItems;
property SentItems: Olevariant read FOleSentItems;
property GlobalAddressList: Olevariant read FOleGlobalAddressList;
property Contacts: Olevariant read FOleContacts;
property Session: OleVariant read FOleSession;
property Version: string read GetFVersion;
property MyName: string read FMyName;
property MyEMailAddress: string read FMyEMailAddress;
end;
// Function Prototypes
function CdoNothing(Obj: OleVariant): boolean;
function CdoDefaultProfile: string;
procedure CdoDisposeList(WorkList: TList);
procedure CdoDisposeObjects(WorkStrings: TStrings);
procedure CdoDisposeNodes(WorkData: TTreeNodes);
function VarNothing: IDispatch;
// -----------------------------------------------------------------------------
implementation
// ===================================
// Emulate VB function IS NOTHING
// ===================================
function CdoNothing(Obj: OleVariant): boolean;
begin
Result := IDispatch(Obj) = nil;
end;
// ============================================
// Emulate VB function VarX := Nothing
// ============================================
function VarNothing: IDispatch;
var
Retvar: IDispatch;
begin
Retvar := nil;
Result := Retvar;
end;
// ============================================
// Get Default Message profile from registry
// ============================================
function CdoDefaultProfile: string;
var
WinReg: TRegistry;
Retvar: string;
begin
Retvar := '';
WinReg := TRegistry.Create;
if
WinReg.OpenKey('\Software\Microsoft\Windows NT\CurrentVersion\Windows Messaging Subsystem\Profiles', false) then
begin
Retvar := WinReg.ReadString('DefaultProfile');
WinReg.CloseKey;
end;
WinReg.Free;
Result := Retvar;
end;
// =================================================
// Disposes of any memory allocations in a TList
// =================================================
procedure CdoDisposeList(WorkList: TList);
var
i: integer;
begin
if WorkList <> nil then
for i := 0 to WorkList.Count - 1 do
if WorkList[i] <> nil then
dispose(WorkList[i]);
end;
// ====================================================
// Disposes of any memory allocations in a TStringList
// ====================================================
procedure CdoDisposeObjects(WorkStrings: TStrings);
var
i: integer;
begin
if WorkStrings <> nil then
for i := 0 to WorkStrings.Count - 1 do
if WorkStrings.Objects[i] <> nil then
dispose(TOleVarPtr(WorkStrings.Objects[i]));
end;
// ====================================================
// Disposes of any memory allocations in a TTreeView
// ====================================================
procedure CdoDisposeNodes(WorkData: TTreeNodes);
var
i: integer;
TN: TTreeNode;
begin
if WorkData <> nil then
begin
for i := 0 to WorkData.Count - 1 do
begin
TN := WorkData[i];
if TN.Data <> nil then
dispose(TOleVarPtr(TN.Data));
end;
end;
end;
// -----------------------------------------------------------------------------
// TCdoMapiSession
// -----------------------------------------------------------------------------
// ================
// Default Profile
// ================
constructor TCdoMapiSession.Create;
begin
FImpersonated := false;
FLastError := '';
FLastErrorCode := CdoE_OK;
try
FOleSession := CreateOleObject('MAPI.Session');
FOleSession.Logon(CdoDefaultProfile);
SetOleFolders;
except
on E: Exception do
begin
FLastError := E.Message;
FLastErrorCode := CdoE_LOGON_FAILED;
FConnected := false;
end;
end;
end;
// ===========================
// With Specified Profile
// ===========================
constructor TCdoMapiSession.Create(const Profile: string);
begin
FImpersonated := false;
try
FOleSession := CreateOleObject('MAPI.Session');
FOleSession.Logon(Profile);
SetOleFolders;
except
on E: Exception do
begin
FLastError := E.Message;
FLastErrorCode := CdoE_LOGON_FAILED;
FConnected := false;
end;
end;
end;
// ======================================================
// Impersonate amother user and use specified profile
// ======================================================
constructor TCdoMapiSession.Create(const Profile: string;
const UserName: string;
const Domain: string;
const Password: string);
var
SecurityH: THandle;
begin
FImpersonated := false;
try
LogonUser(PChar(UserName), PChar(Domain), PChar(Password),
LOGON32_LOGON_SERVICE,
LOGON32_PROVIDER_DEFAULT, SecurityH);
FImpersonated := ImpersonateLoggedOnUser(SecurityH);
FOleSession := CreateOleObject('MAPI.Session');
FOleSession.Logon(Profile, Password, false, true);
SetOleFolders;
except
on E: Exception do
begin
FLastError := E.Message;
FLastErrorCode := CdoE_LOGON_FAILED;
FConnected := false;
end;
end;
end;
// ======================
// Free and Clean up
// ======================
destructor TCdoMapiSession.Destroy;
begin
if FConnected then
FOleSession.LogOff;
FCurrentUser := Unassigned;
FOleGlobalAddressList := Unassigned;
FOleSentItems := Unassigned;
FOleContacts := Unassigned;
FOleOutBox := Unassigned;
FOleDeletedItems := Unassigned;
FOleInBox := Unassigned;
FOleSession := Unassigned;
if FImpersonated then
RevertToSelf;
inherited Destroy;
end;
// =======================================================
// Addition initialization called by Create() oveloads
// =======================================================
procedure TCdoMapiSession.SetOleFolders;
begin
try
FOleGlobalAddressList :=
FOleSession.AddressLists['Global Address List'].AddressEntries;
except
FOleGlobalAddressList := VarNothing;
end;
try
FOleContacts := FOleSession.AddressLists['Contacts'].AddressEntries;
except
FOleContacts := VarNothing;
end;
try
FOleInBox := FOleSession.InBox.Messages;
except
FOleInBox := VarNothing;
end;
try
FOleOutBox := FOleSession.OutBox.Messages;
except
FOleOutBox := VarNothing;
end;
try
FOleDeletedItems :=
FOleSession.GetDefaultFolder(CdoDefaultFolderDeletedItems).Messages;
except
FOleDeletedItems := VarNothing;
end;
try
FOleSentItems := FOleSession.GetDefaultFolder(CdoDefaultFolderSentItems).Messages;
except
FOleSentItems := VarNothing;
end;
try
FCurrentUser := FOleSession.CurrentUser;
FMyName := FCurrentUser.Name;
except
FCurrentUser := VarNothing;
end;
FConnected := true;
FMyEMailAddress := AsString(FCurrentUser, CdoPR_EMAIL_AT_ADDRESS);
end;
// ======================
// Return CDO Version
// ======================
function TCdoMapiSession.GetFVersion: string;
begin
if FConnected then
Result := FOleSession.Version
else
Result := 'Not Connected';
end;
// ========================================================
// Fill a string list with all available address lists
// ========================================================
function TCdoMapiSession.LoadAddressList(StringList: TStrings): boolean;
var
Addr: OleVariant;
i: integer;
Retvar: boolean;
begin
Retvar := false;
if FConnected then
begin
StringList.Clear;
try
Addr := FOleSession.AddressLists;
for i := 1 to Addr.Count do
StringList.Add(Addr.Item[i].Name);
Retvar := true;
except
on E: Exception do
begin
FLastError := E.Message;
FLastErrorCode := CdoE_NOT_FOUND;
end;
end;
Addr := Unassigned;
end;
Result := Retvar;
end;
// =================================================
// Iteration functions
// =================================================
function TCdoMapiSession.First(const FolderOle: OleVariant;
out ItemOle: OleVariant): boolean;
var
Retvar: boolean;
begin
Retvar := true;
if FConnected then
begin
try
ItemOle := FolderOle.GetFirst;
if CdoNothing(ItemOle) then
begin
Retvar := false;
end;
except
on E: Exception do
begin
FLastError := E.Message;
FLastErrorCode := CdoE_NOT_FOUND;
Retvar := false;
end;
end;
end
else
Retvar := false;
Result := Retvar;
end;
function TCdoMapiSession.Last(const FolderOle: OleVariant;
out ItemOle: OleVariant): boolean;
var
Retvar: boolean;
begin
Retvar := true;
if FConnected then
begin
try
ItemOle := FolderOle.GetLast;
if CdoNothing(ItemOle) then
begin
Retvar := false;
end;
except
on E: Exception do
begin
FLastError := E.Message;
FLastErrorCode := CdoE_NOT_FOUND;
Retvar := false;
end;
end;
end
else
Retvar := false;
Result := Retvar;
end;
function TCdoMapiSession.Next(const FolderOle: OleVariant;
out ItemOle: OleVariant): boolean;
var
Retvar: boolean;
begin
Retvar := true;
if FConnected then
begin
try
ItemOle := FolderOle.GetNext;
if CdoNothing(ItemOle) then
begin
Retvar := false;
end;
except
on E: Exception do
begin
FLastError := E.Message;
FLastErrorCode := CdoE_NOT_FOUND;
Retvar := false;
end;
end;
end
else
Retvar := false;
Result := Retvar;
end;
function TCdoMapiSession.Prior(const FolderOle: OleVariant;
out ItemOle: OleVariant): boolean;
var
Retvar: boolean;
begin
Retvar := true;
if FConnected then
begin
try
ItemOle := FolderOle.GetPrior;
if CdoNothing(ItemOle) then
begin
Retvar := false;
end;
except
on E: Exception do
begin
FLastError := E.Message;
FLastErrorCode := CdoE_NOT_FOUND;
Retvar := false;
end;
end;
end
else
Retvar := false;
Result := Retvar;
end;
// =========================
// Field Get Routines
// =========================
function TCdoMapiSession.AsString(const ItemOle: Olevariant;
const FieldIdConstant: DWORD): string;
var
Retvar: string;
begin
if FConnected then
begin
// Special case for EMail Address - Resolve to normal form
if FieldIdConstant = CdoPR_EMAIL_AT_ADDRESS then
begin
try
RetVar := ItemOle.Fields[CdoPR_EMAIL_AT_ADDRESS];
except
try
Retvar := ItemOle.Fields[CdoPR_EMAIL_ADDRESS];
except
on E: Exception do
begin
FLastError := E.Message;
FLastErrorCode := CdoE_INVALID_OBJECT;
Retvar := '';
end;
end;
end;
end
else
begin
try
RetVar := ItemOle.Fields[FieldIdConstant];
except
on E: Exception do
begin
FLastError := E.Message;
FLastErrorCode := CdoE_INVALID_OBJECT;
Retvar := '';
end;
end;
end;
end
else
Retvar := '';
Result := Retvar;
end;
// ================================================
// Load EMail folders Messages into a TTreeView
// Allocations in Nodes are freed at each call to
// LoadEMailTree, but you are responsible to call
// CdoDisposeNodes or dispose of the allocations
// yourself at Application end
// ================================================
function TCdoMapiSession.LoadEMailTree(TV: TTreeView;
Expand1stLevel: boolean = false;
SubjectMask: string = ''): boolean;
var
DocPtr: TOleVarPtr;
Item: OleVariant;
TN, RN, XN: TTreeNode;
Retvar,
Images: boolean;
procedure AddTree(const Name: string; Folder: Olevariant);
begin
if First(Folder, Item) then
begin
TN := TV.Items.AddChildObject(RN, Name, nil);
if Images then
begin
TN.ImageIndex := 0;
TN.SelectedIndex := 0;
end;
while true do
begin
if (SubjectMask = '') or (MatchesMask(Item.Subject, SubjectMask)) then
begin
New(DocPtr);
DocPtr^ := Item;
if Item.Subject = '' then
XN := TV.Items.AddChildObject(TN, '<No Subject> - ' + Item.Sender.Name,
DocPtr)
else
XN := TV.Items.AddChildObject(TN, Item.Subject, DocPtr);
if Images then
begin
XN.ImageIndex := 1;
XN.SelectedIndex := 1;
end;
end;
if not Next(Folder, Item) then
break;
end;
end;
end;
begin
Retvar := false;
if FConnected then
begin
Screen.Cursor := crHourGlass;
Application.ProcessMessages;
CdoDisposeNodes(TV.Items);
TV.Items.Clear;
TV.Items.BeginUpdate;
TN := nil;
RN := nil;
RN := TV.Items.AddObject(RN, 'Personal Folders', nil);
Images := (TV.Images <> nil) and (TV.Images.Count >= 2);
if Images then
begin
RN.ImageIndex := 0;
RN.SelectedIndex := 0;
end;
try
AddTree('Inbox', InBox);
AddTree('Outbox', OutBox);
AddTree('Sent Items', SentItems);
AddTree('Deleted Items', DeletedItems);
Retvar := true;
except
on E: Exception do
begin
FLastError := E.Message;
FLastErrorCode := CdoE_CALL_FAILED;
end;
end;
if Expand1stLevel then
TV.Items[0].Expand(false);
TV.Items.EndUpdate;
Screen.Cursor := crDefault;
Item := Unassigned;
Screen.Cursor := crDefault;
end;
Result := Retvar;
end;
// =============================================================
// Load Contact list into a TStringList
// Allocations in Objects are freed at each call to
// LoadEMailTree, but you are responsible to call
// CdoDisposeObjects or dispose of the allocations yourself at
// Application end.
//
// Format "[LastName FirstName]EMailAddress"
// ===============================================================
function TCdoMapiSession.LoadContactList(const FolderOle: OleVariant;
Items: TStrings): boolean;
var
ContactPtr: TOleVarPtr;
Contact: OleVariant;
AddrType,
FullName,
LastName, FirstName, Email: string;
Retvar: boolean;
begin
Retvar := false;
if FConnected then
begin
Screen.Cursor := crHourGlass;
Application.ProcessMessages;
CdoDisposeObjects(Items);
Items.Clear;
Items.BeginUpdate;
try
if First(FolderOle, Contact) then
begin
while true do
begin
LastName := trim(AsString(Contact, CdoPR_SURNAME));
FirstName := trim(AsString(Contact, CdoPR_GIVEN_NAME));
EMail := AsString(Contact, CdoPR_EMAIL_AT_ADDRESS);
AddrType := AsString(Contact, CdoPR_ADDRTYPE);
if (EMail <> '') and (AddrType <> 'FAX') then
begin
New(ContactPtr);
ContactPtr^ := Contact;
FullName := trim(LastName + ' ' + FirstName);
Items.AddObject('[' + FullName + ']' + EMail, TObject(ContactPtr));
end;
if not Next(FolderOle, Contact) then
break;
end;
Retvar := true;
end;
except
on E: Exception do
begin
FLastError := E.Message;
FLastErrorCode := CdoE_CALL_FAILED;
end;
end;
Items.EndUpdate;
Contact := Unassigned;
Screen.Cursor := crDefault;
end;
Result := Retvar;
end;
function TCdoMapiSession.LoadContactList(const FolderName: string;
Items: TStrings): boolean;
var
Contacts: OleVariant;
Retvar: boolean;
begin
Retvar := false;
if FConnected then
begin
try
Contacts := FOleSession.AddressLists[FolderName].AddressEntries;
if not CdoNothing(Contacts) then
begin
Retvar := LoadContactList(Contacts, Items);
end;
Contacts := Unassigned;
except
on E: Exception do
begin
CdoDisposeObjects(Items);
Items.Clear;
FLastError := E.Message;
FLastErrorCode := CdoE_CALL_FAILED;
end;
end;
end;
Result := Retvar;
end;
// =============================================================
// Load Folder list into a TList
// Allocations in Objects are freed at each call to
// LoadObjectList, but you are responsible to call
// CdoDisposeList or dispose of the allocations yourself at
// Application end.
// ===============================================================
function TCdoMapiSession.LoadObjectList(const FolderOle: OleVariant;
List: TList): boolean;
var
ItemPtr: TOleVarPtr;
Item: OleVariant;
Retvar: boolean;
begin
Retvar := false;
if FConnected then
begin
Screen.Cursor := crHourGlass;
Application.ProcessMessages;
CdoDisposeList(List);
List.Clear;
try
if First(FolderOle, Item) then
begin
while true do
begin
New(ItemPtr);
ItemPtr^ := Item;
List.Add(ItemPtr);
if not Next(FolderOle, Item) then
break;
end;
end;
except
on E: Exception do
begin
CdoDisposeList(List);
List.Clear;
FLastError := E.Message;
FLastErrorCode := CdoE_CALL_FAILED;
end;
end;
Item := Unassigned;
Screen.Cursor := crDefault;
end;
Result := Retvar;
end;
// =================================================================
// The CDO method Details() gives an error if cancel is pressed
// =================================================================
procedure TCdoMapiSession.ShowContactDetails(Contact: OleVariant);
begin
if not CdoNothing(Contact) then
try
Contact.Details(Application.Handle);
except
// Not interested - either a dialog appears or not
end;
end;
end.