outlook_exchangelib
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.
| Beide Seiten, vorherige ÜberarbeitungVorherige ÜberarbeitungNächste Überarbeitung | Vorherige Überarbeitung | ||
| outlook_exchangelib [2022/01/01 20:36] – varnholt | outlook_exchangelib [2022/01/01 21:03] (aktuell) – [SNIPS und falsche Intents] varnholt | ||
|---|---|---|---|
| Zeile 2: | Zeile 2: | ||
| Auf Smartphone und Computer wird man immer informiert, ob neue mail eingetroffen ist. Damit aber die Heim-Automation auch die aktuellsten Informationen hat, muss man sie sich über z.B. den Exchange-Server besorgen. Mit der [[https:// | Auf Smartphone und Computer wird man immer informiert, ob neue mail eingetroffen ist. Damit aber die Heim-Automation auch die aktuellsten Informationen hat, muss man sie sich über z.B. den Exchange-Server besorgen. Mit der [[https:// | ||
| + | |||
| + | ==== Installation und Probleme ==== | ||
| < | < | ||
| Zeile 33: | Zeile 35: | ||
| Nach der Fehlermeldung | Nach der Fehlermeldung | ||
| ssl.SSLError: | ssl.SSLError: | ||
| - | habe ich erst lange viele versuche gemacht, das zu beheben. Eine Idee war, die Authentifizierung | + | habe ich erst lange viele versuche gemacht, das zu beheben. Eine Idee war, die TLS-Validierung |
| + | BaseProtocol.HTTP_ADAPTER_CLS = NoVerifyHTTPAdapter | ||
| + | hat aber nicht geklappt. Auch mittels pyopenssl und dem Import in urllib3 hat es nicht geklappt. [[https:// | ||
| + | < | ||
| + | import OpenSSL | ||
| + | import urllib3 | ||
| + | import urllib3.contrib.pyopenssl as pyopenssl | ||
| + | pyopenssl.inject_into_urllib3() | ||
| + | </ | ||
| + | |||
| + | Erst mit dem DEBUG-Log und dem automatischen Discover unseres Exchange-Servers bin ich den richtigen Einstellungen auf die Schliche gekommen. | ||
| + | |||
| + | < | ||
| + | import logging | ||
| + | from exchangelib.util import PrettyXmlHandler | ||
| + | from exchangelib.protocol import BaseProtocol, | ||
| + | logging.basicConfig(level=logging.DEBUG, | ||
| + | </ | ||
| + | |||
| + | Bei ' | ||
| + | < | ||
| + | DEBUG: | ||
| + | DEBUG: | ||
| + | </ | ||
| + | |||
| + | ==== Abfrage der letzten 5 mails in der Inbox ==== | ||
| + | |||
| + | Hier der funktionierende Aufruf: | ||
| + | < | ||
| + | import paho.mqtt.client as mqtt | ||
| + | import json | ||
| + | import time | ||
| + | import pytz | ||
| + | import requests.auth | ||
| + | import logging | ||
| + | |||
| + | from datetime | ||
| + | from exchangelib import DELEGATE, IMPERSONATION, | ||
| + | from exchangelib import EWSDate, EWSTimeZone, | ||
| + | from exchangelib import CalendarItem, | ||
| + | from exchangelib import FileAttachment, | ||
| + | from exchangelib import transport | ||
| + | |||
| + | from exchangelib.util | ||
| + | from exchangelib.protocol import BaseProtocol, | ||
| + | |||
| + | # | ||
| + | |||
| + | |||
| + | creds = Credentials( | ||
| + | username=" | ||
| + | password=" | ||
| + | ) | ||
| + | |||
| + | version = Version(build=Build(15, | ||
| + | |||
| + | config = Configuration(service_endpoint=' | ||
| + | | ||
| + | |||
| + | account = Account( | ||
| + | primary_smtp_address=" | ||
| + | credentials=creds, | ||
| + | autodiscover=False, | ||
| + | config=config, | ||
| + | access_type=DELEGATE | ||
| + | ) | ||
| + | |||
| + | |||
| + | for item in account.inbox.all().order_by(' | ||
| + | print(item.subject) | ||
| + | </ | ||
| + | |||
| + | Danach habe ich das ganze noch an den MQTT-Server angebunden, damit nur bei Anwesenheit die ungelesenen Mails | ||
| + | der letzten paar Stunden vorgelesen werden, sowie ein crontab Aufruf, der das alle 5 Minuten startet. | ||
| + | |||
| + | ==== Kalender-Einträge ==== | ||
| + | |||
| + | Die Anmeldung an den Exchange-Server ist die gleiche wie oben. Um Kalendereinträge abzufragen braucht es diesen Code. Ein wenig Probleme hat die Zeitzone gemacht. | ||
| + | < | ||
| + | now=datetime.now() | ||
| + | current = EWSDateTime(now.year, | ||
| + | future = current + timedelta(days=1) | ||
| + | erg=list(account.calendar.view(start=current, | ||
| + | |||
| + | mytext="" | ||
| + | if not erg: | ||
| + | print(' | ||
| + | mytext=" | ||
| + | else: | ||
| + | mytext=" | ||
| + | for item in erg: | ||
| + | d=item.start.astimezone(EWSTimeZone.localzone()) | ||
| + | print(d.strftime(" | ||
| + | mytext=mytext+" | ||
| + | </ | ||
| + | |||
| + | Nachdem der String erzeugt wurde, kann ich ihn dann von meinem Mac bzw. SNIPS, vorlesen lassen. Dann noch ' | ||
| + | |||
| + | ==== SNIPS und falsche Intents bzw. Weiterleitung von Intents ==== | ||
| + | |||
| + | Es macht leider einen Unterschied, | ||
| + | < | ||
| + | Das ganze ist hier für node.js geschrieben | ||
| + | client.publish(' | ||
| + | JSON.stringify({' | ||
| + | client.publish(' | ||
| + | JSON.stringify({' | ||
| + | ' | ||
| + | ' | ||
| + | ' | ||
| + | </ | ||
| | | ||
| - | Nach einigem probieren und unterschiedlichen Aufrufen hat es zum Schluss funktioniert. Zwischendrin habe ich verschiedene Sachen ausprobiert, | + | |
| + | Stand Januar 2022 | ||
outlook_exchangelib.1641065796.txt.gz · Zuletzt geändert: 2022/01/01 20:36 von varnholt
