CODE-使用Outlook VBA列出所有人員信箱

需求是這樣的,我想出一份清單,列出所有公司同仁的Email清單,以校正資料庫中的記錄是否有誤。爬了文,發現有好幾種做法可以實踐這個需求: ADSI、WebDAV、Get-GlobalAddressList PowerShell cmdlet...

PowerShell cmdlet應是Exchange 2007時代解決此類問題的王道,不過由於必須在Exchange主機上執行,得協調有管理權限的同事代勞。心念一轉,既然Outlook可以看得到全公司的人員信箱,就應可用程式取出來。

拼湊了一下,程式還挺好寫的: 取得"全域通訊清單"(Global Address List),列舉AddressEntry,透過GetExchangeUser()就能取得連絡人詳細資料就搞定了。

Sub ListGAL()
    Dim oGAL As AddressList
    Set oGAL = GetObject("", "Outlook.application").GetNamespace("MAPI") _
               .AddressLists.Item("全域通訊清單")
    Dim oEntry As AddressEntry, oExchUser As ExchangeUser
    Open "B:\AllEmailList.txt" For Output As #1
    For Each oEntry In oGAL.AddressEntries
        If oEntry.AddressEntryUserType = olExchangeUserAddressEntry Then
            Set oExchUser = oEntry.GetExchangeUser()
            Print #1, oExchUser.Alias; ","; 
            Print #1, oExchUser.name; ","; 
            Print #1, oExchUser.PrimarySmtpAddress
        End If
    Next
    Close #1
End Sub

另外還有件事值得一提: 用程式存取通訊錄時,Outlook會發出警示,需要人工點選放行,程式才能繼續。由於很多巨集病毒/蠕蟲都是用同樣的方式"盜取"通訊錄做壞事(電子時代,通訊錄的重要性不亞於清朝未年的"黨員名冊"呀!),這層安全鎖確有其必要性,大家平時看到,別糊里糊塗就按允許哦!

歡迎推文分享:
Published 08 May 2010 08:46 AM 由 Jeffrey
Filed under:
Views: 18,450



意見

# Iter said on 11 May, 2010 02:17 AM

  Set oGAL = GetObject("", "Outlook.application").GetNamespace("MAPI") _

              .AddressLists.Item("全域通訊清單")

運行到這個有exception,請問你用的是VS幾“?

# Jeffrey said on 11 May, 2010 11:02 PM

to lter, 範例為Outlook VBA,是寫在Outlook 2007裡的巨集程式

# 953904 said on 15 June, 2010 07:18 AM

你好,

我們公司有一個欄位名稱為"工號",抓不到此欄資料,感覺此欄並不是預設就有的欄位(註),像是公司內部自訂的資料欄位,要如何才能抓到此欄的資料呢?

註:我把全域通訊錄加入連絡人再匯出也是沒這個欄位資料.

Set oEntry = oGAL.AddressEntries.Item(9000)

Set oExchUser = oEntry.GetExchangeUser()

Debug.Print "Name:" & oExchUser.Name

Debug.Print "Alias:" & oExchUser.Alias

# Jenwei Chen said on 29 July, 2010 06:05 AM

Powershell 三行搞定,大家快來學 Powershell 吧!

$OUTLOOK = New-Object -ComObject "Outlook.application"

$C=$outlook.getnamespace("MAPI").AddressLists.Item("全域通訊清單").AddressEntries

$C|%{$_.GetExchangeUser() |select Name,PrimarySmtpAddress,BusinessTelephoneNumber,JobTitle}

# Jeffrey said on 29 July, 2010 08:27 AM

to Jenwei, PowerShell真是Exchange的好朋友呀! 謝謝分享~

# Jenwei Chen said on 29 July, 2010 08:45 PM

To Jeffrey : 也要感謝你先吧VBA寫出來,我才能用Powershell 依樣畫葫蘆~

# Joan said on 04 August, 2010 11:37 PM

outlook 2003 無法執行此行

oExchUser As ExchangeUser

請問outlook 2003是否也能抓取全域通訊清單呢?

謝謝

# 953904 said on 16 August, 2010 04:56 AM

Outlook 2003

以下只是範例:

Dim oOutlookApp As Outlook.Application

Dim oNamespace As Outlook.NameSpace

Dim oAddressLists As AddressList

Dim oAddressEntries As AddressEntries

Dim oAddressEntry As AddressEntry

Set oOutlookApp = New Outlook.Application

Set oNamespace = oOutlookApp.GetNamespace("MAPI")

Set oAddressLists = oNamespace.AddressLists(3)

Set oAddressEntries = oAddressLists.AddressEntries

For Each oAddressEntry In oAddressEntries

...

...

Next

也可以貼到excel裡的巨集。

# # said on 25 January, 2011 01:22 AM

如果沒有Exchange,可以使用規則再加入巨集嗎?

主要用意是想在Outlook寄信前檢查規則

# Jeffrey said on 25 January, 2011 09:34 AM

to #, 不太理解你所提規則與巨集的定義及用途,可能需要再解說得更明確詳細些,大家較好幫你看問題。

# Frank Sun said on 09 March, 2018 04:29 AM

非常感謝大大的文章,但我遇到了困難,想請教您:

我公司的全域通訊錄裡面有兩個不同成員,一塊是 @abc.com 也就是我所任職的公司,另外一塊是 @xxx.abc.com,兩塊只是不同的體系,但仍屬同一公司。@abc.com 是 outlook exchange user 沒有問題,@XXX.abc.com 在通訊錄秀出來的應該是非exchange 的架構,我找不到方法可把@XXX.abc.com的成員 抓出來,想請問您是否有解決方案呢?

打擾了 & 謝謝

你的看法呢?

(必要的) 
(必要的) 
(選擇性的)
(必要的) 
(提醒: 因快取機制,您的留言幾分鐘後才會顯示在網站,請耐心稍候)

5 + 3 =

搜尋

Go

<May 2010>
SunMonTueWedThuFriSat
2526272829301
2345678
9101112131415
16171819202122
23242526272829
303112345
 
RSS
創用 CC 授權條款
【廣告】
twMVC
最新回應

Tags 分類檢視
關於作者

一個醉心技術又酷愛分享的Coding魔人,十年的IT職場生涯,寫過系統、管過專案, 也帶過團隊,最後還是無怨無悔地選擇了技術鑽研這條路,近年來則以做一個"有為的中年人"自許。

文章典藏
其他功能

這個部落格


Syndication