Frage

Ich muss ein Exchange-Postfach in einem Python-Skript verbinden, ohne auf dem lokalen Rechner ein beliebiges Profil Setup mit (einschließlich der Verwendung von Outlook). Wenn ich win32com verwenden, um eine MAPI.Session zu erstellen I (mit dem Logon () -Methode) mit einem bestehenden Profil anmelden konnte, aber ich möchte nur einen Benutzernamen und ein Kennwort eingeben.

Ist das möglich? Wenn ja, könnte jemand Beispielcode zur Verfügung stellen? Ich würde es vorziehen, wenn es nur die Standard-Bibliothek und das pywin32 Paket verwendet. Leider IMAP-Zugriff für den Exchange-Server, so dass (und dann mit imaplib) ist nicht möglich.

Im Fall ist es notwendig: alle das Skript tun werden an die Mailbox verbindet und im Posteingang durch die Nachrichten ausgeführt wird, um den Inhalt abzurufen. Ich handhaben kann den Code für das Schreiben, wenn ich eine Verbindung in erster Linie bekommen!

Um in Bezug auf Outlook zu klären: Outlook wird auf dem lokalen Rechner installiert werden, aber es hat keine Konten Setup (dh alle entsprechenden Bibliotheken verfügbar sein wird, aber ich muss innerhalb von Outlook unabhängig von irgendetwas Setup arbeiten) <. / p>

War es hilfreich?

Lösung

Ich bin mir ziemlich sicher, dass dies ohne die Verwendung von Outlook und ein MAPI-Profil nicht möglich sein wird. Wenn Sie Ihre E-Mail süß Admin in ermöglicht IMAP auf dem Exchange-Server kommunizieren kann, würde es Ihr Leben viel einfacher machen.

Andere Tipps

Ich weiß, das ist ein alter Thread, aber ...

Wenn Sie mit Exchange 2007 oder neuer, oder Office365, werfen Sie einen Blick auf Exchange Web Services. Es ist eine ziemlich umfassende SOAP-basierte Schnittstelle für Exchange, und man kann so ziemlich alles tun Outlook ist in der Lage zu tun, einschließlich der Delegierten oder Identitätswechsel Zugriff auf andere Benutzerkonten.

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

UPDATE: Ich habe eine Python EWS-Client auf PyPI veröffentlicht, die Autoermittlung, Kalender unterstützt, Posteingang, Aufgaben, Kontakte und vieles mehr:

from exchangelib import DELEGATE, Account, Credentials

credentials = Credentials(
    username='MYWINDOMAIN\\myusername',  # Or myusername@example.com for O365
    password='topsecret'
)
account = Account(
    primary_smtp_address='john@example.com', 
    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)

Ive erhielt es, um Outbound-Austausch Sie so verbinden, müssen zu verbinden:

import smtplib

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

Jetzt können Sie wie eine normale Verbindung senden

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

, um die E-Mails von Ihrem Posteingang zu erhalten ist es ein wenig anders

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

das gibt Ihnen eine Liste der Nachrichten-ID‘ s, die Sie verwenden können, um E-Mails erhalten

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

Jetzt raw_email ist Ihre E-Mail-messsage, aber es ist nicht sehr hübsch, wenn Sie es tun somthing wie folgt

analysieren möchten
from email.parser import Parser

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

Jetzt können Sie tun,

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

oder für den Inhalt

msg.get_payload()

aber wenn du eine mehrteilige Nachricht Ihres brauchen würde ein wenig mehr Verarbeitung zu tun, luckly eine rekursive Lösung ist perfekt für diese Situation

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

Jetzt

msg_contant = process_multipart_message(msg)

werden Sie die ganze Nachricht jedes Mal.

Sie werden einen Weg finden müssen, um den Prozess als dieser bestimmten Benutzer ausgeführt werden.

sehen Sie diese.

Ich denke, pywin32.CreateProcessAsUser der Anfang des Weges ist Sie müssen nach unten gehen. Ein zuletzt. Der angemeldete Benutzer Handle wird von der Verwendung des erhaltenen win32security.LogonUser Verfahren

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top