Com 向新邮件添加类别

Com 向新邮件添加类别,com,outlook,vsto,outlook-addin,Com,Outlook,Vsto,Outlook Addin,我正在使用COM创建VSTO 2007加载项。我的要求是将所有新邮件标记为蓝色类别。我在OnNewMailEx处理程序中有以下代码 HRESULT hrGetNewMail; _NameSpacePtr pMAPI = NULL; hrGetNewMail = spApp->GetNamespace((_bstr_t)GetStringFromTable(147),&pMAPI); if(FAILED(hrGetNewMail)) { if(spApp!=NULL)

我正在使用COM创建VSTO 2007加载项。我的要求是将所有新邮件标记为蓝色类别。我在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();
HRESULT hrGetNewMail;
_NameSpacePtr pMAPI=NULL;
hrGetNewMail=spApp->GetNamespace((bstr)GetStringFromTable(147)和pMAPI);
if(失败(hrGetNewMail))
{
如果(spApp!=NULL)
spApp.Release();
返回操作失败;
}
如果(spApp!=NULL)
spApp.Release();
CComBSTR EntryStoreID;
MAPIFolderPtr spMAPIFolder=NULL;
hrGetNewMail=pMAPI->GetDefaultFolder(olFolderInbox,&spMAPIFolder);
if(失败(hrGetNewMail))
{
如果(pMAPI!=NULL)
pMAPI.Release();
返回操作失败;
}
hrGetNewMail=spMAPIFolder->get\u StoreID(&EntryStoreID);
if(失败(hrGetNewMail))
{
if(spMAPIFolder!=NULL)
spMAPIFolder.Release();
如果(pMAPI!=NULL)
pMAPI.Release();
}
if(spMAPIFolder!=NULL)
spMAPIFolder.Release();
变体varEntryStoreID;
hrGetNewMail=EntryStoreID.CopyTo(&varEntryStoreID);
if(失败(hrGetNewMail))
{
返回操作失败;
}
IDispatch*SplatesMailItem;
hrGetNewMail=pMAPI->GetItemFromID(EntryID、varEntryStoreID和SplatesMailItem);
if(失败(hrGetNewMail))
{
如果(pMAPI!=NULL)
pMAPI.Release();
}
如果(pMAPI!=NULL)
pMAPI.Release();
CComQIPtr spMailItem;
hrGetNewMail=spLatestMailitem->QueryInterface(&spMailItem);
HRESULT hrCat=spMailItem->放置类别(_T(“蓝色类别”);
//spMailItem->put_FlagIcon(olRedFlagIcon);
hrCat=spMailItem->Save();

执行后,当我打开新邮件时,它会将类别显示为蓝色,但在收件箱中,它不会标记为任何类别。当我关闭并打开outlook时,即使在我打开之前标记为蓝色类别的邮件时,该类别也会消失。但是,我可以添加一个标志,每当我关闭和打开outlook时,该标志都会出现。请告诉我问题所在

如果主类别列表中不存在该类别,我认为它不会保留该类别。将类别添加到主类别列表中。有关更多信息,请参阅

此外,您的示例将覆盖任何现有类别。您应该检查是否已指定类别,如果已指定类别,请用逗号分隔现有值和要添加的值

var existingCategories = item.Categories;
if (string.IsNullOrWhiteSpace(existingCategories))
{
    item.Categories = "MyCategory";
}
else
{
    if (item.Categories.Contains("MyCategory") == false)
    {
        item.Categories = existingCategories + ", MyCategory";
    }
}
item.Save();