2011-02-22 9 views
31

के माध्यम से पाइथन के साथ आउटलुक से ई-मेल पढ़ना मैं एक छोटा प्रोग्राम लिखने की कोशिश कर रहा हूं जो मेरे एक्सचेंज/आउटलुक प्रोफाइल पर किसी फ़ोल्डर के भीतर ई-मेल की सामग्री में पढ़ेगा ताकि मैं डेटा में हेरफेर कर सकूं। हालांकि मुझे अजगर और विनिमय/आउटलुक एकीकरण के बारे में अधिक जानकारी खोजने में समस्या आ रही है। बहुत सी चीजें या तो बहुत पुरानी हैं/इसमें कोई दस्तावेज़ नहीं है/समझाया नहीं गया है। मैंने कई स्निपेट्स की कोशिश की है लेकिन मुझे एक ही त्रुटि मिल रही है। मैं टिम गोल्डन के कोड की कोशिश की है:मैपआई

import win32com.client 

session = win32com.client.gencache.EnsureDispatch ("MAPI.Session") 

# 
# Leave blank to be prompted for a session, or use 
# your own profile name if not "Outlook". It is also 
# possible to pull the default profile from the registry. 
# 
session.Logon ("Outlook") 
messages = session.Inbox.Messages 

# 
# Although the inbox_messages collection can be accessed 
# via getitem-style calls (inbox_messages[1] etc.) this 
# is the recommended approach from Microsoft since the 
# Inbox can mutate while you're iterating. 
# 
message = messages.GetFirst() 
while message: 
    print message.Subject 
    message = messages.GetNext() 

हालांकि मैं कोई त्रुटि मिलती है:

pywintypes.com_error: (-2147221005, 'Invalid class string', None, None) 

सुनिश्चित नहीं हैं कि मेरा प्रोफ़ाइल नाम है तो मैं के साथ की कोशिश की:

session.Logon() 

संकेत दिया जाना लेकिन यह या तो काम नहीं करता (एक ही त्रुटि)। आउटलुक के साथ दोनों खुले और बंद किए गए और न तो कुछ भी बदल दिया।

+1

क्या आपने Outlook क्लाइंट के आधार पर सर्वर के विरुद्ध IMAP का उपयोग करने पर विचार किया है? आपके उपयोग-मामले के आधार पर, IMAP व्यवहार्य साबित हो सकता है और अधिक पोर्टेबल (दोनों क्लाइंट और सर्वर)। –

+1

@ जेसन आईएमएपी अच्छा दिखता है लेकिन दुर्भाग्य से मैं जिस खाते का उपयोग कर रहा हूं उस पर सक्षम नहीं है। – johnharris85

उत्तर

42

मुझे वही समस्या थी जो आपने किया - काम करने वाले बहुत कुछ नहीं मिला। हालांकि, निम्नलिखित कोड एक आकर्षण की तरह काम करता है।

import win32com.client 

outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI") 

inbox = outlook.GetDefaultFolder(6) # "6" refers to the index of a folder - in this case, 
            # the inbox. You can change that number to reference 
            # any other folder 
messages = inbox.Items 
message = messages.GetLast() 
body_content = message.body 
print body_content 
+2

क्या अन्य संदेश विशेषताओं को देखने का कोई तरीका है? संदेश प्राप्त होने की तिथि और समय प्राप्त करने के लिए मैं आपके उदाहरण का उपयोग करना चाहता हूं। – sequoia

+4

समाधान मिला: कुछ संदेश के लिए 'message.CreationTime' जब मैं dir() – sequoia

+5

@sequoia का उपयोग करता हूं तो विशेषताएँ नहीं आती हैं - MailItems के लिए COM गुणों की माइक्रोसॉफ्ट की सूची का उपयोग करना (उदाहरण: आउटलुक संदेश) यह है कि मैंने सभी को कैसे पाया संदेश की गुण (संदेश। SenderEmailAddress, उदाहरण के लिए): http://msdn.microsoft.com/en-us/library/microsoft.office.interop.outlook.mailitem_properties.aspx – wardw123

8

मैंने पाइथन के माध्यम से आउटलुक ऑब्जेक्ट्स पर फिर से चलाने के लिए अपना खुद का इटरेटर बनाया है। मुद्दा यह है कि पायथन इंडेक्स [0] से शुरू होने की पुनरावृत्ति करने की कोशिश करता है, लेकिन दृष्टिकोण को पहले आइटम इंडेक्स [1] के लिए उम्मीद है ... इसे और अधिक रूबी सरल बनाने के लिए, विधियों के साथ एक सहायक वर्ग ओली के नीचे है:

.items() - एक टपल (सूचकांक, मद) ...

