星期四, 四月 02, 2009

★从Outlook地址簿中导出联系人的所有资料(非WAB格式导出)

现在要完成一个能从Outlook地址簿中导出联系人资料的程序,注意,不是从Windows附件里的那个地址簿软件导出(这个已经现实了),而是Outlook。目前只能导出
联系人的姓名和Email地址,其它项都还找不到导出接口。
我用的是OutlookApplication组件来做的,
查MSDN时,outlook的SDK有个类AddressEntry中包含Item这个属性,从MSDN中看出,可以通过这个属性来访问联系人资料中其它的所有字段,但不知道为什么,在CB包含的Outlook SDK的声明.h头文件AddressEntry类中根本找不到Item这个属性,为什么呢?我也不知道为什么啊,找了一个晚上,还是没找到原因,或者说其它可以访问联系人其它字段的方法,大家快来帮帮忙吧,我已经快要倒下了。

另外,在网上查资料的过程中,看到很多都是通过VBA来现实的,而且很方便,不知道从这点上大家有没有办法想出其它变通的办法。

问题顺利解决了的话,分数绝对不是问题,我有上万的可用分。

//---------------------------------------------------------
这是能读取Name和Email地址的代码:

先加窗口上加入OutlookApplication组件,该组件在Office2K组件页的最后面

_NameSpacePtr n;
AddressList * addlist;
AddressEntries * addentries;
n=OutlookApplication1->GetNamespace(WideString("MAPI"));
tagVARIANT t;
t.vt=VT_INT;
t.intVal=1;
addlist=n->AddressLists->Item(t);
addentries=addlist->AddressEntries;
AddressEntry * addentry;
if(addentries->Count>0)
addentry=addentries->GetFirst();
for(long i=0;iCount;i++)
{
ShowMessage( addentry->Name);
ShowMessage(addentry->Address);
addentry=addentries->GetNext();
}

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
看下面的代码,从我的程序中摘抄的。测试通过的。
#include

void __fastcall TFormTelBook::Action_ImportOutlookExecute(TObject *Sender)
{
_ApplicationPtr pApp;
_ItemsPtr pItems;
MAPIFolderPtr pFolder;
_ContactItemPtr pContact;

TelItem tItem;
memset(&tItem,0,sizeof(TelItem));
tItem.Sex = 2;

HRESULT hr;

if (bSysDB)
{
if (MessageBox(Handle,"您确定要导入到企业通讯录吗?\n建议导入个人通讯录!个人通讯录会显示在主界面中。\n请在左边的组别中选择导入组别。",Application->Title.c_str(),MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2|MB_SETFOREGROUND)!=IDYES)
{
return;
}
}

try
{
hr=pApp.CreateInstance(CLSID_OutlookApplication);
if (FAILED(hr))
{
MessageBox(Handle,"Outlook实例创建失败,请确认您安装了Outlook2000及以上版本!",Application->Title.c_str(),MB_ICONWARNING|MB_OK|MB_SETFOREGROUND);
return;
}

// 获取默认Outlook中联系人文件夹
pFolder=pApp->GetNamespace(WideString("MAPI"))->GetDefaultFolder(olFolderContacts);
if (int(pFolder)==NULL)
{
MessageBox(Handle,"没有发现默认的Outlook联系人文件夹!",Application->Title.c_str(),MB_ICONWARNING|MB_OK|MB_SETFOREGROUND);
return;
}
else // 否则自行选择Outlook中一指定文件夹
{
// pFolder=pApp->GetNamespace(WideString("MAPI"))->PickFolder();
// if (int(pFolder)==NULL)
// return;
if (pFolder->get_DefaultItemType()!=olContactItem) // 不是联系人
{
MessageBox(Handle,"选择不是联系人文件夹",Application->Title.c_str(),MB_ICONINFORMATION|MB_OK|MB_SETFOREGROUND);
return;
}
}

pItems=pFolder->get_Items();
if (int(pItems)==0)
{
MessageBox(Handle,"不能得到联系人条目",Application->Title.c_str(),MB_ICONWARNING|MB_OK|MB_SETFOREGROUND);
return;
}

if (pItems->Count > 0)
{
MessageBox(Handle,("Outlook共有"+IntToStr(pItems->Count)+"联系人,Outlook可能会提示:\n\"有一个程序试图访问Outlook的电子邮件地址...\"\n请容许访问,以便导入联系人!").c_str(),Application->Title.c_str(),MB_ICONINFORMATION|MB_OK|MB_SETFOREGROUND);
}
int i = 0;

pContact=pItems->GetFirst();
MyShowProgress("正在导入:",true);
while(1)
{
if (int(pContact)==NULL) break;
i++;
MyDoProgress(i,pItems->Count);
if (gProgressBreak) //用户选择了取消操作
{
break;
}

tItem.TelID = -1;
tItem.FirstName = pContact->get_FullName();
tItem.Mobile = pContact->get_MobileTelephoneNumber();
try
{
tItem.Email = pContact->get_Email1Address();
}
catch(...)
{
MessageBox(Handle,"读取Email地址失败,导入失败!",Application->Title.c_str(),MB_ICONINFORMATION|MB_OK|MB_SETFOREGROUND);
break;
}
tItem.CorpName = pContact->get_CompanyName();
tItem.CorpAddr = pContact->get_BusinessAddress();
tItem.CorpDept = pContact->get_Department();
tItem.CorpPhone = pContact->get_BusinessTelephoneNumber();
tItem.CorpWeb = pContact->get_BusinessHomePage();
tItem.HomePhone = pContact->get_HomeTelephoneNumber();
tItem.HomeAddr = pContact->get_HomeAddress();
tItem.Birthday = TDateTime(pContact->get_Birthday()).FormatString("YYYYMMDD");
tItem.Web = pContact->get_WebPage();
// tItem.OtherName = pContact->get_Companies();
tItem.CorpZip = pContact->get_BusinessAddressPostalCode();
tItem.HomeZip = pContact->get_HomeAddressPostalCode();

if (!tItem.FirstName.IsEmpty())
{
if (bSysDB)
SysDM->AddTel(&tItem,int(tvGroup->Selected->Data));
else
UserDM->AddTel(&tItem,int(tvGroup->Selected->Data));
}
pContact=pItems->GetNext();
}

}
catch(Sysutils::Exception &e)
{
MessageBox(Handle,e.Message.c_str(),Application->Title.c_str(),MB_ICONWARNING|MB_OK|MB_SETFOREGROUND);
}
catch(...)
{
MessageBox(Handle,"导入失败!",Application->Title.c_str(),MB_ICONINFORMATION|MB_OK|MB_SETFOREGROUND);
}
ReflashTelBook(int(tvGroup->Selected->Data));
MyCloseProgress();
}