Question

I am facing an issue with sending attachments with invitation using EWS Managed API. Appointments attendees are not receiving any attachments added to the appointment but attachment do appears in the calendar of the person that created the appointment.

Here is my code snippet:

try
{
    ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2010_SP1, TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time"));
    service.Credentials = new WebCredentials("calendar_user", "password1", "acme");
    service.Url = new Uri("https://acme.com/EWS/Exchange.asmx");

    Appointment appointment = new Appointment(service);
    service.ImpersonatedUserId = new ImpersonatedUserId(ConnectingIdType.SmtpAddress, "tin.tin@acme.com");

    String UID = "D09F3FF6-1461-414C-89E8-C05BC3B66A4A";
    appointment.ICalUid = UID;
    appointment.Subject = "Test Subject";
    appointment.Body = "Test Content.";
    appointment.Start = new DateTime(2012, 07, 11, 17, 00, 0);
    appointment.End = appointment.Start.AddMinutes(30);

    FileAttachment attachment = appointment.Attachments.AddFileAttachment(@"C:\Users\tintin\Documents\Test.xlsx");
    attachment.IsInline = false;

    appointment.RequiredAttendees.Add("tin.tin@acme.com");

    appointment.Save(SendInvitationsMode.SendToAllAndSaveCopy);
}
catch (Exception ex)
{

}
Was it helpful?

Solution

Look like EWS has horrible limitation with attachment handling. I found a workaround to resolve this issue which requires updating appointment object twice.

appointment.ICalUid = UID;
appointment.Subject = "Test Subject";
appointment.Body = "Test Content.";
appointment.Start = new DateTime(2012, 07, 11, 17, 00, 0);
appointment.End = appointment.Start.AddMinutes(30);

FileAttachment attachment = appointment.Attachments.AddFileAttachment(@"C:\Users\tintin\Documents\Test.xlsx");
attachment.IsInline = false;

appointment.Save(folderCalendar, SendInvitationsMode.SendToNone);
appointment.RequiredAttendees.Add("tin.tin@acme.com");

appointment.Update(ConflictResolutionMode.AutoResolve, SendInvitationsOrCancellationsMode.SendToAllAndSaveCopy);

OTHER TIPS

Looks like this issue is specific to Exchange Server 2010 Service Pack 1. I got similar issue and when I changed the version to SP2 issue got resolved. Below code solved the problem

ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2010_SP2);

A second update did the trick, but it will cause a cancelled meeting at the bottom. Can't use it in product. It doesn't work to change the version to SP2.

Still find a better solution.

Yes, EWS has some issue, while updating the meeting with new attachments it is not getting updated for the first time. Needed 2 instances to update it.

Microsoft.Exchange.WebServices.Data.Appointment meet1 = await 
Microsoft.Exchange.WebServices.Data.Appointment.Bind(service, strMessageID);
                                meet1.Attachments.Clear();
                                foreach (FileUpload Item in 
objCreateEvent.strAttachmentUploadPath)
                                {
                                    meet1.Attachments.AddFileAttachment(Item.fileName, 
Item.filePath);
                                }
                                meet1.RequiredAttendees.Clear();
                                foreach (string ToItem in objToIds)
                                {
                                    meet1.RequiredAttendees.Add(ToItem);
                                }
                                await 
meet1.Update(ConflictResolutionMode.AlwaysOverwrite, 
SendInvitationsOrCancellationsMode.SendToAllAndSaveCopy);
                                Microsoft.Exchange.WebServices.Data.Appointment 
meeting2 = await Microsoft.Exchange.WebServices.Data.Appointment.Bind(service, 
strMessageID);
                                meeting2.Attachments.Clear();
                                foreach (FileUpload Item in 
objCreateEvent.strAttachmentUploadPath)
                                {
                                    
meeting2.Attachments.AddFileAttachment(Item.fileName, Item.filePath);
                                }
                                meeting2.RequiredAttendees.Clear();
                                foreach (string ToItem in objToIds)
                                {
                                    meeting2.RequiredAttendees.Add(ToItem);
                                }
                                await 
meeting2.Update(ConflictResolutionMode.AlwaysOverwrite, 
SendInvitationsOrCancellationsMode.SendToAllAndSaveCopy);
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top