如何获得outlook Express地址簿的文件夹名

转载 2006年06月22日 11:02:00

[Note]

1. Wab中并不在每条记录信息里保存这个文件夹名
2. IDistList并不是文件夹信息,而是分组信息。
3. 方法:先取每个文件夹的EntryID及文件夹名,再通过这个EntryID去得到这个文件夹所属的Container.再遍历Container Table得到Table中的所有记录。
4. 这个方法有个缺点,没办法读取share folder里的记录。

// 读取Outlook Express通讯薄内容(文件夹、名字、EMAIL)
void CGetEmailDlg::OnOK()
{
 HRESULT hRes;
 LPADRBOOK lpAdrBook;
 LPWABOBJECT lpWABObject;

 DWORD Reserved2 = NULL;

 HINSTANCE hinstLib;
 hinstLib = LoadLibrary("C://Program Files//Common Files//System//wab32");
 fWABOpen procWABOpen;
 WAB_PARAM wp = {0};
 wp.cbSize = sizeof(WAB_PARAM);
 
 // Only want to deal with "Main Identity's Contacts"
 wp.ulFlags = WAB_ENABLE_PROFILES; //设置这个值的话,表示只取当前的标识wab.去除share folder
 
 if (hinstLib != NULL)
 {
  // 获取"Wab32.dll"内部涵数WABOpen的进程地址
  procWABOpen = (fWABOpen) GetProcAddress(hinstLib, "WABOpen");

  if (procWABOpen != NULL)
  {
   hRes = (procWABOpen)(&lpAdrBook,&lpWABObject,&wp,Reserved2);
   _ASSERTE(hRes == S_OK);
   if (hRes != S_OK) exit(1);

   ULONG lpcbEntryID;
   ENTRYID *lpEntryID;
   hRes = lpAdrBook->GetPAB(
    &lpcbEntryID,
    &lpEntryID
   );
   

   _ASSERTE(hRes == S_OK);
   if (hRes != S_OK) exit(2);
   
   ULONG ulFlags = MAPI_BEST_ACCESS;
   ULONG ulObjType = NULL;
   LPUNKNOWN lpUnk = NULL;
   hRes = lpAdrBook->OpenEntry(
    lpcbEntryID,
    0,   //将这个值设为0的话,取得的将是wab中的所有目录。如果是设为&lpEntryID,则取得的是所有的联系人记录项
    NULL,
    ulFlags,
    &ulObjType,
    &lpUnk
   );

   ulFlags = WAB_LOCAL_CONTAINERS;  //这里ulFlags如果设为WAB_PROFILE_CONTENTS,则表示在container里获取所有的记录。造成每个folder里读取出来的记录都是全部记录 
//   ulFlags = WAB_PROFILE_CONTENTS;   
   if (ulObjType == MAPI_ABCONT)
   {
    IABContainer *lpContainer = static_cast <IABContainer *>(lpUnk);
    
    LPMAPITABLE lpTable = NULL;
    hRes = lpContainer->GetHierarchyTable(CONVENIENT_DEPTH,&lpTable);//从container中取得table,这里的table保存了文件夹信息
//    hRes = lpContainer->GetContentsTable(ulFlags,&lpTable);
    _ASSERT(lpTable);
    ULONG ulRows;
    hRes = lpTable->GetRowCount(0,&ulRows);//第1个参数为保留参数。固定为0
    _ASSERTE(hRes == S_OK);
    SRowSet *lpRows;

    hRes = lpTable->QueryRows(
     ulRows,  // 获取所有行
     0,
     &lpRows
    );

    m_ListEmail.ResetContent();
 
    SRow *lpRow = NULL;
    SPropValue *lpProp = NULL;
    BOOL bNotFolder = FALSE;
    IABContainer *lpContainer2 = NULL;
    LPENTRYID lpEID;
    ULONG cbEID;
    for(ULONG i=0;i<lpRows->cRows;i++)
    {
     bNotFolder = FALSE;
     lpRow = &lpRows->aRow[i];
     CString strTemp=_T("");
     CString strM = _T("");
     CString strFolderName = _T("");
     
     for(ULONG j=0;j<lpRow->cValues;j++)
     {
      lpProp = &lpRow->lpProps[j];
      if (lpProp->ulPropTag == PR_DISPLAY_NAME_A)
       strFolderName = strFolderName +"目录: " + (char *)lpProp->Value.lpszA;

      if (lpProp->ulPropTag == PR_ENTRYID)
      {
       lpEID = (LPENTRYID)lpProp->Value.bin.lpb;
       cbEID = lpProp->Value.bin.cb;
      }
      if (lpProp->ulPropTag == PR_DEPTH)
      {
       if(lpProp->Value.l ==0)
       {
        bNotFolder = TRUE;
        break;
       }
      }      
     }
     if(bNotFolder)
      continue;
     hRes = lpContainer->OpenEntry(
      cbEID,
      lpEID,
      NULL,
      ulFlags,
      &ulObjType,
      (LPUNKNOWN *)&lpContainer2
      );
     LPMAPITABLE lpTable2 = NULL;
     
     hRes = lpContainer2->GetContentsTable(ulFlags,&lpTable2);
     ULONG ulRows2;
     
     hRes = lpTable2->GetRowCount(0,&ulRows2);
     SRowSet *lpRows2;
     
     hRes = lpTable2->QueryRows(
      ulRows2,  // 获取所有行
      0,
      &lpRows2
      );
     for(ULONG i=0;i<lpRows2->cRows;i++)
     {
      SRow *lpRow2 = &lpRows2->aRow[i];
      CString strEmail=_T("");
      CString strName=_T("");
      for(ULONG j=0;j<lpRow2->cValues;j++)
      {
       SPropValue *lpProp2 = &lpRow2->lpProps[j];
       if (lpProp2->ulPropTag == PR_EMAIL_ADDRESS_A)
        strEmail = strEmail +" Email: " + (char *)lpProp2->Value.lpszA;
       if (lpProp2->ulPropTag == PR_DISPLAY_NAME_A)
        strName = strName +" Name: " + (char *)lpProp2->Value.lpszA;
       
      }
      strTemp = strFolderName + strName + strEmail;
      m_ListEmail.AddString(strTemp);
      lpWABObject->FreeBuffer(lpRow2);
     }
     lpWABObject->FreeBuffer(lpRows2);
     lpWABObject->FreeBuffer(lpRow);
    }
    lpWABObject->FreeBuffer(lpRows);
   }
  }
  FreeLibrary(hinstLib);
 }
}

