Professional Documents
Culture Documents
Introduction For Mapi
Introduction For Mapi
This article covers the basics of writing a simple application using Extended MAPI. The
main purpose of this article is to show developers how they can enhance their
applications with Extended MAPI. To have this application working, you need to
download and install a free component, the MAPI Store Accessor for .NET.
There are also corresponding collections such as Stores, Folders etc. To start using
these classes, you should get the collection of stores from the component when it is
connected to the MAPI subsystem.
First steps
To start working with the MAPI Store Accessor, find it in the Toolbox window and drop
it onto the Windows Form, or declare the component in your code manually.
• Call Initialize
• Call LogOff
They are like start and stop commands. When calling Initialize with the boolean
parameter, the component connects to the default profile. Your application creates or
connects to the existing MAPI session depending on the value which you pass to the
method. If you want to create a new session, pass True. If you need to connect to the
existing session, pass False. When you pass False, make sure that the session exists.
Another overload of the Initialize method accepts a profile name and password.
Coding
Add Initialize and LogOff where appropriate. I do it in the Load and FormClosing
event handlers of the form, respectively.
VB.NET
Collapse
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) _
Handles MyBase.Load
' initialize component
AdxmapiStoreAccessor1.Initialize(True)
' additional tasks
Dim folders As Folders = _
AdxmapiStoreAccessor1.MsgStores(0).RootFolder.Folders(1).Folders
Dim folder As Folder
For Each folder In folders
Dim folderName As Object =
folder.GetProperty(ADXMAPIPropertyTag._PR_DISPLAY_NAME)
If folderName IsNot Nothing Then
ipmTreeView.Nodes.Add(folderName.ToString())
End If
Next
End Sub
C#
Collapse
private void Form1_Load(object sender, EventArgs e)
{
// initialize component
adxmapiStoreAccessor1.Initialize(true);
// additional tasks
foreach (Folder folder in
adxmapiStoreAccessor1.MsgStores[0].RootFolder.Folders[1].Folders)
{
object folderName =
folder.GetProperty(ADXMAPIPropertyTag._PR_DISPLAY_NAME);
if (folderName != null)
{
ipmTreeView.Nodes.Add(folderName.ToString());
}
}
}
Now, we are ready to add business logic to our application. We need a TreeView and a
ListBox. Drop them onto the form. Add the appropriate settings of your choice. Finally,
add the following event handlers:
VB.NET
Collapse
Private Sub ipmTreeView_AfterSelect(ByVal sender As
System.Object, _
ByVal e As System.Windows.Forms.TreeViewEventArgs) _
Handles ipmTreeView.AfterSelect
listBoxItems.Items.Clear()
' retrieve the first message store in a profile we are logged
in
current = _
AdxmapiStoreAccessor1.MsgStores(0).RootFolder.Folders(1).F
olders(e.Node.Index)
Dim item As MapiItem
For Each item In current.MapiItems
' retrieve the PR_BODY property of the mapi item
Dim subject As Object =
item.GetProperty(ADXMAPIPropertyTag._PR_SUBJECT)
If subject IsNot Nothing Then
listBoxItems.Items.Add(subject.ToString())
End If
Next
End Sub
C#
Collapse
private void ipmTreeView_AfterSelect(object sender,
TreeViewEventArgs e)
{
listBoxItems.Items.Clear();
// retrieve the first message store in a profile we are
logged in
current = ((Folders)adxmapiStoreAccessor1.MsgStores[0].
RootFolder.Folders[1].Folders).Add(e.Node.Text)
;
foreach (MapiItem item in current.MapiItems)
{
// retrieve the PR_BODY property of the mapi item
object subject =
item.GetProperty(ADXMAPIPropertyTag._PR_SUBJECT);
if (subject != null)
{
listBoxItems.Items.Add(subject.ToString());
}
}
}
VB.NET
Collapse
Private Sub listBoxItems_DoubleClick(ByVal sender As
System.Object, _
ByVal e As System.EventArgs) Handles
listBoxItems.DoubleClick
If listBoxItems.SelectedIndex >= 0 Then
Dim item As MapiItem =
current.MapiItems(listBoxItems.SelectedIndex)
Dim body As Object =
item.GetProperty(ADXMAPIPropertyTag._PR_BODY)
If body IsNot Nothing Then
MsgBox(body.ToString(), "The body of the mail item", _
MessageBoxButtons.OK, MessageBoxIcon.Information)
End If
End If
End Sub
C#
Collapse
private void listBoxItems_DoubleClick(object sender, EventArgs e)
{
if (listBoxItems.SelectedIndex >= 0)
{
MapiItem item =
current.MapiItems[listBoxItems.SelectedIndex];
object body =
item.GetProperty(ADXMAPIPropertyTag._PR_BODY);
if (body != null)
{
System.Windows.Forms.MessageBox.Show(body.ToString(),
"The body of the mail item", MessageBoxButtons.OK,
MessageBoxIcon.Information);
}
}
}
Conclusion
That's it. Our application is ready to go. The TreeView control on the left shows the
folder tree of the first message store of the profile we are logged in to. You can see the
same tree in your default mail agent (it may be, for example, Microsoft Outlook). The
ListBox control on the right shows all the items contained in the selected folder in the
TreeView control. By clicking on an item in the right panel, you get the body (PR_BODY)
of the MAPI item.