如何读取Outlook下某个联系人组的联系人信息(300分)

  • 主题发起人 主题发起人 Avalon
  • 开始时间 开始时间
A

Avalon

Unregistered / Unconfirmed
GUEST, unregistred user!
注意: 是某个联系人组 !!!!!!
 
uses ComObj;
//DistName: 联系人组名称
procedure GetDistMembers(const DistName: string);
const
olFolderContacts = $0000000A;
olDistributionList = $00000045;
var
olapp, oldl, olrp: OleVariant;
i: Integer;
begin
try
olapp := CreateOleObject('Outlook.Application');
oldl := olapp.GetNameSpace('MAPI').GetDefaultFolder(olFolderContacts).Items[DistName];
if oldl.Class = olDistributionList then
for i := 1 to oldl.MemberCount do
begin
olrp := oldl.GetMember;
ShowMessage('name: ' + olrp.Name + #13#10 + 'e_mail: ' + olrp.Address);
end;
finally
oldl := Unassigned;
olapp := Unassigned;
end;
end;
注:由于 OutLook 对用户信息进行了保护,访问中可能会出现提示框。
 
如果我想获取这个联系人的扩展信息 比如家庭电话呢??
 
现在得点分真不容易~~。
老兄似乎对通信组(您所说的联系人组)的概念不是特别清楚:通信组只是一个电子邮件地址列表(它的作用就是为了方便发邮件,如果您的联系人没有邮件地址,根本不让加到通信组里),不包含任何其他内容(如电话、住址、传真);它的条目有两种:一种来自已有的联系人,一种仅仅是电子邮件地址。
您想读取联系人的扩展信息当然对电子邮件地址类的 DistListItem 不起作用,因此必须区别对待;至于联系人的扩展信息在 DistListItem 显然找不到,必须到 ContactItem 中去找。下面是我应您所求改完的一段代码:
procedure GetDistListMembers(const DistListName: string);
const
olFolderContacts = $0000000A;
olDistributionList = $00000045;
Return = #13#10;
var
olapp, olcf, oldl, olae, olci: OleVariant;
i: Integer;
s: string;
begin
try
olapp := CreateOleObject('Outlook.Application');
olcf := olapp.GetNameSpace('MAPI').GetDefaultFolder(olFolderContacts);
oldl := olcf.Items[DistListName];
if oldl.Class = olDistributionList then
for i := 1 to oldl.MemberCount do
begin
olae := oldl.GetMember.AddressEntry;
s := '显示名称: ' + olae.Name + Return + '电子邮件地址: ' + olae.Address
+ Return + '电子邮件类型: ' + olae.Type;
olci := olcf.Items.Find('[Email1DisplayName] = ''' + olae.Name + '''');
if TVarData(olci).VDispatch <> nil then
s := s + Return + '邮编: ' + olci.MailingAddressPostalCode + Return +
'商务电话: ' + olci.BusinessTelephoneNumber + Return + '移动电话: ' +
olci.MobileTelephoneNumber;
ShowMessage(s);
end;
finally
oldl := Unassigned;
olcf := Unassigned;
olapp := Unassigned;
end;
end;
 
老兄误解了
我知道DistListItem通过GetMember方法或的是 Recipient对象
这也是仅仅电子邮件地址的对象

我的意思是通过对某个DistListItem包含的Recipient对象的读取 获得这些对象的对应的
ContactItem

Outlook显然是做到了这一点 不知道其是如何实现的
 
1、兄弟,您有没有看我给你写的代码啊?我不就是“通过对某个DistListItem包含的Recipient对象的读取 获得这些对象的对应的 ContactItem”么??拜托您运行一下。
2、我没误解您,大概是您没看明白。Recipient 和 ContactItem 的联系纽带就是: Recipient.AddressEntry.Name = ContactItem.Email1DisplayName(姓名的电子邮件显示),我是通过 Items 的 Find 方法进行查找的,如果您对 Items.Find 方法不熟的话请看 OutLook 的帮助;另外不是 DistListItem 下所有成员都能获得扩展信息,您通过点击“添加新成员”创建的那种就不行(不要勾选“添加到联系人”),对于这种 Recipient 在 ContactItem 中显然找不到对应项,因此需要用 TVarData(olci).VDispatch <> nil 来判断是否可以获取扩展信息。
3、OutLook 怎样实现的你我都不可能知道(OutLook 可以调用底层函数,我不能),他爱怎么实现就怎么实现,反正我们实现了。
4、老兄熟知 OutLook 的对象结构,那我就不用多说了。能用的话请结贴,不能用也告诉俺一声。
 
楼上的是Outlook牛人啊 怪我接触VBA时间太少 只能对着Outlook VBA 的帮助查 所以不知道AddressEntry的对应关系
感谢不吝赐教
谢谢了

你在 http://www.delphibbs.com/delphibbs/dispq.asp?lid=3153410
的用法是我现在用的 因为是那个是用vb写的

麻烦楼主有时间 把我那些陈年老题一并回答了吧 呵呵
 
后退
顶部