AW: Nutzen der COM-Schnittstelle von Zope aus
"Iffland Stefan" <[email protected]>
| Newsgroups | gmane.comp.web.zope.german |
|---|---|
| Message-ID | <[email protected]> |
Hallo Patrick, den Holzhammer habe ich noch nicht verwendet. Würde aber - denke ich - auch nicht viel weiter helfen, weil es nur das Problem aus der Python-Konsole behebt. Dass das Skript dort nur läuft wenn Outlook bereits läuft, kann ich verschmerzen. Wichtig ist, dass das Skript von Zope aus gestartet werden kann und auch durchläuft. Deshalb nun auch speziell hier in der Mailing-Liste. Im Eclipse wird beispielsweise CoInitialize() bzw. CoUninitialize() als Fehler markiert. Vermutlich liegt es daran, dass in der Konsole nur bei laufendem Outlook alles durchläuft. In Zope brauche ich diese Aufrufe aber, weil dieser ja in mehreren Threads läuft und ggf. mehrere Aufrufe parallel bearbeitet werden müssen. Ohne diese Aufrufe kann ab dem zweiten Aufruf dieses Skripts keine Instanz mehr initialisiert werden. Um mal weiter Licht ins Dunkel zu bringen: Das Python-Skript hat in der Konsole auch erst funktioniert nachdem ich in PythonWin die COM-Bibliotheken mit Hilfe vom Makepy-Utility erzeugt habe. Vorher scheiterte das Skript auch an Outlook-spezifischen Attributen oder Methoden. Daher habe ich immernoch den Verdacht, dass Zope - obwohl es seit Version 2.12 scheinbar eher als Python-Modul zu betrachten ist - diese Bibliotheken nicht kennt. Muss man die generierten Klassen / Python-Dateien im Zope noch einmal separat verfügbar machen? Viele Grüße Stefan Stefan Iffland Telefon +49 (7243) 570-1681 E-Mail [email protected] -----Ursprüngliche Nachricht----- Von: [email protected] [mailto:[email protected]] Im Auftrag von Patrick Gerken Gesendet: Montag, 23. November 2009 10:45 An: Deutschsprachige Zope-Benutzer-Liste Betreff: Re: [dzug-zope] Nutzen der COM-Schnittstelle von Zope aus Hi, auf dem Forum hast du wahrscheinlich keine Antwort bekommen weil die Leser dachten es waere eine Zope Frage und damit kennen sich nicht so viele aus. Hier stellst du nun eine win32 Funktionalitaeten und riskierst wieder keine Antworten zu bekommen weil hier vielleicht nicht so viele die win32 Schnittstelle kennen. Ich wuerde dir gerne weiterhelfen, weiss aber die Antwort nicht. Falls hier niemand anderes eine Antwort weiss, stell die Frage, wie man Outlook aus python starten kann, nochmal mit passendem subject im Forum. Oder falls du keine Angst vor Englisch hast, probier mal stackoverflow: http://stackoverflow.com/search?q=outlook+python MfG Patrick p.s.: Hast du vielleicht mal die Holzhammer Methode probiert, vorher einfach mittels os.system() Outlook zu starten? 2009/11/23 Iffland Stefan <[email protected]>: > Hallo zusammen, > > > > ich habe mein Problem unter > http://www.python-forum.de/topic-20807.html?sid=495671c5e331f0c2b566b6 > 81e04b0959 > schon einmal > > etwas detailiert gepostet. (mit Code-Beispiel) > > > > Meine erste Nachricht an die Liste. Hoffe, dass ich hier ein paar > Anregungen bekomme. > > > > Also es geht um eine etwas veraltete webbasierte > Unternehmensanwendung, die mit Hilfe von Zope realisiert wurde. Die > Anwendung > > wurde mittlerweile von Zope 2.4.2 auf Zope 2.11.4 migriert und läuft wieder. > Verwendet werden neben den Standard-Produkten > > NFGnav, ZPyODBCDA und experimentell COMObject. Die Anwendung wird zum > Erfassen von Abwesenheiten (Urlaub, Gleitzeit, etc.) > > und einer ggf. notwendigen Genehmigung durch Vorgesetzte verwendet. In > der Hauptsache bildet die Anwendung also eine > > An-/Abwesenheitsübersicht ab. Die Mitarbeiterdatensätze und > Abwesenheitsdatensätze werden in einer SQL-Server DB gespeichert. > > > > Da sich der Python-Kern der Installerversion von Zope 2.11.4 schlecht > erweitern lässt und zum Beispiel PythonWin nicht nutzbar ist um > > die COM-Schnittstellen zu generieren, bin ich nach langen Versuchen > nun bei Zope 2.12.1 angekommen. Dieser läuft zunächst nur auf > > meinem Entwicklungsrechner (Windows XP), aber auch dort läuft die > Applikation soweit. Was ich nun abbilden muss: Wenn ein Mitarbeiter > > im Portal eine Abwesenheit erfasst, soll an seine Kollegen statt einer > Email-Benachrichtigung eine Besprechungsanfrage für Outlook > > versendet werden. Das möchte ich über die COM-Schnittstelle realisieren. > Zope wird dazu als Windows-Dienst eingerichtet und mit > > einem bestimmten Benutzer gestartet. Auf diese Weise wird > sichergestellt, dass Outlook auch mit den Einstellungen dieses > Benutzers > > gestartet wird. Der Dummy-User hat also irgendwann einen Kalender mit > sämtlichen Abwesenheiten aller MA und man könnte so auch > > wieder über COM existierende Einträge überarbeiten und löschen. Soweit > die Theorie. ;-) > > > > Von der Python-Konsole aus funktioniert folgendes Skript ohne > Probleme, allerdings nur, wenn Outlook bereits geöffnet ist. > > > > def besprechung(subject, start_year, start_month, start_day, > start_hour="0", start_minute="0", debug=False): > > import win32com.client > > import pythoncom > > > > pythoncom.CoInitialize() > > o = win32com.client.gencache.EnsureDispatch("Outlook.Application") > > > > appointment = > o.CreateItem(win32com.client.constants.olAppointmentItem) > > try: > > appointment.Start = start_year + "-" + start_month + "-" + > start_day > + " " + start_hour + ":" + start_minute > > appointment.AllDayEvent = True > > appointment.MeetingStatus = > win32com.client.constants.olMeeting > > appointment.Subject = "Urlaubsportal: " + subject > > appointment.ReminderSet = False > > appointment.ResponseRequested = False > > myRequiredAttendee = appointment.Recipients.Add("USERXY") > > myRequiredAttendee.Type = win32com.client.constants.olRequired > # 1 = erforderlich > > #myOptionalAttendee = appointment.Recipients.Add("Bachmann > Eric") > > #myOptionalAttendee.Type = 2 # 2 = optional > > appointment.Send() > > appointment.Save() > > print "Keine Fehler" > > finally: > > appId = appointment.EntryID > > del o > > try: > > pythoncom.CoUninitialize() > > except: > > pass > > if debug: > > return "Objekt geloescht! EntryID:" + appId > > > > return appId > > > > > > print besprechung(subject="Max Muster hat frei", start_year="2009", > start_month="11", start_day="12", debug=True) > > > > Python scheint also nicht in der Lage zu sein, eine Outlook-Instanz zu > starten. Wenn das Skript auf einem Server laufen soll, kann ich jedoch > nicht sicherstellen, > > dass Outlook immer schon geöffnet ist. Andererseits, wenn ich das > Skript – leicht modifiziert – in Zope als External Method einbinde und > starte, wenn Outlook > > läuft, dann bekomme ich eine Windows-Fehlermeldung (Fehler beim > Speicherzugriff) und darf Zope neu starten. > > > > Rufe ich die externe Methode auf, wenn Outlook geschlossen ist, > scheitert Zope beim Hinzufügen der Empfänger (Zeile 22). Nun bin ich > für jeden Hinweis > > dankbar, was ich beachten muss und wo der Fehler liegen könnte. Ich > bin neu in Python und entsprechend dürftig ist mein Wissen teils noch. > > > > Vielen Dank und Viele Grüße > > Stefan > > > > Stefan Iffland > > Telefon +49 (7243) 570-1681 > E-Mail [email protected] > > > > > _______________________________________________ > zope mailing list > [email protected] > https://mail.dzug.org/mailman/listinfo/zope > > _______________________________________________ zope mailing list [email protected] https://mail.dzug.org/mailman/listinfo/zope