Because of retention policies, we were forced to archive old email messages using the EWS API to EML files on the local system. I am now trying to programmatically recreate some of these messages from the EML files. I can open the EML files in
Outlook and the message appears as normal (with expected Office Excel attachments). Using the following code, I continually get Exceptions when invoking the EmailMessage.Save() method. Very little info about what this is in the API docs. Is
it that the EML files are not true MIME? Any help would be greatly appreciated:
// load data from file
byte[] content;
using (var file = File.OpenRead(emailFile))
{
content = new byte[file.Length];
file.Position = 0;
file.Read(content, 0, (int)file.Length);
}
var message = new EmailMessage(service);
message.MimeContent = new MimeContent("us-ascii", content);
message.Save(WellKnownFolderName.Drafts);
Exception on Save() method:
System.ArgumentOutOfRangeException was unhandled by user code
HResult=-2146233086
Message=index is out of range.
Parameter name: index
Source=Microsoft.Exchange.WebServices
ParamName=index
StackTrace:
at Microsoft.Exchange.WebServices.Data.ComplexPropertyCollection`1.get_Item(Int32 index)
at Microsoft.Exchange.WebServices.Data.ComplexPropertyCollection`1.UpdateFromXml(EwsServiceXmlReader reader, XmlNamespace xmlNamespace, String xmlElementName)
at Microsoft.Exchange.WebServices.Data.ComplexProperty.UpdateFromXml(EwsServiceXmlReader reader, String xmlElementName)
at Microsoft.Exchange.WebServices.Data.ComplexPropertyDefinitionBase.InternalLoadFromXml(EwsServiceXmlReader reader, PropertyBag propertyBag)
at Microsoft.Exchange.WebServices.Data.ComplexPropertyDefinitionBase.LoadPropertyValueFromXml(EwsServiceXmlReader reader, PropertyBag propertyBag)
at Microsoft.Exchange.WebServices.Data.PropertyBag.LoadFromXml(EwsServiceXmlReader reader, Boolean clear, PropertySet requestedPropertySet, Boolean onlySummaryPropertiesRequested)
at Microsoft.Exchange.WebServices.Data.ServiceObject.LoadFromXml(EwsServiceXmlReader reader, Boolean clearPropertyBag, PropertySet requestedPropertySet, Boolean summaryPropertiesOnly)
at Microsoft.Exchange.WebServices.Data.EwsServiceXmlReader.ReadServiceObjectsCollectionFromXml[TServiceObject](XmlNamespace collectionXmlNamespace, String collectionXmlElementName, GetObjectInstanceDelegate`1 getObjectInstanceDelegate,
Boolean clearPropertyBag, PropertySet requestedPropertySet, Boolean summaryPropertiesOnly)
at Microsoft.Exchange.WebServices.Data.EwsServiceXmlReader.ReadServiceObjectsCollectionFromXml[TServiceObject](String collectionXmlElementName, GetObjectInstanceDelegate`1 getObjectInstanceDelegate, Boolean clearPropertyBag, PropertySet
requestedPropertySet, Boolean summaryPropertiesOnly)
at Microsoft.Exchange.WebServices.Data.CreateItemResponseBase.ReadElementsFromXml(EwsServiceXmlReader reader)
at Microsoft.Exchange.WebServices.Data.ServiceResponse.LoadFromXml(EwsServiceXmlReader reader, String xmlElementName)
at Microsoft.Exchange.WebServices.Data.MultiResponseServiceRequest`1.ParseResponse(EwsServiceXmlReader reader)
at Microsoft.Exchange.WebServices.Data.ServiceRequestBase.ReadResponse(EwsServiceXmlReader ewsXmlReader)
at Microsoft.Exchange.WebServices.Data.SimpleServiceRequestBase.ReadResponseXml(Stream responseStream)
at Microsoft.Exchange.WebServices.Data.SimpleServiceRequestBase.ReadResponse(IEwsHttpWebResponse response)
at Microsoft.Exchange.WebServices.Data.SimpleServiceRequestBase.InternalExecute()
at Microsoft.Exchange.WebServices.Data.MultiResponseServiceRequest`1.Execute()
at Microsoft.Exchange.WebServices.Data.ExchangeService.InternalCreateItems(IEnumerable`1 items, FolderId parentFolderId, Nullable`1 messageDisposition, Nullable`1 sendInvitationsMode, ServiceErrorHandling errorHandling)
at Microsoft.Exchange.WebServices.Data.ExchangeService.CreateItem(Item item, FolderId parentFolderId, Nullable`1 messageDisposition, Nullable`1 sendInvitationsMode)
at Microsoft.Exchange.WebServices.Data.Item.InternalCreate(FolderId parentFolderId, Nullable`1 messageDisposition, Nullable`1 sendInvitationsMode)
at Microsoft.Exchange.WebServices.Data.Item.Save(WellKnownFolderName parentFolderName)
at ECDMS.Controllers.FileMailController.getEmailFromFile(String dir, ExchangeService service) in d:\Projects\ECDMS\1.0.0.0\ECDMS\Controllers\FileMailController.cs:line 339
at ECDMS.Controllers.FileMailController.readEmails(ExchangeService service, String EmailFilePath) in d:\Projects\ECDMS\1.0.0.0\ECDMS\Controllers\FileMailController.cs:line 295
at ECDMS.Controllers.FileMailController.LoadEmailFromFile(String Url) in d:\Projects\ECDMS\1.0.0.0\ECDMS\Controllers\FileMailController.cs:line 110
at ECDMS.Controllers.RouteController.GetRouteByAction(String action) in d:\Projects\ECDMS\1.0.0.0\ECDMS\Controllers\RouteController.cs:line 119
at lambda_method(Closure , Object , Object[] )
at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.<>c__DisplayClass13.<GetExecutor>b__c(Object instance, Object[] methodParameters)
at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.Execute(Object instance, Object[] arguments)
at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.<>c__DisplayClass5.<ExecuteAsync>b__4()
at System.Threading.Tasks.TaskHelpers.RunSynchronously[TResult](Func`1 func, CancellationToken cancellationToken)
InnerException:
Original Code to write the EML file:
// Finally, write an Outlook msg format, saved as .eml
message.Load(new PropertySet(ItemSchema.MimeContent));
MimeContent mc = message.MimeContent;
var fs = new FileStream(emlpath + "original.eml", FileMode.Create);
if (mc.Content != null) fs.Write(mc.Content, 0, mc.Content.Length);
fs.Close();