iCalendar non crea un evento per l’organizzatore

Sto cercando di creare un evento nel mio calendario Microsoft Outlook utilizzando lo standard iCalendar. Ho inviato un’e-mail con tipo di contenuto “text / calendar” alla mia cassetta postale di Exchange dall’applicazione .NET. Arriva a Outlook come richiesta di riunione. Tutto sembra a posto, fino al momento in cui faccio clic sulla richiesta di riunione ricevuta, Outlook lo visualizza come una vista del calendario vuota con il testo: “La riunione non può essere trovata nel calendario” . Non capisco perché – volevo creare un evento e sta cercando di trovarne alcuni esistenti?

Se invio esattamente la stessa email a chiunque partecipi all’incontro tranne l’organizzatore, crea un evento nei loro calendari e tutto sembra essere ok. Ho scoperto che è causato dalla proprietà “ORGANIZZATORE”. Se è impostato sull’e-mail dell’organizzatore (la mia e-mail) e invio una richiesta di riunione a me stesso, non viene creato un evento con le informazioni “Imansible trovare la riunione nel calendario”.

Quindi la domanda è: perché non crea un evento per l’organizzatore? L’organizzatore deve avere quell’evento creato per essere informato dagli altri partecipanti se ha accettato o cancellato la riunione.

Ecco l’iCalendar:

BEGIN:VCALENDAR PRODID:-//Company//Product 3.0//EN VERSION:2.0 CALSCALE:GREGORIAN METHOD:REQUEST BEGIN:VEVENT DTSTART:20130225T200000Z DTEND:20130225T203000Z DTSTAMP:20130225T143039Z ORGANIZER;CN="John Doe":mailto:john.doe@domain.com UID:20130225T143039Z@domain.com ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;RSVP=TRUE;CN="John Smith" ;X-NUM-GUESTS=0:mailto:john.smith@domain.com CLASS:PUBLIC CREATED:20130225T143039Z DESCRIPTION: LAST-MODIFIED:20130225T143039Z LOCATION: SEQUENCE:0 STATUS:CONFIRMED SUMMARY:Booking test TRANSP:OPAQUE END:VEVENT END:VCALENDAR 

Diciamo che l’organizzatore desidera creare un incontro per 2 partecipanti. Compila un modulo nel sistema di prenotazione. Il sistema di prenotazione invia e-mail contenente lo standard iCalendar a se stesso e ai 2 partecipanti alla riunione.

Questo scenario non funziona.

Non è ansible creare un evento (object riunione cancellabile) nel calendario dell’organizzatore. Il cliente ritiene che l’email contenente il formato iCalendar sia solo una notifica per il partecipante alla riunione già creata nel calendario dell’agenda elettronica. Se tale e-mail arriva alla casella di posta dell’organizzatore, l’app client non crea un evento nel calendario dell’organizzatore. Presume che un evento sia stato creato dall’organizzatore stesso. Ad esempio: Outlook ti dice in quel caso che “La riunione non può essere trovata nel calendario”.

Se chiedi supporto a Microsoft, ti dicono solo che non supportano gli open standard: http://support.microsoft.com/kb/2269506

La soluzione di lavoro a questo problema consiste nell’utilizzare servizi di piattaforma (servizi Web di Exchange o API di Google Calendar ) per creare un evento nel calendario dell’agenda elettronica. Dimentica lo standard iCalendar. I servizi possono essere configurati per l’invio automatico di notifiche ai partecipanti. Quindi è sufficiente passare ” SendInvitationsMode.SendToAllAndSaveCopy ” se stai usando EWS:

 Appointment appointment = new Appointment(service); appointment.Subject = "Status Meeting"; appointment.Body = "The purpose of this meeting is to discuss status."; appointment.Start = new DateTime(2014, 3, 1, 9, 0, 0); appointment.End = appointment.Start.AddHours(2); appointment.Location = "Conf Room"; appointment.RequiredAttendees.Add("user1@contoso.com"); appointment.RequiredAttendees.Add("user2@contoso.com"); appointment.OptionalAttendees.Add("user3@contoso.com"); appointment.Save(SendInvitationsMode.SendToAllAndSaveCopy); 

o impostare il parametro ” sendNotifications ” su true in caso di API di Google Calendar.

Non è necessario inviare un’e-mail a ciascun partecipante in particolare.

