Outlook2003 AddIN / 插件 移动邮件






1.44/5 (3投票s)
2007年5月10日
2分钟阅读

33871

691
当有新邮件到达收件箱时,AddIN 会将该邮件移动到收件箱内的特定文件夹。
引言
要阅读本文,您需要具备 Outlook AddIN 的基本知识。如果您是初学者,请阅读我的第一篇基础文章,它将对您有很大帮助 第一篇文章链接。Outlook AddIN 正在移动收件箱中未读标记的项目(邮件)到 Outlook 中的某个特定文件夹。AddIN 在接收新邮件时也会移动邮件,它会直接将项目移动到 Outlook 中的特定文件夹,而用户不知情。在 VB 中移动项目(邮件)非常容易,但在 vc++ 中则有些困难,因此我添加了这篇文章。
使用代码
您需要使用 regsvr32 "dll 完整路径" 命令注册 DLL。如果 DLL 注册成功,则启动 Outlook。每当您在收件箱中收到新邮件时,所有未读标记的邮件都将被移动到名为“Hide_By_Chaitanya”的文件夹,该文件夹由程序在 OnStartupComplete 中创建。然后程序会捕获新邮件事件。每当发生新邮件事件时,它会调用 OnNewMail 方法。该方法包含将未读标记的邮件从收件箱移动到 Hide_By_Chaitanya 文件夹的代码。
此代码有两个主要部分。
1. OnStartupComplete
Outlook::_Application *spApplication; spApplication = m_spApp; CComPtr <Outlook::_NameSpace> olNs; Outlook::MAPIFolder *spMapiFolderMove; Outlook::_Folders *spFolderMove; CComPtr <Outlook::MAPIFolder> spInboxFolder; //Start a MAPI Session // Taking session for doing activity on outlook spApplication ->get_Session(&olNs); olNs->GetDefaultFolder(olFolderInbox,&spInboxFolder); spInboxFolder->get_Folders(&spFolderMove); CComVariant varFolderType1("IPF.Note"); BSTR bstr_temp1(OLESTR("Hold_By_chaitanya")); //Name of folder spFolderMove->Add(bstr_temp1,varFolderType1,&spMapiFolderMove);代码的这一部分用于在 Outlook 的收件箱内创建新文件夹。
2. OnNewMail
IDispatch *pDisp; IDispatch *pDisptemp; CComPtr <Outlook::_NameSpace> olNs; CComPtr<Outlook::_Items> spItems; Outlook::_Items *spUnReadedItems; Outlook::_MailItem *spMailItem; Outlook::MAPIFolder *spMapiFolderMove; Outlook::_Folders *spFolderMove; CComPtr <Outlook::MAPIFolder> spInboxFolder; //Start a MAPI Session Outlook::_Application *spOutlookApp; ATLASSERT(spOutlookApp); spOutlookApp = m_spApp; // Taking session for doing activity on outlook spOutlookApp->get_Session(&olNs); long count; spMapiFolderMove = NULL; olNs->GetDefaultFolder(olFolderInbox,&spInboxFolder); spInboxFolder->get_Folders(&spFolderMove); spFolderMove->GetFirst(&spMapiFolderMove); spFolderMove->get_Count(&count); BSTR bstrCompare(OLESTR("Hold_By_chaitanya")); BSTR bstrCompare2; spMapiFolderMove->get_Name(&bstrCompare2); char* lpszText1 = _com_util::ConvertBSTRToString(bstrCompare); char* lpszText2 = _com_util::ConvertBSTRToString(bstrCompare2); HRESULT hr = NULL; int i=0; while(i<count) //strcmpi(lpszText1,lpszText2) != 0) { lpszText2 = _com_util::ConvertBSTRToString(bstrCompare2); if(strcmpi(lpszText1,lpszText2) == 0) break; spFolderMove->GetNext(&spMapiFolderMove); spMapiFolderMove->get_Name(&bstrCompare2); i++; } spInboxFolder->get_Items(&spItems); _bstr_t bstrUnReadCondition(OLESTR("[UnRead] = true")); spItems->Restrict(bstrUnReadCondition,&spUnReadedItems); // Now count is changed and it contains unreaded mail count spUnReadedItems->get_Count(&count); spUnReadedItems->GetFirst(&pDisp); // Initialzing spMail so that i will not corrupt spMailItem = NULL; pDisp = NULL; CComVariant tempInt(1); for(i=0;i<count;i++) { tempInt.lVal = i+1; spUnReadedItems->Item(tempInt,&pDisp); if(pDisp != NULL) { pDisp->QueryInterface(IID__MailItem,(void**)&spMailItem); if(spMailItem != NULL) { spMailItem->Move(spMapiFolderMove,&pDisptemp); } } }代码的这一部分用于将未读标记的邮件从收件箱移动到我们创建的文件夹。您还可以通过更改 BSTR 变量中的名称来更改文件夹名称。
关注点
您应该在网上搜索 outlookspy 并安装它,这可以帮助您了解有关 Outlook 的一些知识。
历史
如果您在理解方面遇到任何问题,您需要了解创建 Outlook AddIN 的基础知识。由于时间不足,我没有在此处包含 AddIN 创建的基本步骤。我建议您阅读我的第一篇文章 第一篇文章链接,其中包含基本内容和不同的链接,可以帮助您了解 Outlook AddIN 的创建基础知识。