Falls Du das Python Script haben möchtest, schreib hier bitte. In diesem Fall gilt: Ohne Gewähr, "as is", ohne Support, installieren musst Du selbst.
Hallo,
die Sync mit Exchange oder auch mit Office365 ist seit längerem unzureichend. Das hat mich so sehr geärgert und wir haben es selbst umgesetzt. Etwa 3 Tage und unser Auszubildender hatte es mit ein wenig Unterstützung programmiert gehabt (So schwer kann es also nicht wirklich sein). Wir holen die Daten über den EWS und schreiben direkt in die relevanten Datentabellen.
Unser Vorgehen:
Sowohl die Firmenkontakte (Die sind bei uns ein Subfolder eines einzelnen Postfaches unterhalb des "normalen" Kontakteordners) als auch die jeweiligen privaten Kontakte (abhängig von den E-Mail Adressen, die den Nebenstellen zugeordnet sind) werden synchronisiert. Die Kontakte in der Datenbank werden nur aktualisiert oder, wenn nicht vorhanden, erstellt. Es werden keine Daten aus der Datenbank in 3CX gelöscht.
Bei > 4000 Kontakten dauert die Erstsync zwar schon ein paar Minuten aber in den Folgeläufen wird nur neu angelegt was nicht geupdated werden kann. Das läuft bei uns in etwa 2 Minuten Nachts.
Wir holen die Firmenkontakte aus einem Postfach (ein eigener Kontakte-Unterordner der vom unserem PMS aus in Exchange befüllt wird) und per Impersonated User die privaten Kontakte aus dem Standard vordefiniertem "Kontakte" Ordner des jeweiligen Postfachs. Achtung Thema Datenschutz bzgl. eines Impersonated Users!
Hinweis: Wir haben die 3CX unter Linux / Debian installiert.
Aufgerufen wird das Script per einer Windows Kiste im Netzwerk per geplantem Task.
Ablauf wie folgt:
Vorbereitungen und Installation
Postgres konfigurieren
Damit das Script sich mit der Datenbank verbinden kann, muss diese dafür konfiguriert werden.
- Folgende Zeile in /etc/postgresql/9.6/main/postgresql.conf ändern listen_addresses = '*'
- Folgende Zeile in /etc/postgresql/9.6/main/pg_hba.conf hinzufügen
host database_single phonesystem 192.168.131.0/24 md5
- Folgende Zeile in /etc/iptables/rules.v4 vor COMMIT hinzufügen
-A INPUT -p tcp --dport 5432 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
- Folgende Befehle ausführen
systemctl restart postgresql
iptables -A INPUT -p tcp --dport 5432 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
Hinweis zu Punkt 2: Man kann es weiter einschränken indem man die IP hier anders definiert bzw. auf einen einzelnen (zusätzlichen) Host zur 127.0.0.1 einschränkt.
Abhängigkeiten installierten (für Ausführung unter Windows, von einem anderen Rechner aus)
Als Administrator folgenden Befehl ausführen
pip install pipenv
Im Projekt-Ordner folgenden Befehl ausführen
pipenv sync
Konfiguration
Eine Beispiel-Konfiguration:
EWS_SERVER - Die Server Adresse des Exchange Servers
EWS_PRIMARY_SMTP_ADDRESS - Die E-Mail des Users, der den EWS_CONTACTS_SUB_FOLDER besitzt
EWS_USERNAME - Die E-Mail für einen
Impersonated User
EWS_PASSWORD - Das Passwort für den
Impersonated User
EWS_CONTACTS_SUB_FOLDER - Unterordner, aus dem die die Firmen Kontakte gelesen werden
POSTGRES_CONNECTION_STRING - Datenbank Verbindung
LOG_LEVEL - Log Level für die Konsole. Möglich: INFO, ERROR
EXCLUDED_USERS - Die E-Mails für die keine privaten Kontakte synchronisiert werden sollen
Ausführung
Synchronisation starten:
pipenv run python sync.py
Nach Ausführung
Nachdem die Kontakte synchronisiert wurden, sollte folgender Befehl auf dem 3CX Server ausgeführt werden (Dabei verlieren die Webclients kurz ihre Verbindung).
Dadurch werden die geänderten Kontakte auch im Webclient sichtbar.
systemctl restart 3CXCfgServ01
(Wir machen das per Remote SSH)
Eine Settings Example sieht vom Format so aus:
EWS_SERVER = "abc.de/EWS/Exchange.asmx"
EWS_PRIMARY_SMTP_ADDRESS = "
[email protected]"
EWS_USERNAME = "
[email protected]"
EWS_PASSWORD = ""
EWS_CONTACTS_SUB_FOLDER = "WennKontakteOrdnerAbweicht"
POSTGRES_CONNECTION_STRING = "host=example.com dbname=database_single user=phonesystem password=******"
LOG_LEVEL = "INFO"
EXCLUDED_USERS = [
"
[email protected]",
]
---------------
Datenbank Aufbau
In der Tabelle phonebook sind die Kontakte
Die Spalte fkiddn bestimmt den User mit der id aus dn.iddn, welche mit der users.fkidextension gleich ist
In der Tabelle user sind alle User
---------------
Grüsse