Save mail to msg file using EWS API

2019-01-06 15:37发布

I'm using Exchange Web Services Managed API 1.1 to connect to Exchange server 2010 and then find out new emails received. Now I want to save a copy of the .msg file to a folder on the disk.

I do not want to use any paid third party to integrate.

Any help will be appreciated.

8条回答
祖国的老花朵
2楼-- · 2019-01-06 15:48

There is no native support for MSG files using EWS. It's strictly an Outlook format.

The MSG spec is published at http://msdn.microsoft.com/en-us/library/cc463912%28EXCHG.80%29.aspx. It's a little complicated to understand, but do-able. You would need to pull down all of the properties for the message and then serialize it into an OLE structured file format. It's not an easy task.

In the end, you are probably better off going with a 3rd party library otherwise it might be a big task to accomplish.

查看更多
仙女界的扛把子
3楼-- · 2019-01-06 15:49

If you are happy to save into the .eml format instead, it can be done very easily just using EWS and no third party libraries. The .eml file will contain all the same information and can be opened by Outlook in the same way as .msg (and also by other programs).

message.Load(new PropertySet(ItemSchema.MimeContent));

MimeContent mc = message.MimeContent;
FileStream fs = new FileStream("c:\test.eml", FileMode.Create);

fs.Write(mc.Content, 0, mc.Content.Length);
fs.Close();

Cleaned up code:

message.Load(new PropertySet(ItemSchema.MimeContent));
var mimeContent = message.MimeContent;

using (var fileStream = new FileStream(@"C:\Test.eml", FileMode.Create))
{
    fileStream.Write(mimeContent.Content, 0, mimeContent.Content.Length);
}
查看更多
Luminary・发光体
4楼-- · 2019-01-06 15:51

You can download all the attachments using EWS API and C# . Below is the example given:

byte[][] btAttachments = new byte[3][]; //To store  3 attachment 

if (item.HasAttachments) {
    EmailMessage message = EmailMessage.Bind(objService, new ItemId(item.Id.UniqueId.ToString()), new PropertySet(BasePropertySet.IdOnly, ItemSchema.Attachments));

    noOfAttachment = message.Attachments.Count;

    // Iterate through the attachments collection and load each attachment.
    foreach(Attachment attachment in message.Attachments)
    {
        if (attachment is FileAttachment)
        {
            FileAttachment fileAttachment = attachment as FileAttachment;
            // Load the file attachment into memory and print out its file name.
            fileAttachment.Load();
            //Get the Attachment as bytes
            if (i < 3) {
                btAttachments[i] = fileAttachment.Content;
                i++;
            }
        }
        // Attachment is an item attachment.
                    else
        {
            // Load attachment into memory and write out the subject.
            ItemAttachment itemAttachment = attachment as ItemAttachment;
            itemAttachment.Load(new PropertySet(EmailMessageSchema.MimeContent));
            MimeContent mc = itemAttachment.Item.MimeContent;
            if (i < 3) {

                btAttachments[i] = mc.Content;
                i++;
            }
        }
    }
}

Above code converts all the attachment into bytes. Once you have bytes, you can convert bytes into your required format. To Convert bytes into files and save in the disk follow the below links: Write bytes to file http://www.digitalcoding.com/Code-Snippets/C-Sharp/C-Code-Snippet-Save-byte-array-to-file.html

查看更多
Bombasti
5楼-- · 2019-01-06 15:59

This suggestion was posted as a comment by @mack, but I think it deserves its own place as an answer, if for no other reason than formatting and readability of answers vs. comments.

using (FileStream fileStream = 
    File.Open(@"C:\message.eml", FileMode.Create, FileAccess.Write)) 
{ 
    message.Load(new PropertySet(ItemSchema.MimeContent)); 
    MimeContent mc = message.MimeContent; 
    fileStream.Write(mc.Content, 0, mc.Content.Length); 
}
查看更多
smile是对你的礼貌
6楼-- · 2019-01-06 16:02

You can easily access the MIME contents of the message through message.MimeContent and save the message as an EML file. The latest (2013 and 2016) versions of Outlook will be able to open EML files directly.

message.Load(new PropertySet(ItemSchema.MimeContent));
MimeContent mimcon = message.MimeContent;
FileStream fStream = new FileStream("c:\test.eml", FileMode.Create);
fStream.Write(mimcon.Content, 0, mimcon.Content.Length);
fStream.Close();

If you still need to convert to the MSG format, you have a few options:

1) MSG file format is documented - it is an OLE store (IStorage) file. See https://msdn.microsoft.com/en-us/library/cc463912(v=exchg.80).aspx

2) Use a third party MSG file wrapper, such as the one from Independentsoft: http://www.independentsoft.de/msg/index.html. Setting all properties that Outlook expects can be challenging.

3) Convert EML file to MSG directly using Redemption:

set Session = CreateObject("Redemption.RDOSession")
set Msg = Session.CreateMessageFromMsgFile("c:\test.msg")
Msg.Import("c:\test.eml", 1024)
Msg.Save
查看更多
啃猪蹄的小仙女
7楼-- · 2019-01-06 16:06

If you are going from Outlook's EntryID via VSTO (Hex) to EwsID, you need to look here: http://bernhardelbl.wordpress.com/2013/04/15/converting-entryid-to-ewsid-using-exchange-web-services-ews/

Saved me. I kept getting a "Data is corrupt." message.

查看更多
登录 后发表回答