C# Outlook OpenSharedItem丢失用户属性
我试图在用户属性中存储一些数据,然后将邮件写入.msg文件,然后(稍后)重新加载.msg文件以读取用户属性 问题是:重新加载文件后,我没有任何用户属性了 我正在使用Outlook 2010 32位 下面是一段显示行为的代码: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
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文件必须存储在专用服务器中。