我正在使用COM创建VSTO 2007 Addin。我的要求是将所有新邮件标记为蓝色类别。我在OnNewMailEx处理程序
中有以下代码HRESULT hrGetNewMail;
_NameSpacePtr pMAPI = NULL;
hrGetNewMail = spApp->GetNamespace((_bstr_t)GetStringFromTable(147),&pMAPI);
if(FAILED(hrGetNewMail))
{
if(spApp!=NULL)
spApp.Release ();
return OPERATION_FAILED;
}
if(spApp!=NULL)
spApp.Release ();
CComBSTR EntryStoreID;
MAPIFolderPtr spMAPIFolder = NULL;
hrGetNewMail = pMAPI->GetDefaultFolder (olFolderInbox, &spMAPIFolder);
if(FAILED(hrGetNewMail))
{
if(pMAPI!=NULL)
pMAPI.Release ();
return OPERATION_FAILED;
}
hrGetNewMail = spMAPIFolder->get_StoreID (&EntryStoreID);
if(FAILED(hrGetNewMail))
{
if(spMAPIFolder!=NULL)
spMAPIFolder.Release ();
if(pMAPI!=NULL)
pMAPI.Release ();
}
if(spMAPIFolder!=NULL)
spMAPIFolder.Release ();
VARIANT varEntryStoreID;
hrGetNewMail = EntryStoreID.CopyTo (&varEntryStoreID);
if(FAILED(hrGetNewMail))
{
return OPERATION_FAILED;
}
IDispatch* spLatestMailitem;
hrGetNewMail = pMAPI->GetItemFromID (EntryID,varEntryStoreID,&spLatestMailitem);
if(FAILED(hrGetNewMail))
{
if(pMAPI!=NULL)
pMAPI.Release ();
}
if(pMAPI!=NULL)
pMAPI.Release ();
CComQIPtr <Outlook::_MailItem> spMailItem;
hrGetNewMail=spLatestMailitem->QueryInterface(&spMailItem);
HRESULT hrCat = spMailItem->put_Categories(_T("Blue Category"));
//spMailItem->put_FlagIcon(olRedFlagIcon);
hrCat = spMailItem->Save();
执行后,当我打开新邮件时,它将该类别显示为蓝色,但在收件箱中未标记为任何类别。当我关闭并打开Outlook时,即使打开之前标记为蓝色类别的邮件,类别也会消失。但是每当我关闭并打开前景时,我都可以添加一个标志。请告诉我这个问题
答案 0 :(得分:1)
如果主类别列表中不存在该类别,我认为它不会保留它。将类别添加到主类别列表。有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/microsoft.office.interop.outlook.categories.aspx
此外,您的示例将覆盖任何现有类别。你应该检查是否已经指定了一个类别,如果是这样,你要用逗号分隔你想要添加的现有值和值。
var existingCategories = item.Categories;
if (string.IsNullOrWhiteSpace(existingCategories))
{
item.Categories = "MyCategory";
}
else
{
if (item.Categories.Contains("MyCategory") == false)
{
item.Categories = existingCategories + ", MyCategory";
}
}
item.Save();