データを操作できるように、Exchange/Outlookプロファイルのフォルダー内の電子メールの内容を読み込む短いプログラムを作成しようとしています。しかし、pythonおよびexchange/Outlook統合に関する多くの情報を見つけるのに問題があります。多くのものは非常に古い/ドキュメントがありません/説明がありません。私はティム・ゴールデンのコードを試しました:
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()
プロンプトが表示されますが、それでも機能しませんでした(同じエラー)。また、Outlookを開いた状態と閉じた状態の両方で試してみましたが、どちらも何も変更しませんでした。
私はあなたと同じ問題を抱えていた-うまくいくものを見つけられなかった。ただし、次のコードは魅力のように機能します。
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
Pythonを使用してOutlookオブジェクトを反復処理する独自のイテレータを作成しました。問題は、pythonはIndex [0]から反復を試行しますが、Outlookは最初のアイテムIndex [1]を想定しています...さらにするためにRuby =シンプル、以下のメソッドを持つヘルパークラスOliがあります:
.items()-Tuple(index、Item)を生成します...
.prop()-利用可能なプロパティ(メソッドと属性)を公開するOutlookオブジェクトのイントロスペクションを支援
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
私の悪い英語でごめんなさい。 Python with [〜#〜] 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()`
これにより、最新のメールをメールボックスに取り込むことができます。上記のコードによると、すべてのメールボックスとそのサブフォルダーを確認できます。
同じ問題がありました。インターネット(および上記)からのさまざまなアプローチを組み合わせて、次のアプローチ(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 __== "__main__":
mail = CheckMailer()
for i in xrange(320): # this is 10.6 hours approximately
mail.check()
time.sleep(120.00)
一貫性を保つために、FileWriterクラスのコードも含めます(FileWrapper.pyにあります)。 UTF8をWindowsのファイルにパイプしようとしても機能しなかったため、これが必要でした。
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()