none
Besprechungsmeeting erstellen und versenden. RRS feed

  • Frage

  • Hallo zusammen,

    meine Aufgabe ist im Moment die MS Java EWS API in unsere Software einzubinden. Wir arbeiten lokal mit dem Exchange Server 2007, für unsere Kunden soll 2010 aber genauso unterstützt werden.

    Ich bin grade dabei Besprechungstermine zu erstellen und an Teilnehmer zu versenden. Das grundsätzliche funktioniert zwar bereits, es gibt aber drei Feinheiten bei denen ich nicht wirklich weiterkommen:

    1. die Besprechungseinladung wird als E-Mail versandt. Der Termin wird als .ics-Datei angehängt. Wenn der Empänger das E-Mail öffnet und die ics-Datei öffnet sieht der die Details und kann Zusagen, Ablehnen, usw. Soweit so gut, nur sollte die E-Mail idealerweise soll empfangen werden, dass der Termin nicht als Attachements dranhängt sondern gleich im E-Mail body angezeigt wird mit den Optionen Zusagen, Ablehnen, usw.

    Kann ich das mit der EWS irgendwie festlegen, bei der Erzeugung des Appointments?

    2.Organizer als Absender eintragen: Der Exchange-Mailtransfer läuft bei uns über einen konfigurierten Standarduser (= gesetzter User für Exchangeserver) ab. Für den Spezialfall der Besprechungstermine, soll der Empfänger aber nicht dessen, sondern die Mailadresse des Organizers als Absenderadresse sehen. Kann ich das mit der EWS API erreichen? Es gibt bspw. für das Appointment-Objekt die Methode getOrganizer(), die mir die Mailadresse des Organizers zurückliefern würde. Setzen ist scheinbar nicht möglich, mal abgesehen davon, dass ich nicht weiß, ob mir das für meine Problemstellung weiterhelfen würde.

    3. Time zone für Appointment setzen: Die EWS API fordert ja, dass vor dem Arbeiten mit Datumswerten die TimeZone gesetzt wird. Erste Frage: Warum? EWS erwartet die Zeiten ohnehin im UTC-Format. Wenn ich diese vorher konvertiere und mitgebe, wozu braucht EWS dann noch die TimeZone? Zweite Frage: Wie kann ich mit outlookAppointment.setStartTimeZone() die TimeZone richtig setzen? Sie erwartet als Argument ja eine TimeZoneDefinition, welche eine C#-Klasse zu sein scheint und von der ich in Java aus auch nicht direkt eine Instanz erstellen kann. Ich habe versucht mit exchangeService.getServerTimeZones() mir die TimeZoneDefinitions des Exchange service zurückgeben zu lassen durch diese durch zu iterieren und die gefundene lokale TimeZone dann als Argument zu übergeben. Scheint soweit zu funktionieren, nur bekommen ich beim Aufruf von appoinment.save() weiterhin die EWS-Fehlermeldung: java.lang.Exception: microsoft.exchange.webservices.data.ServiceLocalException: The time zone definition is invalid or unsupported.

    Bei diesen drei Problemen komme ich bisher nicht weiter. Vielleicht stand von euch jemand bereits vor dem gleichen Problem und konnte es lösen. Für Hilfe wäre ich sehr dankbar.

    Zum Abschluss mein momentaner Quellcode:

    ExchangeService exchangeService = getInitializedExchangeService();

            if (exchangeService != null) {
                try {
                    microsoft.exchange.webservices.data.Appointment outlookAppointment = new microsoft.exchange.webservices.data.Appointment(exchangeService);

                    outlookAppointment.setSubject(engageAppointment.getSubject());
                    outlookAppointment.setBody(MessageBody.getMessageBodyFromText(engageAppointment.getBody()));
                    outlookAppointment.setLocation(engageAppointment.getLocation());
                    outlookAppointment.setImportance(Importance.Normal); //konfigurierbar?

                    TimeZone localTimeZone = Calendar.getInstance().getTimeZone();
                    for (TimeZoneDefinition timeZoneDefinition : exchangeService.getServerTimeZones()) {
                        if (localTimeZone.getID().equals(timeZoneDefinition.getId())) {
                            outlookAppointment.setStartTimeZone(timeZoneDefinition); //TODO: do not work, maybe ews api-sided problem
                            break;
                        }
                    }

                    Date startTimeUTC = DateUtil.convertLocaleTimeToUTC(engageAppointment.getStartsAt()); //EWS always expect UTC time!
                    Date endTimeUTC = DateUtil.convertLocaleTimeToUTC(engageAppointment.getEndsAt());
                    outlookAppointment.setStart(startTimeUTC);
                    outlookAppointment.setEnd(endTimeUTC);

                    if(engageAppointment.getReminderTime() != null){
                        outlookAppointment.setIsReminderSet(true);
                        // calculate reminder minutes before start
                        int reminderMinutesBeforeStart = DateUtil.getDateDifferenceInMinutes(engageAppointment.getReminderTime(), engageAppointment.getStartsAt());
                        if (reminderMinutesBeforeStart < 0){
                            reminderMinutesBeforeStart = 0;
                        }
                        outlookAppointment.setReminderMinutesBeforeStart(reminderMinutesBeforeStart);
                    }
                    else {
                        outlookAppointment.setIsReminderSet(false);
                    }

                    outlookAppointment.setAllowNewTimeProposal(true);

                    for (String mailAddress : engageAppointment.getExternalAndInternalMailAddresses()) {
                        outlookAppointment.getRequiredAttendees().add(mailAddress);
                    }

                    try {
                        outlookAppointment.save(WellKnownFolderName.Calendar, SendInvitationsMode.SendOnlyToAll);
                    } catch(ServiceLocalException ex) {
                        if ("The time zone definition is invalid or unsupported.".equals(ex.getMessage())) {
                            logger.error("Not able to set local timezone for new exchange server appointment via ews java api.");
                        } else {
                            throw new Exception(ex);
                        }
                    }

                    ItemId itemId = outlookAppointment.getId();
                    if (itemId != null) {
                        AppointmentCorrelation corr = new AppointmentCorrelation();
                        corr.setCorrelationId(itemId.getUniqueId());
                        corr.setChangeKey(itemId.getChangeKey());
                        engageAppointment.setCorrelation(corr);
                    }
                } catch (Exception ex) {
                    logger.error("Error creating exchange server appointment", ex);
                    throw new ExchangeServerIntegrationException();
                }
            }

            return engageAppointment;
    Donnerstag, 16. Februar 2012 10:25

Antworten

  • Danke hat sich Gott sei dank schon erledigt.

    Link zu Lösung hab ich hier:

    http://social.technet.microsoft.com/Forums/en-US/exchangesvrdevelopment/thread/c6684b26-92f3-4381-9862-6187859b8d1b/#497e6df1-75ee-4358-afb2-c6e526f4ef0c

    Montag, 20. Februar 2012 17:20

Alle Antworten