web-dev-qa-db-ja.com

Outlookの.msgファイルを読む

Outlook .msgファイルを読み取る唯一の方法(件名、添付ファイルなどの追加のメタデータを取得するため)は、Outlook API(Application.Session.OpenSharedItem()メソッド)を使用することだと思います。

この場合、MSOFficeまたはMSOutlookがインストールされていないアプリケーションサーバーでこのコードを実行する方法を探しています。エラーが発生します

System.ArgumentException: progId not found. Outlook.Application

もちろん、これはOutlookアプリケーションがないためです。

OpenSharedItemメソッドを機能させるためにDLLなどをインストールする方法はありますか?可能であれば、完全なクライアントをインストールする必要はありません。

または、Outlookなどの重要な依存関係を必要とせずに.msgファイルを解析する方法はありますか?

10
Simon Green

これは私がずっと前から保存したcodeplexの記事で答えられました

記事は ここ 、Outlookモデルを必要としないOutlookStorage.csというファイルがあります。

以下のコメントのように、これをカバーするnugetパッケージがあります。

ここ

このためのコメントでサイモングリーンへの小道具。

11
krystan honour

MSG .NET は、.NETFramework用のMicrosoftOutlook.msgファイルAPIです。 APIを使用すると、.msgファイルなどを簡単に作成/読み取り/解析/変換できます。 APIを機能させるために、MicrosoftOutlookをマシンまたはその他のサードパーティのアプリケーションやライブラリにインストールする必要はありません。

1
MillGram

これがメッセージファイルの添付ファイルを読み取るための解決策です

 try
                {
                    if (fileInfo.Extension.ToLower().Equals(".msg"))
                    {
                        string referenceNumber = "";
                        if (char.IsDigit(fileInfo.Name.First()))
                        {
                            referenceNumber = new string(fileInfo.Name.SkipWhile(c => !char.IsDigit(c)).TakeWhile(char.IsDigit).ToArray());
                        }
                        using (var stream = File.Open(fileInfo.FullName, FileMode.Open, FileAccess.Read))
                        {
                            using (var message = new Storage.Message(stream))
                            {
                                foreach (Storage.Attachment attachment in message.Attachments.OfType<Storage.Attachment>())
                                {

                                    if (attachment.IsInline)
                                        continue; //no need to uncompress inline attqach


                                    string opFilename = (referenceNumber.Trim().Length > 0) ? string.Format("{0}\\{1}_{2}", fileInfo.Directory.FullName, referenceNumber, attachment.FileName) : string.Format("{0}\\{1}_{2}", fileInfo.Directory.FullName, RandomString(3), attachment.FileName);
                                    File.WriteAllBytes(opFilename, attachment.Data);

                                }
                            }
                        }

                    }
                }
                catch (Exception ex)
                {
                    _log.ErrorFormat("{0} Unable to convert  msg file: {1}.", fileInfo.Name, ex.Message);
                }

以下のライブラリが使用されます

msgReader.Outlookを使用する;上記のdllをインストールするには、nugetパッケージマネージャーに移動して実行します

Install-Package MSGReader
0
makdu

あなたもすることができます

  1. MSGファイルを明示的に解析します(形式は 文書化 )。

  2. 拡張MAPI(C++またはDelphiのみ)を スタンドアロンバージョンのMAPI と一緒に使用します。ルックアップ OpenIMsgOnIStg MSDNの関数。

  3. 使用 償還 (MAPIシステムが必要-Outlookまたは スタンドアロンバージョンのMAPI インストールする必要があります-そしてその RDOSession .GetMessageFromMsgFile方法:

set Session = CreateObject("Redemption.RDOSession")
set Msg = Session.GetMessageFromMsgFile("c:\temp\temp.msg")
MsgBox Msg.Body