2015-08-25 1 views
1

J'ai une liste de noms, certains d'entre eux complets, certains tronqués. Je voudrais rechercher la recherche dans la liste d'adresses Outlook pour ces noms.Comment rechercher un nom dans la liste d'adresses globale Outlook (2010)?

Le plus proche, je suis venu est ce code Python which came from ActiveState Code, mais il ne recherche pas les adresses globales, seulement ma liste (locale?), Qui a 3 adresses dedans, ce qui n'est évidemment pas correct. Il devrait y avoir des milliers d'enregistrements.

Tous les conseils sont les bienvenus. J'ai googlé et lu des dizaines de pages, mais rien de concluant. Je préfère ne pas me connecter au LDAP directement, je pense que c'est une violation de politique dans mon organisation et d'ailleurs je ne suis pas sûr que ce soit possible. Aimerait le faire via l'API Outlook si possible.

DEBUG=1 

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("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) 

liens au hasard:

Si quelqu'un peut trouver une solution que je ne me dérange pas si c'est C++, VB, Perl, Python, etc.

+0

Donc ce que vous avez fait jusqu'à présent pour résoudre ce problème est de trouver une vieille pile solution de débordement que vous pensez être proche et le renvoyer dans une autre question, dans l'espoir que quelqu'un écrira le code pour vous. Avez-vous réellement écrit * any * code et avez-vous un problème * spécifique *? – Borodin

Répondre

3

Votre code ci-dessus traite des contacts dans le dossier Contacts par défaut. Si vous voulez vérifier si un nom donné est dans Outlook (en tant que contact ou en liste d'adresses globale), appelez simplement Application.Session.CreateRecipient suivi de Recipient.Resolve. Si l'appel renvoie true, vous pouvez lire le Recipient.Address et diverses autres propriétés.

+1

Je suis honoré par votre présence! J'ai essayé OutlookSpy, mais je ne pouvais pas comprendre comment l'utiliser. Mais je suis sûr que c'est très puissant, on dirait qu'il peut tout traverser. Je vais essayer votre suggestion maintenant. –

+0

Aucune idée de la raison pour laquelle vous avez obtenu un downvote ici, votre réponse était exactement au point. –

3

Problème résolu!

Merci à Dmitry'sanswers je pouvais produire ce code Python minimal qui démontre ce que je voulais réaliser:

from __future__ import print_function 
import win32com.client 

search_string = 'Doe John' 

outlook = win32com.client.gencache.EnsureDispatch('Outlook.Application') 
recipient = outlook.Session.CreateRecipient(search_string) 
recipient.Resolve() 
print('Resolved OK: ', recipient.Resolved) 
print('Is it a sendable? (address): ', recipient.Sendable) 
print('Name: ', recipient.Name) 

ae = recipient.AddressEntry 
email_address = None 

if 'EX' == ae.Type: 
    eu = ae.GetExchangeUser() 
    email_address = eu.PrimarySmtpAddress 

if 'SMTP' == ae.Type: 
    email_address = ae.Address 

print('Email address: ', email_address)