web-dev-qa-db-ja.com

EWS APIを使用してメールをmsgファイルに保存する

Exchange WebサービスマネージAPI 1.1を使用してExchangeサーバー2010に接続し、受信した新しい電子メールを確認しています。次に、.msgファイルのコピーをディスク上のフォルダーに保存します。

有料のサードパーティを使用して統合したくありません。

どんな助けでもありがたいです。

30
Bhanu Prakash

代わりに.eml形式で保存したい場合は、サードパーティのライブラリを使用せずにEWSを使用するだけで簡単に保存できます。 .emlファイルにはすべて同じ情報が含まれており、.msgと同じ方法で(および他のプログラムによって)Outlookで開くことができます。

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();

クリーンアップされたコード:

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);
}
58
Colin Pickard

EWSを使用するMSGファイルのネイティブサポートはありません。厳密にはOutlook形式です。

MSG仕様は http://msdn.Microsoft.com/en-us/library/cc463912%28EXCHG.80%29.aspx で公開されています。これは理解するのは少し複雑ですが、実行可能です。メッセージのすべてのプロパティをプルダウンしてから、OLE構造化ファイル形式にシリアル化する必要があります。これは簡単な作業ではありません。

結局のところ、おそらくサードパーティのライブラリを使用する方が良いでしょう。さもなければ、達成するのが大きな仕事になるかもしれません。

7
Joe Doyle

この提案は@mackによってコメントとして投稿されましたが、回答とコメントのフォーマットと読みやすさ以外に理由がない場合は、それ自体が回答としての価値があると思います。

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); 
}
2
WEFX

Eml形式がオプションで、phpが言語の場合、ファイルに保存する前にMimencontentでbase64_decodeを使用します。

https://github.com/Heartspring/Exchange-Web-Services-for-PHP または https://github.com/hatsuseno/Exchange-Web-Services-forを使用している場合-PHP 追加する必要があります

 $newmessage->mc = $messageobj->MimeContent->_;

245行目または247行目。

1
jplfl

Message.MimeContentを使用してメッセージのMIMEコンテンツに簡単にアクセスし、メッセージをEMLファイルとして保存できます。 Outlookの最新(2013および2016)バージョンは、EMLファイルを直接開くことができます。

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();

それでもMSG形式に変換する必要がある場合は、いくつかのオプションがあります。

1)MSGファイル形式は文書化されています-これはOLEストア(IStorage)ファイルです。参照 https://msdn.Microsoft.com /en-us/library/cc463912(v=exchg.80).aspx

2)サードパーティのMSGファイルラッパー(Independentsoftのファイルラッパーなど)を使用: http://www.independentsoft.de/msg/index.html 。設定Outlookが期待するすべてのプロパティは、困難な場合があります。

3)EMLファイルをMSGを使用して直接変換 Redemption

set Session = CreateObject("Redemption.RDOSession")
set Msg = Session.CreateMessageFromMsgFile("c:\test.msg")
Msg.Import("c:\test.eml", 1024)
Msg.Save

これは、EWSから電子メールメッセージを.eml形式でvbsコードを介してダウンロードする問題を解決した方法です

' This is the function that retrieves the message:
function CreaMailMsg(ItemId,ChangeKey)
Dim MailMsg
Dim GetItemSOAP,GetItemResponse,Content

    LogFile.WriteLine (Now() & "-" & ":CreaMailMsg:ID:" & ItemId)
    GetItemSOAP=ReadTemplate("GetItemMsg.xml")
    GetItemSOAP=Replace(GetItemSOAP, "<!--ITEMID-->", ItemId)   
    GetItemSOAP=Replace(GetItemSOAP, "<!--ITEMCHANGEKEY-->", ChangeKey)
    LogFile.WriteLine (Now() & ":GetItemSOAP:" & GetItemSOAP) 

    set GetItemResponse=SendSOAP(GetItemSOAP,TARGETURL,"",USERNAME,PASSWORD)
    ' Check we got a Success response
    if not IsResponseSuccess(GetItemResponse, "m:GetItemResponseMessage","ResponseClass") then
        LogFile.WriteLine (Now() & "-" & ":ERRORE:Fallita GetItemMsg:" & GetItemResponse.xml)
        Chiusura 1
    end if

'   LogFile.WriteLine (Now() & "-" & ":DEBUG:riuscita GetItemMsg:" & GetItemResponse.xml)
    Content = GetItemResponse.documentElement.getElementsByTagName("t:MimeContent").Item(0).Text
'   LogFile.WriteLine (Now() & ":Contenuto MIME" & Content)

    CreaMailMsg = WriteAttach2File(Content,"OriginaryMsg.eml")

'   MailMsg.close
    CreaMailMsg = true
end function
'###########################################################################
' These are the functions the save the message in .eml format
'###########################################################################
function WriteAttach2File(Content,nomeAttach)
Dim oNode,oXML,Base64Decode
    ' Read the contents Base64 encoded and Write a file  
    set oXML=CreateObject("MSXML2.DOMDocument")
    set oNode=oXML.CreateElement("base64")
    oNode.DataType="bin.base64"
    oNode.Text = Content
    Base64Decode = Stream_Binary2String(oNode.nodeTypedValue,nomeAttach)
    Set oNode = Nothing
    Set oXML = Nothing
end function
'###########################################################################
function Stream_Binary2String(binary,nomeAttach)
    Const adTypeText = 2
    Const adTypeBinary = 1
    Dim BinaryStream

    Set BinaryStream=CreateObject("ADODB.Stream")
    BinaryStream.Type=adTypeBinary' Binary
    BinaryStream.Open
    BinaryStream.Write binary   
    BinaryStream.Position=0
    BinaryStream.Type=adTypeText
    BinaryStream.CharSet = "us-ascii"
    Stream_Binary2String=BinaryStream.ReadText
    'msgbox Stream_Binary2String
    BinaryStream.SaveToFile ShareName & "\" & nomeAttach,2

    Set BinaryStream=Nothing
end function
0
user2270629

EWS APIとC#を使用して、すべての添付ファイルをダウンロードできます。以下に例を示します。

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++;
            }
        }
    }
}

上記のコードは、すべての添付ファイルをバイトに変換します。バイトを取得したら、バイトを必要な形式に変換できます。バイトをファイルに変換してディスクに保存するには、以下のリンクに従ってください。 ファイルにバイトを書き込むhttp://www.digitalcoding.com/Code-Snippets/C-Sharp/C- Code-Snippet-Save-byte-array-to-file.html

0
Tapash

OutlookのEntryIDからVSTO(16進数)を介してEwsIDに移行する場合は、ここを確認する必要があります。 http://bernhardelbl.wordpress.com/2013/04/15/converting-entryid-to-ewsid-using -exchange-web-services-ews /

助かりました。 「データが壊れています」というメッセージが繰り返し表示されました。メッセージ。

0