How to access message recipients (MAPI)

G

Guest

I use next code (was simplified here) for accessing message recipients, but
it works too slowly:

SizedSPropTagArray( 3, cols ) = { 3, { PR_ENTRYID, PR_SUBJECT,
PR_SENDER_NAME } };
MAPIUtils::QueryAllRows( spTable, (SPropTagArray*)&cols, 0, 0, 0, &pRowSet );
for( UINT i = 0; i < pRowSet->cRows; i++ )
{
// processing recipients
spFolder->OpenEntry( row->lpProps[0].Value.bin.cb,
(LPENTRYID)row->lpProps[0].Value.bin.lpb, NULL, 0, &messagetype,
(IUnknown**)&spMessage );
CComPtr<IMAPITable> spRecipientTable;
spMessage->GetRecipientTable( MAPI_UNICODE, &spRecipientTable );
SizedSPropTagArray( 3, rcptcols ) = { 3, { PR_EMAIL_ADDRESS,
PR_RECIPIENT_TYPE, PR_DISPLAY_NAME } };
MAPIUtils::QueryAllRows( spRecipientTable, (SPropTagArray*)&rcptcols, 0,
0, 0, &pRows );
for( UINT r = 0; r < pRows->cRows; r++ )
{
// loop through all the recipient' properties
for ( int ii = 0; ii < pRows->aRow[r].cValues; ii++ )
{
ULONG ulPT = pRows->aRow[r].lpProps[ii].ulPropTag;
switch ( ulPT )
{
case PR_EMAIL_ADDRESS:
// ...
}
}
}

//processing PR_SUBJECT and PR_SENDER_NAME properties here...
}

Are there another ways to read message recipients without opening entry and
retrieving recipients table?
 
D

Dmitry Streblechenko

No, I am afraid not. You can create a restriction on the on the recipients
though.
Do you really need to process all recipients in all messages in a given
folder?

Dmitry Streblechenko (MVP)
http://www.dimastr.com/
OutlookSpy - Outlook, CDO
and MAPI Developer Tool
 
G

Guest

I need to get all recipients (their names and emails) of every message.
Message properties PR_DISPLAY_TO and PR_DISPLAY_CC are not exactly what I
need.
 
G

Guest

Dmitry, is it possible to open each message avoiding of calling
OpenEntry(msgEntryID)? It takes high time.

Now I open mapi folder using spIMsgStore->OpenEntry(), then open mapi table
- spIFolder->GetContentsTable(), query all rows from the table (also using
SetColumns() to access only one property - PR_ENTRYID), and after that I
should open each message using spFolder->OpenEntry() to have an ability to
call GetRecipientTable() method.

What if I need to read only all recipients for each message without reading
other message properties?

In MSDN I found that contents of PR_MESSAGE_RECIPIENTS should be accessed by
the IMAPIProp::OpenProperty method, requesting the IID_IMAPITable interface
identifier. But I have no idea how to realize it.

The fact is that Reunion's Outlook Addin (www.reunion.com) read all
recipients from all messages extremely fast (only first launch is meaningful
cause it cashes results in its own db).
 
D

Dmitry Streblechenko

No, no way around it. You either call IMessage::GetRecipientTable or
IMessage::OpenProperty(PR_MESSAGE_RECIPIENTS).

Dmitry Streblechenko (MVP)
http://www.dimastr.com/
OutlookSpy - Outlook, CDO
and MAPI Developer Tool
 
I

Ivan Copernic

Hello,

Yes ! Use DCI Mail Processor SDK EMAPI wrapper to do this.

OpenMailbox(Your PST file name)

GetFolderCount - to get folders count

GetMessageProp - to get all mail message properties

Just 3 simple API call

Google - "DCI Mail Processor"
I use next code (was simplified here) for accessing message recipients, but
it works too slowly:

SizedSPropTagArray( 3, cols ) = { 3, { PR_ENTRYID, PR_SUBJECT,
PR_SENDER_NAME } };
MAPIUtils::QueryAllRows( spTable, (SPropTagArray*)&cols, 0, 0, 0, &pRowSet );
for( UINT i = 0; i < pRowSet->cRows; i++ )
{
// processing recipients
spFolder->OpenEntry( row->lpProps[0].Value.bin.cb,
(LPENTRYID)row->lpProps[0].Value.bin.lpb, NULL, 0, &messagetype,
(IUnknown**)&spMessage );
CComPtr<IMAPITable> spRecipientTable;
spMessage->GetRecipientTable( MAPI_UNICODE, &spRecipientTable );
SizedSPropTagArray( 3, rcptcols ) = { 3, { PR_EMAIL_ADDRESS,
PR_RECIPIENT_TYPE, PR_DISPLAY_NAME } };
MAPIUtils::QueryAllRows( spRecipientTable, (SPropTagArray*)&rcptcols, 0,
0, 0, &pRows );
for( UINT r = 0; r < pRows->cRows; r++ )
{
// loop through all the recipient' properties
for ( int ii = 0; ii < pRows->aRow[r].cValues; ii++ )
{
ULONG ulPT = pRows->aRow[r].lpProps[ii].ulPropTag;
switch ( ulPT )
{
case PR_EMAIL_ADDRESS:
// ...
}
}
}

//processing PR_SUBJECT and PR_SENDER_NAME properties here...
}

Are there another ways to read message recipients without opening entry and
retrieving recipients table?
On Tuesday, June 26, 2007 7:18 PM Dmitry Streblechenko wrote:
No, I am afraid not. You can create a restriction on the on the recipients
though.
Do you really need to process all recipients in all messages in a given
folder?

Dmitry Streblechenko (MVP)
http://www.dimastr.com/
OutlookSpy - Outlook, CDO
and MAPI Developer Tool

news:[email protected]...
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Similar Threads


Top