2016-06-20 317 views
2

私はPython 3を使用しています。 Outlookでの電子メールを日付別に抽出しようとしています。特定の日付のOutlook電子メールをPythonで一覧表示する

私はループを試していました。たぶんWHILEかIF文でした。

これは文字列と他の文字列が日付なので実行できますか? 私が今までに得たものをconcideしてください:ありがとう。

1. import win32com.client, datetime 
2. 
3. # Connect with MS Outlook - must be open. 
4. outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI") 
5. # connect to Sent Items 
6. sent = outlook.GetDefaultFolder(5).Items # "5" refers to the sent item of a folder 
7. 
8. # Get yesterdays date 
9. y = (datetime.date.today() - datetime.timedelta (days=1)) 
10. # Get emails by selected date   
11. if sent == y: 
12.  msg = sent.GetLast() 
13.  # get Subject line 
14.  sjl = msg.subject 
14.  # print it out      
15.  print (sjl) 

答えて

1

編集:見通しのAPIは.Itemsの内容を検索するための方法、Items.Findを、持っています。これがあなたがしたいことの範囲であれば、おそらくそれをやるべきでしょう。あなたのやりたいことがもっとあれば、私の元の書き込みはまだうまくいくはずです。


は今のところ、それはあなたの文は電子メールのセットが昨日に等しいかどうかをチェックしている場合のように思えます。

.Itemsは、Items.GetNextなどのいくつかの異なる方法を使用して、またはItems.Itemで特定のインデックスを参照することによって、最初に繰り返しなければならない電子メールのコレクションを返しています。

その後、sent.GetNext()を返すためにこれ以上のメッセージを持っていなくなるまでこれが送信され、フォルダ内のすべてのメッセージを反復処理する必要があり、現在の電子メールを取り、.SentOn property.

currentMessage = sent.GetFirst() 
while currentMessage: 
    if currentMessage.SentOn == y: 
     sjl = currentMessage.Subject 
     print(sjl) 
    currentMessage = sent.GetNext() 

にアクセスすることができます。 yは、.SentOnと同じ書式設定であることを確認する必要があります。

すべてのメッセージを繰り返し処理したくない場合は、昨日になるまでメッセージに戻って2つのループを入れ子にし、おそらく "昨日"になってから壊れるまで繰り返します。

+0

制限方法もあります。私はそれがagianを見つけることができません。それはメールのitems.restrict(この場合yの指定された日付)のようになりましたが、私が最初に見たものが見えなかった例を見ました。 (私はPythonに新しい、haventは6yrsのためにコード化されています。 – Andy

1

Iveがコードを完成しました。手伝ってくれてありがとう。

`import sys, win32com.client, datetime 
# Connect with MS Outlook - must be open. 
outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace 
("MAPI") 
# connect to Sent Items 
s = outlook.GetDefaultFolder(5).Items # "5" refers to the sent item of a 
folder 
#s.Sort("s", true) 
# Get yesterdays date for the purpose of getting emails from this date 
d = (datetime.date.today() - datetime.timedelta (days=1)).strftime("%d-%m-% 
y") 
# get the email/s 
msg = s.GetLast() 
# Loop through emails 
while msg: 
    # Get email date 
    date = msg.SentOn.strftime("%d-%m-%y") 
    # Get Subject Line of email 
    sjl = msg.Subject 
    # Set the critera for whats wanted      
    if d == date and msg.Subject.startswith("xx") or msg.Subject.startswith 
    ("yy"): 
    print("Subject:  " + sjl + "  Date : ", date) 
    msg = s.GetPrevious() ` 

これは機能します。しかし、制約に従ったメッセージが見つからなければ、それは終了しません。 Iveはただ一つのメッセージを見つけて、すべてではなく、何かを見つけようとしました。または私は他の人を試してみてください!=デートしてもどちらでも見つからないでしょう。 Forループは、msg(文字列)のある日付を使って動作します。 私は確信していません - ここにbiginner: ??

0

COM APIのドキュメントはかなり徹底的です。たとえば、クラスリストはhereです。また、オブジェクトの操作に使用できるさまざまなメソッドについても説明しています。あなたの特定の例では、あなたの後ろのものは、あなたのアイテムのセットを日付によって制限することです。アイテムクラスhereには既にその機能があることがわかります。便利にはRestrictと呼ばれます。私がその機能で見ることができる唯一の悩みは、あなたがあなたのアイテムを文字列形式で好きなように指定する必要があるということです。したがって、あなた自身で文字列を作成する必要があります。

だから、例えば、あなたのコードを続行するには、時間によって制限:

#first create the string filter, here you would like to filter on sent time 
#assuming you wanted emails after 5 pm as an example and your date d from the code above 
sFilter = "[SentOn] > '{0} 5:00 PM'".format(d) 
#then simply retrieve your restricted items 
filteredEmails = s.Restrict(sFilter) 

あなたはもちろんの基準のすべての種類によって制限することができますが、単に機能上のマニュアルを参照してください。このようにして制限すると、空の項目セットが返されます。例外を処理する必要はなく、コードでそのケースを処理できます。例:

#you have restricted your selection now want to check if you have anything 
if filteredEmails.Count == 0: 
    #handle this situation however you would like 
関連する問題