Questo è un po ‘un vecchio problema, ma penso che sia causato dall’uso di METHOD: REQUEST Questo indica che l’ical dovrebbe essere aggiornato, non che si tratta di un nuovo elemento. Invece, usa METHOD: PUBLISH

Posso confermare che funziona con i calendari di DDay.iCal e Outlook.

Questo mi ha fatto impazzire per una settimana, quindi è bello vedere qualcun altro che conferma ciò che sospettavo. C’è in realtà una soluzione relativamente semplice, che risolve la domanda, anche se non è molto elegante. Posso capire perché non ci si può permettere di prendere il ruolo di Organizzatore da una fonte esterna, ma è fastidioso che non si possa.

Invia 2 inviti. Uno per te (o chiunque sia l’organizzatore) e poi uno diverso per tutti gli altri.

Quello a te dovrebbe avere qualcos’altro oltre a te come ORGANSISER, ad es. ORGANIZZATORE: donotreply@outlook.com

Quello a tutti gli altri dovrebbe avere la tua e-mail come organizzatore.

Perché questo approccio funzioni, devi impostare METHOD: REQUEST. Se lo imposti su PUBLISH otterrai duplicati sugli aggiornamenti.

Questo approccio ti consente di ottenere la riunione nel tuo diario e ricevere anche le risposte (per ottenere le risposte è necessario includere la seguente riga per ciascun partecipante: ATTENDEE; CN = “The Name”; RSVP = TRUE: mailto: the_email@address.com .)

Si noti che l’UID è uguale per entrambe le versioni del file. È utile se l’ORGANIZZATORE riceve prima l’invito, in modo che possa accettarlo prima che inizi a ricevere le risposte, altrimenti le persone risponderanno a qualcosa che in realtà non esiste ancora. Ciò non impedisce loro di accettare l’invito, ma potrebbe essere un po ‘di confusione per l’ORGANIZZATORE. Per aiutare con questo ho messo un leggero ritardo tra e-mail 1 e 2.

Suppongo che il tuo problema sia dovuto al fatto che Exchange presuppone che l’organizzatore dell’evento sia anche il creatore dell’evento. Che sembra abbastanza giusto, altrimenti sarebbe un gioco da ragazzi mandare le riunioni alle persone che fanno di loro l’organizzatore e sarebbero aggiunte automaticamente al calendario della persona.

Detto questo, non ho idea di come risolvere il problema.

il comportamento dell’invito all’evento inviato via e-mail è descritto in rfc6047 che estende ulteriormente l’RFID icalendar (RFC5545).

la sezione 2 e la sezione 3 sulla sicurezza riassumono due minacce di spoofing:

spoofing di “Organizer” e spoofing di un “Partecipante”

questo è

spoof@xyz.example.net non è autorizzato a modificare o annullare una riunione organizzata da a@example.com.

al tuo caso: 1. hai inviato l’invito dallo stesso indirizzo e-mail del tuo scambio (parlando del From: nella mail non l’ Organizer:mailto ? se non fosse utile provare a inviarlo tramite l’indirizzo di scambio. dovrebbe sopra non funzionare, per soddisfare la necessità per l’organizzatore di avere l’invito nel suo calendario, probabilmente sarà necessario aggiungerlo programmaticamente nell’agenda dell’agenda in quanto è probabile che il CUA (Calendar User Agent) o Exchange non consenta un Mailer di terze parti per aggiungere eventi nell’agenda senza l’utilizzo dell’interfaccia utente dell’utente finale.

Negli ultimi mesi, il nostro servizio ha anche lo stesso problema: il nostro servizio crea il calendario delle riunioni per l’organizzatore e i partecipanti, se i partecipanti contengono l’organizzatore, l’organizzatore (come un atteendee) può ricevere un’e-mail di calendario, ma non può ricevere / rifiutare la riunione (il pulsante è disabilitato) né vederlo nel calendario (nessun evento del calendario).

infine, mi accorgo che solo quando nella seguente condizione ciò avverrà: 1. mail.Da = organizzatore 2. Ateendees.contains (organizer) // case-insensitive.

Quindi, cambio semplicemente il mio codice in follwing, e funziona bene per tutti i partecipanti (includi l’organizzatore):

 if (!attendeeEmail.ToLower().Contains(organizer.Address.ToLower())) { message.From = organizer; } else { //such as your actual email sender, in our case, our mail sender use another email, //say ActualSender,and if leave empty, then our mail sender will fill as: message.From = ActualSenderEmail; }