1

ユーザー プロパティにデータを保存し、メールを .msg ファイルに書き込み、(後で) .msg ファイルをリロードしてユーザー プロパティを読み取ろうとしています。

問題は、ファイルをリロードした後、ユーザー プロパティがなくなったことです。

Outlook 2010 32 ビットを使用しています

動作を示すコードは次のとおりです。

Outlook.MailItem originalItem = ((MailItemWrapper)this.Item)._item;

var path = System.IO.Path.GetTempFileName() + ".msg";
var propName = "ActionId123456789";

// Set a user property "ActionId" with value "test"
var ps = originalItem.UserProperties;
var p = ps.Find(propName);
if (p == null)
    p = ps.Add(propName, Outlook.OlUserPropertyType.olText, Type.Missing);
p.Value = "test";

// Save to a temp file
originalItem.Save(); // --> I also tried without this line
originalItem.SaveAs(path);

// Chech the the property is correctly set
p = originalItem.UserProperties[propName];
if (p != null)
    Console.WriteLine(p.Value); // ---> Show 'test'

// Open the temp file
Outlook.MailItem newItem = AddinModule.CurrentInstance.OutlookApp.Session.OpenSharedItem(path) as Outlook.MailItem;

// Check that the property still exists
p = newItem.UserProperties[propName];
if (p != null)
    Console.WriteLine(p.Value); // ---> Not executed: p is NULL !

誰かがこれを行う方法を知っていますか?

の代わりに を使っOpenSharedItemてメールを開こうとしProcess.Startたのですが、この場合は user プロパティも null です...

ところで、このコードはテスト サンプルであるため、disposeすべての COM 参照が適切に行われるわけではありません。

4

3 に答える 3

2

このフォーラムの投稿では、問題を正確に説明しています - User Properties are not persisted in MSG私も、2007 年に Microsoft によって変更された同じ動作を経験しました。

回避策として、非表示の Outlook フォルダーを使用MailItemして、ユーザー プロパティと共に保存し、ディスクにエクスポートして戻すのではありませんでした。

この回避策を実行できない場合は、MSG をディスクにエクスポートする代わりに、EWS を使用して共有メールボックスに保存し、その方法でユーザー プロパティにアクセスする必要があります。

于 2012-05-21T14:04:13.117 に答える
2

わかりました、うまくいくと思われる解決策を見つけました。このために、サードパーティを使用する必要があります: Redemption

解決策は、UserProperties コレクションではなく、カスタム MAPI プロパティを使用することです。以下のコードでは、「this._item」は、プロパティを取得/設定するために必要な Outlook.MailItem オブジェクトを参照します。

これを行うには、アドインで常に同じ Guid が必要です

private const string customPropId = "{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}";

プロパティを設定するには

public void SetCustomProperty(string propertyName, string propertyValue)
{
    var sfe = new SafeMailItem() { Item = this._item };
    var propId = sfe.GetIDsFromNames(customPropId, propertyName);
    sfe.set_Fields(propId, propertyValue);
}

プロパティを取得するには:

public string GetCustomProperty(string propertyName)
{
    var sfe = new SafeMailItem() { Item = this._item };
    var propId = sfe.GetIDsFromNames(customPropId, propertyName);

    var value = sfe.get_Fields(propId);
    if (value != null)
        return value.ToString();

    return null;
}

それでおしまい

警告: このコードはまだ実際の状況でテストしていません。質問に投稿されたものと同じテスト ケースでのみ機能します。

于 2012-05-25T08:17:53.680 に答える
0

C++ または Delphi を使用している場合は、OpenIMsgOnIStgメソッドを使用して、MSG ファイルを直接開くことができます。

また、 RedemptionとそのRDOSession .GetMessageFromMsgFileを使用することもできます。MSGファイルを直接開き、すべてのユーザー プロパティを読み取ることができます。

于 2014-09-11T21:17:27.560 に答える