2011-10-04 49 views
0

我正在使用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时,即使打开之前标记为蓝色类别的邮件,类别也不会显示。不过,只要我关闭并打开展望,我就可以添加一个旗帜。请提出问题

回答

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();