web-dev-qa-db-ja.com

PythonでExchangeメールボックスに接続します

Pythonスクリプトで、Exchangeのメールボックスに接続する必要があります。Outlookの使用を含め、ローカルマシンのプロファイル設定を使用しません。win32comを使用してMAPI.Sessionを作成すると、ログオンできます。 (Logon()メソッドで)既存のプロファイルを使用しますが、ユーザー名とパスワードを指定するだけです。

これは可能ですか?もしそうなら、誰かがサンプルコードを提供できますか?標準ライブラリとpywin32パッケージのみを使用したいのですが。残念ながら、ExchangeサーバーのIMAPアクセスを有効にする(そして、imaplibを使用する)ことはできません。

必要な場合:スクリプトが実行するのは、メールボックスに接続し、受信トレイのメッセージを実行して、内容を取得することだけです。そもそも接続を確立できれば、そのためのコードを書くことができます。

Outlookについて明確にするために:Outlookはローカルマシンにインストールされますが、アカウントはセットアップされていません(つまり、適切なライブラリはすべて利用可能ですが、Outlook内のセットアップとは別に操作する必要があります)。

22
Tony Meyer

OutlookとMAPIプロファイルを使用しないと、これは不可能だと確信しています。メール管理者にExchangeサーバーでIMAPを有効にしてもらえると、生活がずっと楽になります。

0
Harley Holcombe

これは古いスレッドだと知っていますが...

Exchange 2007以降、またはOffice365を使用している場合は、Exchange Webサービスをご覧ください。これはExchange向けの非常に包括的なSOAPベースのインターフェイスであり、他のユーザーアカウントへの委任または偽装アクセスを含め、Outlookが実行できるほとんどすべてのことができます。

http://msdn.Microsoft.com/en-us/library/bb204119.aspx

更新:自動検出、カレンダー、受信トレイ、タスク、連絡先などをサポートするPyPIで Python EWSクライアント をリリースしました。

from exchangelib import DELEGATE, Account, Credentials

credentials = Credentials(
    username='MYWINDOMAIN\\myusername',  # Or [email protected] for O365
    password='topsecret'
)
account = Account(
    primary_smtp_address='[email protected]', 
    credentials=credentials, 
    autodiscover=True, 
    access_type=DELEGATE
)
# Print first 100 inbox messages in reverse order
for item in account.inbox.all().order_by('-datetime_received')[:100]:
    print(item.subject, item.body, item.attachments)
108

私はそれを得ました、あなたがこのように接続する必要があるアウトバウンド交換に接続するために:

import smtplib

url = YOUR_EXCHANGE_SERVER
conn = smtplib.SMTP(url,587)
conn.starttls()
user,password = (EXCHANGE_USER,EXCHANGE_PASSWORD)
conn.login(user,password)

これで通常の接続のように送信できます

message = 'From: FROMADDR\nTo: TOADDRLIST\nSubject: Your subject\n\n{}'
from, to = fromaddr,toaddrs
txt = 'This is my message'
conn.sendmail(fromaddr,toaddrs,msg.format(txt))

受信トレイからメールを取得するには、少し異なります

import imaplib

url = YOUR_EXCHANGE_URL
conn = imaplib.IMAP4_SSL(url,993)
user,password = (EXCHANGE_USER,EXCHANGE_PASSWORD)
conn.login(user,password)
conn.select('INBOX')
results,data = conn.search(None,'ALL')
msg_ids = data[0]
msg_id_list = msg_ids.split()

これにより、メールの取得に使用できるメッセージIDのリストが表示されます

latest_email_id = msg_id_list[-1]
result,data = conn.fetch(latest_email_id,"(RFC822)")
raw_email = data[0][1]

今raw_emailはあなたの電子メールメッセージですが、それを解析したい場合は次のようにしてください

from email.parser import Parser

p = Parser()
msg = p.parsestr(raw_email)

今あなたはできる

msg.get('From')
msg.get('Subject')

またはコンテンツ

msg.get_payload()

しかし、マルチパートメッセージでもう少し処理が必要な場合は、幸運なことに再帰的なソリューションがこの状況に最適です。

def process_multipart_message(message):
    rtn = ''
    if message.is_multipart():
        for m in message.get_payload():
            rtn += process_multipart_message(m)
    else:
        rtn += message.get_payload()
    return rtn

msg_contant = process_multipart_message(msg)

毎回メッセージ全体が表示されます。

28
Kyle Roux

その特定のユーザーとしてプロセスを実行する方法を見つける必要があります。

こちらをご覧ください。

pywin32.CreateProcessAsUser は、下に行く必要があるパスの始まりだと思います。最後の編集。ログオンしたユーザーハンドルは win32security.LogonUser メソッドを使用して取得されます

1
Sam Corder