In this article we will see a example for extracting / reading the emails from MS Outlook using C#.Net.
We will see a sample application, which read mail from outlook and display its contents in our application.
The screenshot of sample application is shown below
Before starting the coding, you have to add the reference
The version of Reference may change depending on version of MS Office you are using. Another important thing is, after adding reference Microsoft.Office.Interop.Outlook , right click on Reference , goto properties of reference and set Embed Interop Types -> True . This avoids Runtime COM Exceptions.
Now Add NameSpace using Microsoft.Office.Interop.Outlook; and start coding.
The c# code for the button click Read Mail is given below
The Outlook not only contains mail Items but also may contain Report Item,Meeting Item,Note Items etc,. Hence if you are trying to Cast a Non -MailItem as MailItem, application will throw a run-time COM Exception.The following line of code given below is kept in try catch, to check if the item is MailItem or not.
We will see a sample application, which read mail from outlook and display its contents in our application.
The screenshot of sample application is shown below
Before starting the coding, you have to add the reference
The version of Reference may change depending on version of MS Office you are using. Another important thing is, after adding reference Microsoft.Office.Interop.Outlook , right click on Reference , goto properties of reference and set Embed Interop Types -> True . This avoids Runtime COM Exceptions.
Now Add NameSpace using Microsoft.Office.Interop.Outlook; and start coding.
The c# code for the button click Read Mail is given below
private void
btnReadMail_Click(object sender, EventArgs e)
{
try
{
try
{
ItemNo = Convert.ToInt32(txtItemNo.Text);
}
catch
(FormatException ex2)
{
//
MessageBox.Show();
MessageBox.Show(ex2.Message
+ "\nEnter Valid Number greater than
zero", "Outlook Reader",
MessageBoxButtons.OK, MessageBoxIcon.Warning);
return;
}
//
Check whether there is an running Outlook process
if
(Process.GetProcessesByName("OUTLOOK").Count() > 0)
{
//
If so, use the GetActiveObject method to obtain the process and cast it to an
Application object.
myApp =
System.Runtime.InteropServices.Marshal.GetActiveObject("Outlook.Application") as Microsoft.Office.Interop.Outlook.Application;
}
else
{
//if
not, creating a new application instance
myApp = new Microsoft.Office.Interop.Outlook.Application();
}
mapiNameSpace =
myApp.GetNamespace("MAPI");
//selecting
Inbox folder
myInbox =
mapiNameSpace.GetDefaultFolder(Microsoft.Office.Interop.Outlook.OlDefaultFolders.olFolderInbox);
mapiNameSpace.SendAndReceive(false); //performs
SendRecieve Operation without showing ProgrssDialog
if
(myInbox.Items.Count > 0 && ItemNo <= myInbox.Items.Count) //if checking mailcount starts
{
string
subject = string.Empty;
string
attachments = string.Empty;
string
body = string.Empty;
string
senderName = string.Empty;
string
senderEmail = string.Empty;
string
recepients = string.Empty;
string
creationdate = string.Empty;
bool
isMailItem = true;
Microsoft.Office.Interop.Outlook.MailItem
MyOutlookItem = null;
try
{
//if the item is not a mail Item Application will throw COM exception
MyOutlookItem =
((Microsoft.Office.Interop.Outlook.MailItem)myInbox.Items[ItemNo]);
}
catch
(System.Exception ex)
{
MessageBox.Show(ex.Message + "\nThere
Item " + ItemNo + " is not a Mail
Item", "Outlook Reader",
MessageBoxButtons.OK, MessageBoxIcon.Warning);
isMailItem = false;
}
if
(isMailItem)
{
// Retrieving the Subject
if (MyOutlookItem.Subject != null)
{
subject =
MyOutlookItem.Subject;
//while working with database, trying to use the values in
sql query,
//replace ' with
" or some symbol, to avoid sql exceptions
subject =
subject.Replace('\'', '\"');
}
//Retrieving the Attachment Name
if (MyOutlookItem.Attachments.Count > 0)
{
lblAttachCount.Text =
MyOutlookItem.Attachments.Count.ToString();
for (int j = 1; j
<= MyOutlookItem.Attachments.Count; j++)
{
attachments +=
MyOutlookItem.Attachments[j].FileName + ";
";
}
}
else
{
lblAttachCount.Text
= MyOutlookItem.Attachments.Count.ToString();
attachments = "No Attachments found";
}
if (MyOutlookItem.Recipients.Count > 0)
{
lblReciCount.Text =
MyOutlookItem.Recipients.Count.ToString();
for (int j = 1; j
<= MyOutlookItem.Recipients.Count; j++)
{
recepients +=
MyOutlookItem.Recipients[j].Name + "<
" + MyOutlookItem.Recipients[j].Address + "
>; ";
}
}
attachments =
attachments.Replace('\'', '\"');
// retrieving the Body
body =
MyOutlookItem.Body;
body = body.Replace('\'', '\"');
// Sender Name
senderName =
MyOutlookItem.SenderName;
senderName =
senderName.Replace('\'', '\"');
// Sender Email
senderEmail =
MyOutlookItem.SenderEmailAddress;
senderEmail =
senderEmail.Replace('\'', '\"');
// Creation date
creationdate =
MyOutlookItem.CreationTime.ToString();
////////////////////////////////////////////////////////
txtCreateDate.Text =
creationdate;
txtSenderEmail.Text =
senderEmail;
txtSenderName.Text =
senderName;
txtRecipients.Text =
recepients;
txtSubject.Text =
subject;
txtAttachments.Text =
attachments;
txtBody.Text = body;
myApp = null;
}
}
else
if (ItemNo > myInbox.Items.Count) //else checking mailcount
{
MessageBox.Show("There are only " + myInbox.Items.Count
+ " items in your Inbox.", "Outlook Reader", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
else
{
MessageBox.Show("There are no items in your Inbox.", "Outlook Reader", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
catch
(System.Exception ex4)
{
MessageBox.Show(ex4.Message,
"Outlook Reader:Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
The Outlook not only contains mail Items but also may contain Report Item,Meeting Item,Note Items etc,. Hence if you are trying to Cast a Non -MailItem as MailItem, application will throw a run-time COM Exception.The following line of code given below is kept in try catch, to check if the item is MailItem or not.
//if the item is not a mail Item Application will throw COM exception
MyOutlookItem = ((Microsoft.Office.Interop.Outlook.MailItem)myInbox.Items[ItemNo]);
Suppose, If you are trying to cast the NoteItem as MailItem, it will throw a Run-time COM Exception like,
Unable to cast COM object of type System_ComObject to InterfaceType "Microsoft.Office.Interop.Outlook.MailItem" . This operation failed because the QueryInterface Call on the Com Component for the Interface with ID'{00063034-0000-0000-C000-00000000046} failed due to the following error. No such interface supported (Exception from HRESULT: 0x80004002)
(E_NONINTERFACE)
Download the source code from the link below.
Download Source Code
Suppose, If you are trying to cast the NoteItem as MailItem, it will throw a Run-time COM Exception like,
Unable to cast COM object of type System_ComObject to InterfaceType "Microsoft.Office.Interop.Outlook.MailItem" . This operation failed because the QueryInterface Call on the Com Component for the Interface with ID'{00063034-0000-0000-C000-00000000046} failed due to the following error. No such interface supported (Exception from HRESULT: 0x80004002)
(E_NONINTERFACE)
Download the source code from the link below.
No comments:
Post a Comment
Thanks for your comments.
-Sameer