Introduction
Recently I worked on a custom MailClient project. In that, we used EWS API provided by Exchange Server 2007 which is fairly new. During development, we faced many problems. On the Internet, you will get a lot of results but they are really scattered and some of them are missing. Here I want to share my knowledge with all of you and try to provide all the required information and sample code in this series. In every part, I'll take one functionality and try to explore that. Any suggestion will be highly appreciated.
What Is Exchange Server?
Exchange Server is a messaging system that includes Mail Server, e-mail client and GroupWare application. Exchange Server is generally used with Microsoft Outlook and tightly integrated with Active Directory and Instant Messenger.
Messaging System comprises creation, storage, maintenance of different kinds of messages like email, voice mail, fax, images, etc.
Exchange Server API's History
What is Exchange Web Services
EWS (Exchange Web Services) is an Application Programming Interface which can be used by different developers to communicate with Microsoft Exchange Server 2007.
This API is exposed as SOAP (Simple object Access Protocol)- based Web-service, which means a requester must send their request in an XML form using SOAP to EWS contained in an HTTP POST
request. EWS itself responds in the same manner using SOAP and XML messages in the HTTP response object. EWS is exposed on a Exchange Client Access Server (CAS) through an ASP.NET 2.0 Web service. This can be represented pictorially as follows:
Client talking SOAP + XML to EWS
Special Features
- Efficient access to Outlook PIM objects
- Notifications and events
- Synchronization
- Availability service
- Autodiscover service
- E-mail Lifecycle
- OWA WebParts
How to Use EWS
Most Web services publish a “Contract” of sorts that tell those on the outside what the service can do and how to communicate with it. EWS exposes this contract as a standard Web Services Description Languages (WSDL) document named services.wsdl which resides in the same directory as Web service. One can look into it.
To use it “Add a Web Reference to your project”. It may ask you to supply your credentials, so go ahead if prompted.
Note: Certificate Issues - depending on the nature of the certificate that the Exchange CAS provides to Visual Studio, It might complain that the certificate is untrusted and disable the Add Reference button, so you need to install this certificate.
Now you are ready to use the EWS in your application.
Here, I will take one method exposed by EWS and try to explore it.
Using the Code
How to Send a Mail - Normal Mail
The sample code is like this:
public void SendMessage(
string subject,
string body,
string toEmailAddress)
{
ExchangeServiceBinding esb = new ExchangeServiceBinding();
esb.Credentials = new NetworkCredential("user2", "password", "domain");
esb.Url = "https://www.example.com/ews/exchange.asmx";
CreateItemType request = new CreateItemType();
request.MessageDisposition = MessageDispositionType.SendOnly;
request.MessageDispositionSpecified = true;
MessageType message = new MessageType();
message.Subject = subject;
message.Body = new BodyType();
message.Body.BodyType1 = BodyTypeType.Text;
message.Body.Value = body;
message.ToRecipients = new EmailAddressType[1];
message.ToRecipients[0] = new EmailAddressType();
message.ToRecipients[0].EmailAddress = toEmailAddress;
message.ToRecipients[0].RoutingType = "SMTP";
request.Items = new NonEmptyArrayOfAllItemsType();
request.Items.Items = new ItemType[1];
request.Items.Items[0] = message;
CreateItemResponseType response = esb.CreateItem(request);
this.ThrowOnError("SendMessage", response.ResponseMessages.Items[0]);
}
How to Send a Mail with Attachment
To send mail with attachment:
- Create a
MessageType
object using CreateItem
- Add the attachments using
CreateItem
- Send the message using
SendItem
Creating a messageType Object using CreateItem
public ItemIdType CreateMessage(
string subject,
string body,
string toEmailAddress)
{
ExchangeServiceBinding esb = new ExchangeServiceBinding();
esb.Credentials = new NetworkCredential("user2", "password", "domain");
esb.Url = https:
CreateItemType request = new CreateItemType();
request.MessageDisposition = MessageDispositionType.SaveOnly;
request.MessageDispositionSpecified = true;
MessageType message = new MessageType();
message.Subject = subject;
message.Body = new BodyType();
message.Body.BodyType1 = BodyTypeType.Text;
message.Body.Value = body;
message.ToRecipients = new EmailAddressType[1];
message.ToRecipients[0] = new EmailAddressType();
message.ToRecipients[0].EmailAddress = toEmailAddress;
message.ToRecipients[0].RoutingType = "SMTP";
request.Items = new NonEmptyArrayOfAllItemsType();
request.Items.Items = new ItemType[1];
request.Items.Items[0] = message;
CreateItemResponseType response = esb.CreateItem(request);
this.ThrowOnError("SendMessage", response.ResponseMessages.Items[0]);
}
Adding the Attachments
public ItemIdType CreateAttachment(string name,string FilePath, ItemIdType p_signalId)
{
ExchangeServiceBinding esb = new ExchangeServiceBinding();
esb.Credentials = new NetworkCredential("user2", "password", "domain");
esb.Url = "https://www.example.com/ews/exchange.asmx";
FileAttachmentType fileAttachment = null;
CreateAttachmentType attachementRequest = new CreateAttachmentType();
attachementRequest.ParentItemId = p_signalId;
attachementRequest.Attachments = new AttachmentType[intAttachmentsCount];
fileAttachment = new FileAttachmentType();
MessageBDO.AttachmentsDTRow drowAttachment
= (MessageBDO.AttachmentsDTRow)p_signal.AttachmentsDT.Rows[intIndex];
fileAttachment.Name =name;
fileAttachment.ContentType = "text/plain";
fileAttachment.Content = System.IO.File.ReadAllBytes(FilePath);
attachementRequest.Attachments[intIndex] = fileAttachment;
ItemIdType attachmentItemId = new ItemIdType();
CreateAttachmentResponseType response =
(CreateAttachmentResponseType)_esb.CreateAttachment(attachementRequest );
if (response.ResponseMessages.Items[0].ResponseClass == ResponseClassType.Success)
{
AttachmentIdType attachmentId = ((AttachmentInfoResponseMessageType)
response.ResponseMessages.Items[0]).Attachments[0].AttachmentId;
attachmentItemId.ChangeKey = attachmentId.RootItemChangeKey.ToString();
attachmentItemId.Id = attachmentId.RootItemId.ToString();
}
return attachmentItemId;
}
Now Sending the Mail
public bool SendMessage(ItemIdType p_itemId)
{
bool blnResult = false;
SendItemType siSendItem = new SendItemType();
siSendItem.ItemIds = new BaseItemIdType[1];
siSendItem.SavedItemFolderId = new TargetFolderIdType();
DistinguishedFolderIdType siSentItemsFolder = new DistinguishedFolderIdType();
siSentItemsFolder.Id = DistinguishedFolderIdNameType.sentitems;
siSendItem.SavedItemFolderId.Item = siSentItemsFolder;
siSendItem.SaveItemToFolder = true;
siSendItem.ItemIds[0] = (BaseItemIdType)p_itemId;
SendItemResponseType srSendItemResponseMessage = _esb.SendItem(siSendItem);
if (srSendItemResponseMessage.ResponseMessages.Items[0].ResponseClass ==
ResponseClassType.Success)
{
blnResult = true;
}
else
{
blnResult = false;
}
return blnResult;
}
Reference