恢复Outlook Express目录结构

前段时间因办公区域停电,导致某台电脑的Outlook Express出现问题,具体故障如下:该用户原Outlook Expess的"收件箱"下面建立有多个子文件夹,并建立有多个邮件规则进行收件处理。断...
  • SuperITPro
  • SuperITPro
  • 2012年10月22日 10:45
  • 576

Outlook Express和Outlook之间发送附件无法显示的问题

连续接到USER反映,更改为outlook发送邮件后,很多user反映接收不到附件,而且大多接收端为Outlook Express,使用webmail进入后检查发现: 附件 1: winmail...
  • u014461454
  • u014461454
  • 2014年03月31日 17:54
  • 1178

outlook express导出邮件规则

开始---运行---输入”regedit”---进入注册表,找到以下内容:[HKEY_CURRENT_USER/Identities/{F2516078-8D9E-4E9A-A686-C0E92BEE...
  • lidane03
  • lidane03
  • 2006年12月19日 11:36
  • 1615

谈谈OAB离线地址簿无法更新问题?(服务器是Exchange 2007和Exchange 2010)

最近比较多的人问到一个问题。我为什么在客户端勾选缓存模式就没有办法查看到我最近更新的人? 而且如果我去掉了缓存模式则没有问题,当我勾选了缓存模式则没有太大问题,而且Outlook 2003 不会出现...
  • fogyisland2000
  • fogyisland2000
  • 2012年10月22日 11:57
  • 10145

在win7系统中安装 Outlook Express

在win7系统中安装 Outlook Express,Protected Storage service 替换为 writable version。
  • dyeDeny
  • dyeDeny
  • 2015年02月05日 18:00
  • 2493

恢复foxmail中丢失的地址簿

以前foxmail的邮件放在D:/My Documents里面。安装一些其它工具的时候路径中的空格会导致一些问题,于是把文件夹重命名为MyDocuments,但是打开foxmail以后,以前的邮箱账号...
  • jcwKyl
  • jcwKyl
  • 2008年10月17日 10:00
  • 12465

outlook express 邮件导入 outlook

Microsoft Outlook Express 是一种 Microsoft Internet Explorer 附带的免费的基本电子邮件程序。您可以将 Outlook Express 中的电子邮件...
  • jin_yw
  • jin_yw
  • 2012年12月24日 13:21
  • 1869

XP中重新安装Outlook Express

(声明:魏滔序原创,转贴请注明出处。)1.删除Outlook目录下的所有exe和dll文件2.在Windows目录中有一个隐藏的inf文件夹,其中有一个msoe5.inf安装文件,右键鼠标选择安装,按...
  • Modest
  • Modest
  • 2007年04月17日 10:25
  • 3397

如何备份和还原Outlook Express 的邮件规则

1、备份:如下图所示,按照以下路径右击mail选择导出存为一个注册表类型文件。   2、还原:用记事本打开此文件,并选择编辑-----替换,弹出如下图所示对话框。 3、“查找内容”为...
  • jiawei836
  • jiawei836
  • 2010年04月18日 16:28
  • 2683

outlook Express 邮件自动回复功能

        Outlook Express是一个功能十分强大的邮件收发软件,它具有自动回复邮件的功能。使用自动回复功能的操作步骤如下:打开一个“记事本”文件,在其中输入邮件回复的内容,将这个文件保...
  • linuxshine
  • linuxshine
  • 2007年09月24日 15:17
  • 3133
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如何获得outlook Express地址簿的文件夹名
举报原因:
原因补充:

(最多只允许输入30个字)