Zope -> win32com -> Outlook

Django, Flask, Bottle, WSGI, CGI…
Antworten
ifst0011
User
Beiträge: 3
Registriert: Mittwoch 28. Oktober 2009, 08:55

Hallo zusammen,

mein erster Beitrag, bittet habt Verständnis bei teilweiser Unkenntnis. :wink:

Ich arbeite mit dem Zope 2.11.4 als Binary auf Windows. Dieses Release hat ja bereits eine Python-Umgebung mit win32com inne. Nun möchte ich diese auch nutzen.

Ein auf der Konsole lauffähiges Skript:

Code: Alles auswählen

import win32com.client
o = win32com.client.Dispatch("Outlook.Application")
appointment = o.CreateItem(1)
appointment.Start = '2009-10-29 14:00'
appointment.Duration = 60
appointment.Subject = 'Testeintrag aus Zope'
appointment.Location = 'Munich'
recipients = appointment.Recipients.Add('max.muster@domain.de')
appointment.requiredAttendees = recipients
appointment.send
appointment.save()
Leider kann ich dieses Skript in Zope nicht aufrufen. Wenn ich es versuche zu starten, dann fragt Zope nach irgendwelchen Anmeldedaten, akzeptiert aber weder die der Domäne, noch die von lokalen Benutzerkonten, noch die im acl_users-Ordner.

Jetzt habe ich schon mit dem Produkt COMobject mein Glück versucht, aber das führt früher oder später zum selben Problem. Einzig der Aufruf win32com.client.Dispatch("...") wird mir von dem Tool abgenommen.

Kann mir einer sagen, warum der Zope diese Authentifizierung will und wo ich das ggf. abschalten kann? Zope läuft ja als Dienst und der Dienst wird schon mit den entsprechenden Credentials gestartet. Wie kann ich dem Zope beibringen, dass Python-Skript auszuführen?

Vielen Dank und Grüße
Stefan
ifst0011
User
Beiträge: 3
Registriert: Mittwoch 28. Oktober 2009, 08:55

So, ich bins nochmal:

Nunmehr habe ich einen Versionssprung auf Zope 2.12.1 mit Python 2.6.4 gemacht. Das bringt mich in sofern schon einmal weiter, weil ich den Python-Kern modular erweitern und mit makepy COM-Bibliotheken/-Schnittstellen für meine Python-Anwendungen erzeugen kann. Soweit so gut.

So sieht es mittlerweile aus:

Code: Alles auswählen

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("Mr.Unbekannt@domain.com")
        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
Das CoInitialize() braucht der Zope, weil er generell mit mehreren Threads arbeitet. Dadurch wird sichergestellt, dass fehlgeschlagene Aufrufe der Methode ständig einen Neustart erzwingen. :shock:

In der Python-Konsole läuft das Skript durch und erzeugt den Kalender-Eintrag. Wenn ich das Skript im Zope als externe Methode einbinde und aufrufe, scheitert Zope in Zeile 22 beim Hinzufügen der Empfänger. Python ist an dieser Stelle zuvor auch gescheitert. Nachdem ich allerdings mit makepy die COM-Schnittstellen erzeugt habe, lief es dort. Deshalb vermute ich, dass Zope diese Schnittstellen nicht einbindet.

Weiß jemand, wo ich Zope diese Schnittstellen bekanntgeben muss oder wo ich ggf. die win32com-Lib hinkopieren muss, damit Zope sie korrekt einbindet, wie auch Python?

Vielen Dank nochmal, ich hoffe diesmal kann mir jemand helfen.

Viele Grüße
Stefan
ifst0011
User
Beiträge: 3
Registriert: Mittwoch 28. Oktober 2009, 08:55

Nachtrag 2:

Das Python-Skript läuft im Python nur fehlerfrei durch, wenn Outlook bereits läuft. Wenn Outlook nicht läuft, bricht Python im Try-Block an der selben Stelle ab, wie Zope. :(

Also, wie schaffe ich es, Python dazu zu bringen, dass in Outlook der Termin erzeugt wird, ohne das dieses bereits läuft?

Viele Grüße
Stefan
Antworten