I have fallen for exchange web services. There are endless possibilities with exchange web services, and product group is still working to make it even better.
Today I have created a neat sample to download attachments off Exchange Server
Sample: DownloadAttachments
Input Params: itemID , folder
public void DownloadAttachments(string itemID,string folder)
{
ExchangeServiceBinding esb = new ExchangeServiceBinding();
esb.AllowAutoRedirect = true;
esb.Credentials = new System.Net.NetworkCredential("USERNAME", "PASSWORD", "DOMAIN");
esb.Url = "http://your-cas-server/ews/exchange.asmx";
//first we need to get the attachment IDs for the item so we will need to make a GetItem call first
//specify the conetent that we want to retrieve
PathToUnindexedFieldType[] ptufta = new PathToUnindexedFieldType[2];
ptufta[0] = new PathToUnindexedFieldType();
ptufta[0].FieldURI = UnindexedFieldURIType.itemAttachments;
ptufta[1] = new PathToUnindexedFieldType();
ptufta[1].FieldURI = UnindexedFieldURIType.itemHasAttachments;
ItemResponseShapeType irst = new ItemResponseShapeType();
irst.BaseShape = DefaultShapeNamesType.IdOnly;
irst.AdditionalProperties = ptufta;
ItemIdType[] biita = new ItemIdType[1];
biita[0] = new ItemIdType();
biita[0].Id = itemID;
//get the items
GetItemType git = new GetItemType();
git.ItemShape = irst;
git.ItemIds = biita;
GetItemResponseType girt = esb.GetItem(git);
if (girt.ResponseMessages.Items[0].ResponseClass != ResponseClassType.Success)
return;
//now that we have the attachment IDs let's request the atthacments and save them to disk
ItemType MsgItem = ((ItemInfoResponseMessageType)girt.ResponseMessages.Items[0]).Items.Items[0];
AttachmentResponseShapeType arst = null;
AttachmentIdType[] aita = null;
if (true == MsgItem.HasAttachments)
{
//create the attachment shape; we want the mime contnet just in case this is an message item so that we can save to disk
arst = new AttachmentResponseShapeType();
arst.IncludeMimeContent = true;
arst.IncludeMimeContentSpecified = true;
//create an array of attachment ids that we want to request
aita = new AttachmentIdType[MsgItem.Attachments.Length];
for (int i = 0; i < MsgItem.Attachments.Length; i++)
{
aita[i] = new AttachmentIdType();
aita[i].Id = MsgItem.Attachments[i].AttachmentId.Id;
}
}
//create a GetAttachment object for the GetAttachment operation
GetAttachmentType gat = new GetAttachmentType();
gat.AttachmentIds = aita;
gat.AttachmentShape = arst;
GetAttachmentResponseType gart = esb.GetAttachment(gat);
//save each attachment to disk
foreach (AttachmentInfoResponseMessageType Attachment in gart.ResponseMessages.Items)
{
switch (Attachment.Attachments[0].GetType().Name)
{
//attachments can be of type FileAttachmentType or ItemAttachmentType
//so we need to figure out which type we have before we manipulate it
case "FileAttachmentType":
//save to disk
FileAttachmentType TheFileAttachment = (FileAttachmentType)Attachment.Attachments[0];
using (Stream FileToDisk = new FileStream(folder + @"\" + Attachment.Attachments[0].Name, FileMode.Create))
{
FileToDisk.Write(TheFileAttachment.Content, 0,
TheFileAttachment.Content.Length);
FileToDisk.Flush();
FileToDisk.Close();
}
break;
case "ItemAttachmentType":
//save to disk
ItemType TheItemAttachment = ((ItemAttachmentType)Attachment.Attachments[0]).Item;
using (Stream FileToDisk = new FileStream(folder + @".\" + Attachment.Attachments[0].Name + ".eml", FileMode.Create))
{
byte[] ContentBytes = System.Convert.FromBase64String(TheItemAttachment.MimeContent.Value);
FileToDisk.Write(ContentBytes, 0,
ContentBytes.Length);
FileToDisk.Flush();
FileToDisk.Close();
}
break;
default:
break;
}
}
}