.prop() पैदावार - दृष्टिकोण वस्तु उपलब्ध संपत्तियों (तरीकों और गुण)

from win32com.client import constants 
from win32com.client.gencache import EnsureDispatch as Dispatch 

outlook = Dispatch("Outlook.Application") 
mapi = outlook.GetNamespace("MAPI") 

class Oli(): 
    def __init__(self, outlook_object): 
     self._obj = outlook_object 

    def items(self): 
     array_size = self._obj.Count 
     for item_index in xrange(1,array_size+1): 
      yield (item_index, self._obj[item_index]) 

    def prop(self): 
     return sorted(self._obj._prop_map_get_.keys()) 

for inx, folder in Oli(mapi.Folders).items(): 
    # iterate all Outlook folders (top level) 
    print "-"*70 
    print folder.Name 

    for inx,subfolder in Oli(folder.Folders).items(): 
     print "(%i)" % inx, subfolder.Name,"=> ", subfolder 
0

मैं था उजागर आत्मनिरीक्षण करने के लिए मदद एक ही मुद्दा। इंटरनेट (और ऊपर) से विभिन्न दृष्टिकोण के संयोजन निम्नलिखित दृष्टिकोण (checkEmails.py)

class CheckMailer: 

     def __init__(self, filename="LOG1.txt", mailbox="Mailbox - Another User Mailbox", folderindex=3): 
      self.f = FileWriter(filename) 
      self.outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI").Folders(mailbox) 
      self.inbox = self.outlook.Folders(folderindex) 


     def check(self):     
     #=============================================================================== 
     # for i in xrange(1,100):       #Uncomment this section if index 3 does not work for you 
     #  try: 
     #   self.inbox = self.outlook.Folders(i)  # "6" refers to the index of inbox for Default User Mailbox 
     #   print "%i %s" % (i,self.inbox)   # "3" refers to the index of inbox for Another user's mailbox 
     #  except: 
     #   print "%i does not work"%i 
     #=============================================================================== 

       self.f.pl(time.strftime("%H:%M:%S")) 
       tot = 0     
       messages = self.inbox.Items 
       message = messages.GetFirst() 
       while message: 
        self.f.pl (message.Subject) 
        message = messages.GetNext() 
        tot += 1 
       self.f.pl("Total Messages found: %i" % tot) 
       self.f.pl("-" * 80) 
       self.f.flush() 

if __name__ == "__main__": 
    mail = CheckMailer() 
    for i in xrange(320): # this is 10.6 hours approximately 
      mail.check() 
      time.sleep(120.00) 

concistency के लिए मैं भी FileWriter वर्ग (FileWrapper.py में पाया) के लिए कोड शामिल साथ आने के। मुझे इसकी आवश्यकता है क्योंकि विंडोज़ में एक फ़ाइल में यूटीएफ 8 को पाइप करने की कोशिश नहीं कर रहा था।

class FileWriter(object): 
    ''' 
    convenient file wrapper for writing to files 
    ''' 


    def __init__(self, filename): 
     ''' 
     Constructor 
     ''' 
     self.file = open(filename, "w") 

    def pl(self, a_string): 
     str_uni = a_string.encode('utf-8') 
     self.file.write(str_uni) 
     self.file.write("\n") 

    def flush(self): 
     self.file.flush()  

आनंद लें।

1

मेरी खराब अंग्रेजी के लिए खेद है। जाँच हो रही है MAPI आसान है, के साथ अजगर का उपयोग कर मेल

outlook =win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI") 
folder = outlook.Folders[5] 
Subfldr = folder.Folders[5] 
messages_REACH = Subfldr.Items 
message = messages_REACH.GetFirst() 

यहाँ हम मेल बॉक्स में सबसे पहले मेल मिलता है, या किसी भी उप फ़ोल्डर में कर सकते हैं। दरअसल, हमें मेलबॉक्स नंबर & अभिविन्यास की जांच करने की आवश्यकता है। इस विश्लेषण की सहायता से हम प्रत्येक मेलबॉक्स & अपने उप मेलबॉक्स फ़ोल्डरों की जांच कर सकते हैं।

इसी प्रकार कृपया नीचे दिए गए कोड को ढूंढें, जहां हम देख सकते हैं, अंतिम/पहले मेल। हमें कैसे जांचना है।

`outlook =win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI") 
folder = outlook.Folders[5] 
Subfldr = folder.Folders[5] 
messages_REACH = Subfldr.Items 
message = messages_REACH.GetLast()` 

इसके साथ हम मेलबॉक्स में सबसे हालिया ईमेल प्राप्त कर सकते हैं। उपरोक्त उल्लिखित कोड के अनुसार, हम अपने सभी मेल बॉक्स, & इसके उप फ़ोल्डर देख सकते हैं।