C# Outlook OpenSharedItem丢失用户属性

C# Outlook OpenSharedItem丢失用户属性,c#,outlook,outlook-addin,C#,Outlook,Outlook Addin,我试图在用户属性中存储一些数据,然后将邮件写入.msg文件,然后(稍后)重新加载.msg文件以读取用户属性 问题是:重新加载文件后,我没有任何用户属性了 我正在使用Outlook 2010 32位 下面是一段显示行为的代码: Outlook.MailItem originalItem=((MailItemWrapper)this.Item)。\u Item; var path=System.IO.path.GetTempFileName()+“.msg”; var propName=“Actio

我试图在用户属性中存储一些数据,然后将邮件写入.msg文件,然后(稍后)重新加载.msg文件以读取用户属性

问题是:重新加载文件后,我没有任何用户属性了

我正在使用Outlook 2010 32位

下面是一段显示行为的代码:

Outlook.MailItem originalItem=((MailItemWrapper)this.Item)。\u Item;
var path=System.IO.path.GetTempFileName()+“.msg”;
var propName=“ActionId123456789”;
//设置值为“test”的用户属性“ActionId”
var ps=originalItem.UserProperties;
var p=ps.Find(propName);
if(p==null)
p=ps.Add(propName,Outlook.OlUserPropertyType.olText,Type.Missing);
p、 Value=“测试”;
//保存到临时文件
originalItem.Save();//-->我也试过不用这条线
originalItem.SaveAs(路径);
//检查属性设置是否正确
p=originalItem.UserProperties[propName];
如果(p!=null)
Console.WriteLine(p.Value);//-->显示“测试”
//打开临时文件
Outlook.MailItem newItem=AddinModule.CurrentInstance.OutlookApp.Session.OpenSharedItem(路径)为Outlook.MailItem;
//检查该属性是否仍然存在
p=newItem.UserProperties[propName];
如果(p!=null)
Console.WriteLine(p.Value);//-->未执行:p为空!
有人知道怎么做吗

我没有使用
OpenSharedItem
,而是尝试使用
Process.Start
打开邮件,但在本例中,user属性也是null

顺便说一句,这段代码是一个测试示例,因此它不能正确地处理所有COM引用。

准确地描述了您的问题-用户属性没有保留在MSG中。我也经历了同样的行为

作为一种解决方法,我只是使用一个存储我的
MailItem
的用户属性,而不是将其导出到磁盘并将其带回

如果此解决方法不适用于您,您可能需要以这种方式访问用户属性,而不是将MSG导出到磁盘。

准确地描述了您的问题-用户属性未保留在MSG中。我也经历了同样的行为

作为一种解决方法,我只是使用一个存储我的
MailItem
的用户属性,而不是将其导出到磁盘并将其带回


如果此解决方案不适用于您,您可能需要以这种方式访问用户属性,而不是将消息导出到磁盘。

好的,我找到了一个似乎有效的解决方案。为此,我需要使用第三方:

解决方案是使用自定义MAPI属性,而不是UserProperties集合。在下面的代码中,“this.\u item”引用了获取/设置属性所需的Outlook.MailItem对象

为此,您需要一个Guid,该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;
}
就这样


警告:我还没有在实际情况下测试此代码,它只在与问题中发布的测试用例相同的测试用例中工作

好的,我找到了一个似乎有效的解决方案。为此,我需要使用第三方:

解决方案是使用自定义MAPI属性,而不是UserProperties集合。在下面的代码中,“this.\u item”引用了获取/设置属性所需的Outlook.MailItem对象

为此,您需要一个Guid,该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;
}
就这样


<强>警告< /强>:我还没有在实际情况下测试过这个代码,它只在同一个测试用例中,而不是在我的问题

中使用的一个例子。如果你使用C++或Delphi,你可以使用方法并直接打开MSG文件。p>
您还可以使用及其.GetMessageFromMsgFile-它直接打开MSG文件并允许您读取其所有用户属性

> P>如果使用C++或Delphi,可以使用方法并直接打开MSG文件。
您还可以使用及其.GetMessageFromMsgFile-它直接打开MSG文件并允许您读取其所有用户属性

谢谢你的帮助。与此同时,我还发现了这个链接,其中描述了发生的情况:不幸的是,您提出的两种解决方案都不可能实现,因为msg文件必须存储在专用服务器中。感谢您的帮助。同时,我还发现了这个链接,它描述了发生的情况:不幸的是,您提出的两种解决方案都不可能实现,因为msg文件必须存储在专用服务器中。