Получение контактов Outlook через Python
Я пытаюсь получить контакты из Outlook
с помощью Python
, Код является:
import win32com.client
import pywintypes
o = win32com.client.Dispatch("Outlook.Application")
ns = o.GetNamespace("MAPI")
profile = ns.Folders.Item("Outlook")
contacts = profile.Folders.Item("Contacts")
но это дает ошибку, как это:
Traceback (most recent call last):
File "my_pro.py", line 7, in <module>
profile = ns.Folders.Item("Outlook")
File "C:\DOCUME~1\Manoj\LOCALS~1\Temp\gen_py\2.7\00062FFF-0000-0000-C000-00000
0000046x0x9x3\_Folders.py", line 70, in Item
ret = self._oleobj_.InvokeTypes(81, LCID, 1, (9, 0), ((12, 1),),Index
pywintypes.com_error: (-2147352567, 'Exception occurred.', (4096, u'Microsoft Of
fice Outlook', u'The operation failed. An object could not be found.', None, 0,
-2147221233), None)
Я не могу понять, почему это ошибка, потому что у меня есть профиль с именем Outlook
Спасибо
5 ответов
Здесь существует рецепт Python для чтения контактов из внешнего вида. Надеюсь, это будет полезно. Он использует GetDefaultFolder вместо функции Folders.Item.
http://code.activestate.com/recipes/173216-import-outlook-contacts-using-win32com/
Вероятно, у вас нет профиля с именем "Outlook" (если вы его не создали)
Обычно "Имя профиля" - это имя, данное папке верхнего уровня, в которой находится "Входящие". Как и в "Личных папках"
- Этот параметр работает для извлечения контактов, когда Outlook подключен к серверу Exchange.
- Мне удалось найти / изменить рабочее решение. Он сохраняет адреса электронной почты и полные имена всех ваших контактов в Outlook в виде списка:
import win32com.client
# Outlook stuff
outApp = win32com.client.gencache.EnsureDispatch("Outlook.Application")
outGAL = outApp.Session.GetGlobalAddressList()
entries = outGAL.AddressEntries
# Empty list to store contact info
data_set = list()
# Iterates through your contact book and extracts/appends them to a list
for entry in entries:
if entry.Type == "EX":
user = entry.GetExchangeUser()
if user is not None:
if len(user.FirstName) > 0 and len(user.LastName) > 0:
row = list()
row.append(user.FirstName)
row.append(user.LastName)
row.append(user.PrimarySmtpAddress)
"""print("First Name: " + user.FirstName)
print("Last Name: " + user.LastName)
print("Email: " + user.PrimarySmtpAddress)"""
data_set.append(row)
# Prints list
print(data_set)
Исходный код:https://www.excelcise.org/getting-information-from-outlook-global-address-list-gal-with-python/
- Эта опция работает для извлечения контактов из
Outlook.pst
файл, а не сервер Exchange.- См. Этот ответ для извлечения контактов из глобального списка адресов на сервере Exchange.
- Для этого необходимо, чтобы Outlook был установлен в Windows, но не запущен.
- Протестировано с Python 3.8, Windows 10, Outlook Office 365
- Однажды
contacts_items
объект создан, используйте соответствующийProperty
для извлечения желаемой информации.- Имеется в наличии <tcode id="270155"></tcode> за <tcode id="270156"></tcode>
- Я заметил это
outlook.Application.Quit()
не закрывает Outlook, поэтому может потребоваться закрыть его в диспетчере задач.
import win32com.client
# create outlook object
outlook = win32com.client.Dispatch("Outlook.Application")
ns = outlook.GetNamespace("MAPI")
# create an object for the contacts in the default folder
contacts_items = ns.GetDefaultFolder(10).Items
# print name and email address
for c in contacts_items:
print(f'{c.FullName}: {c.Email1Address}')
# create a dict of contacts
contacts = {c.FullName: c.Email1Address for c in contacts_items}
# close the application
outlook.Application.Quit()
- Следующий код взят из Импортировать контакты Outlook с помощью win32com , но был обновлен для python 3.8
MSOutlook Class
import win32com.client
DEBUG = 0
class MSOutlook:
def __init__(self):
self.outlookFound = 0
try:
self.oOutlookApp = \
win32com.client.gencache.EnsureDispatch("Outlook.Application")
self.outlookFound = 1
except:
print("MSOutlook: unable to load Outlook")
self.records = []
def loadContacts(self, keys=None):
if not self.outlookFound:
return
# this should use more try/except blocks or nested blocks
onMAPI = self.oOutlookApp.GetNamespace("MAPI")
ofContacts = \
onMAPI.GetDefaultFolder(win32com.client.constants.olFolderContacts)
if DEBUG:
print(f"number of contacts: {len(ofContacts.Items)}")
for oc in range(len(ofContacts.Items)):
contact = ofContacts.Items.Item(oc + 1)
if contact.Class == win32com.client.constants.olContact:
if keys is None:
# if we were't give a set of keys to use
# then build up a list of keys that we will be
# able to process
# I didn't include fields of type time, though
# those could probably be interpreted
keys = []
for key in contact._prop_map_get_:
if isinstance(getattr(contact, key), (int, str, unicode)):
keys.append(key)
if DEBUG:
keys.sort()
print("Fields\n======================================")
for key in keys:
print(key)
record = {}
for key in keys:
record[key] = getattr(contact, key)
if DEBUG:
print(oc, record['FullName'])
self.records.append(record)
Использование класса
if DEBUG:
print("attempting to load Outlook")
oOutlook = MSOutlook()
# delayed check for Outlook on win32 box
if not oOutlook.outlookFound:
print("Outlook not found")
sys.exit(1)
fields = ['FullName',
'CompanyName',
'MailingAddressStreet',
'MailingAddressCity',
'MailingAddressState',
'MailingAddressPostalCode',
'HomeTelephoneNumber',
'BusinessTelephoneNumber',
'MobileTelephoneNumber',
'Email1Address',
'Body'
]
if DEBUG:
# import time
print("loading records...")
startTime = time.time()
# you can either get all of the data fields
# or just a specific set of fields which is much faster
#oOutlook.loadContacts()
oOutlook.loadContacts(fields)
if DEBUG:
print(f"loading took {time.time() - startTime} seconds")
print(f"Number of contacts: {len(oOutlook.records)}")
for i in range(len(oOutlook.records)):
print(f"Contact: {oOutlook.records[i]['FullName']}")
print(f"Body:\n{oOutlook.records[i]['Body']}")
Если вы используете python 3.9 и выше и вас интересуют только адреса электронной почты, достаточно следующего.
import win32com.client
outlook = win32com.client.gencache.EnsureDispatch("Outlook.Application")
addresses = outlook.Session.GetGlobalAddressList().AddressEntries
mails = [
user.PrimarySmtpAddress for x in addresses
if (user := x.GetExchangeUser()) is not None
]
print(mails)