Comment recevoir des invitations à des réunions d'Office365, afin qu'elles puissent être analysées et ajoutées à un calendrier?


10

Comment recevoir des invitations à des réunions iCalendar (.ics ou .ical) de outlook.office365.com, afin qu'elles puissent être analysées et ajoutées à un calendrier (comme rappel + wyrd)?

J'ai cherché longtemps et durement une réponse, mais je n'en ai pas trouvé, alors je me demande si je manque juste quelque chose de vraiment trivial.

J'utilise Mutt 1.5.22 avec OfflineIMAP 6.5.5 sur Fedora 20 (Heisenbug).

Il existe de nombreux scripts pour analyser les messages iCalendar dans des formats qui peuvent être importés dans des calendriers. Ce n'est pas mon problème. Mon problème est que je ne reçois même pas de messages iCalendar, donc je n'ai rien à analyser.

Une invitation à une réunion arrive dans ma boîte de réception sous forme de message texte / html encodé en base64. Ce n'est pas un message en plusieurs parties et il n'y a pas de pièces jointes . Le corps du message contient un lien vers Microsoft Outlook Web Access (OWA). Suivre le lien ne semble rien faire sauf me conduire sur WebMail. Le reste du corps de l'e-mail contient la description de l'invitation à la réunion.

J'ai essayé de transmettre l'invitation et de transférer l'invitation en tant que pièce jointe, mais aucun de ces éléments n'a affecté le format du message.

J'ai inspecté les en-têtes du message, mais rien ne ressortait comme étant important. Je les ai copiés ici, au cas où ils signifieraient quelque chose pour quelqu'un:

Received: from [...] by [...] with Microsoft SMTP Server (TLS) id
        [...] via Mailbox Transport; [timestamp]
Received: from [...] by [...] with Microsoft SMTP Server (TLS) id
        [...]; [timestamp]
Received: from [...] by [...] with Microsoft SMTP Server (TLS) id
        [...]; [timestamp]
Received: from [...] by [...] with mapi id [...]; [timestamp]
From: [meeting organiser]
To: [meeting attendees]
Subject: [meeting subject]
Thread-Topic: [meeting subject]
Thread-Index: [...]
Sender: [sender on behalf of meeting organiser]
Date: [timestamp]
Message-ID: <[...]>
Accept-Language: en-US
Content-Language: en-US
X-MS-Exchange-Organization-AuthAs: Internal
X-MS-Exchange-Organization-AuthMechanism: 03
X-MS-Exchange-Organization-AuthSource: [...]
X-MS-Has-Attach:
X-MS-Exchange-Organization-SCL: -1
X-MS-TNEF-Correlator:
Content-Type: text/html; charset="utf-8"
Content-Transfer-Encoding: base64
MIME-Version: 1.0

J'ai également inspecté les en-têtes du message dans WebMail. Il y avait plus d'en-têtes (certains liés à tnef), mais encore une fois, rien ne semblait lié aux calendriers ou aux invitations.

J'ai comparé les en-têtes d'une "invitation à une réunion" avec les en-têtes d'un e-mail normal. La seule différence était qu'un e-mail normal contient un en-tête supplémentaire: "X-Auto-Response-Suppress: DR, RN, NRN, OOF, AutoRponse".

Le filtre de dossier de mon .offlineimaprc est configuré pour ne pas synchroniser le dossier Calendrier. En effet, chaque fois que OfflineIMAP tentait de se synchroniser, il se produisait dans plus d'une centaine d'instances de la même erreur lors de la synchronisation du dossier Calendrier: "ERREUR: le serveur IMAP 'distant' n'a pas de message avec l'UID '[...]' . "

Utilisation de l'imaplib de Python pour inspecter le dossier Calendrier:

>>> import imaplib
>>> i = imaplib.IMAP4_SSL("outlook.office365.com", 993)
>>> i.login("NAME@COMPANY.com", "PASSWORD")
('OK', ['LOGIN completed.'])
>>> i.select("Calendar")
('OK', ['159'])
>>> i.fetch(159, "(RFC822)")
('OK', [None])
>>> i.fetch(159, "(RFC822)")

La deuxième fois que j'appelle chercher, il renvoie un message: "Le serveur n'a pas pu récupérer le message suivant. Le message n'a pas été supprimé. Vous pourrez peut-être l'afficher à l'aide d'Outlook ou d'Outlook Web App. Vous pouvez également contacter l'expéditeur pour savoir ce que dit le message. "

Dans WebMail, je constate que le dossier Calendrier (accessible via l'onglet Calendrier) dispose d'autorisations de visibilité en dehors de l'organisation . Il est actuellement défini sur "Non partagé". Les autres options sont "Disponibilité uniquement", "Détails limités" ou "Détails complets". Définir les autorisations sur "Détails complets", puis m'envoyer une invitation à une réunion n'a eu aucun effet sur le format de l'invitation à la réunion.

Comme solution de contournement pour ne pas recevoir de message iCalendar, j'ai Thunderbird ouvert avec le module complémentaire Lightning. D'une manière ou d'une autre, le module complémentaire Lightning sait comment recevoir des invitations à des réunions. Les messages apparaissent toujours sous forme de texte / html, mais il y a un lien dans la barre d'état de Thunderbird. En cliquant dessus, une invite vous demande si vous souhaitez refuser ou accepter l'invitation.

Quelqu'un a-t-il une idée de la raison pour laquelle les invitations à des réunions d'Outlook 365 arrivent sous la forme de simples messages texte / html plutôt que de messages iCalendar? Y a-t'il quelque chose que je puisse faire? Si le module complémentaire Lightning peut fonctionner avec les invitations, il doit y avoir une solution, telle que l'utilisation des services Web Microsoft Exchange (EWS). Si la solution me demande de coder un outil, tant pis. Un effort dans la bonne direction serait grandement apprécié.



1
@SEoF J'ai converti votre réponse en un commentaire donnant le lien auquel vous faisiez référence. Étant donné que le rés de votre réponse expliquait ce qui ne fonctionnait pas pour vous, je l'ai supprimé. Veuillez ne publier que des réponses qui expliquent réellement comment résoudre un problème, les liens vers des ressources externes ne sont pas considérés comme des réponses.
terdon

Réponses:


3

Vous pouvez le configurer pour qu'Office 365 / Outlook envoie des invitations formatées au format iCalendar via l'interface Web.

  1. Connectez-vous à votre compte Office 365
  2. Ouvrir l'application de messagerie (Outlook)
  3. Appuyez sur l'icône d'engrenage dans le coin supérieur droit (paramètres)
  4. Dans la zone de recherche, tapez "imap"
  5. Sélectionnez "Pop et IMAP"
  6. En bas, sélectionnez "Envoyer des invitations à des événements au format iCalendar" pour POP et / ou IMAP.
  7. Appuyez sur "Enregistrer"

Vous devriez maintenant recevoir toutes les invitations au format iCalendar.


J'en ai eu assez d'essayer de travailler avec des pièces jointes pour écrire mon propre calendrier Outlook pour rappeler le programme d'exportation. Il appelle directement l'API Office-365 et peut générer diverses choses, notamment rappeler des entrées formatées. Je l'ai nommé ihol (I Hate OutLook) .. github.com/eikenb/ihol
John Eikenberry

1

Le lien fourni par SEoF était une excellente suggestion. Le blog est incomplet, à mon avis, mais il m'a permis de commencer sur la bonne voie. J'ai creusé un peu plus et j'ai trouvé une liste complète des étapes pour que Office 365 m'envoie des invitations à des réunions au format iCalendar (.ics).

Notez que je ne suis pas administrateur et que je n'ai eu besoin de contacter personne pour me donner des privilèges. La seule mise en garde est que vous devez avoir accès à une boîte Windows. Une fois que vous avez modifié les paramètres via Windows, vous pouvez recommencer à utiliser le système d'exploitation que vous utilisiez auparavant. J'ai fait ce qui suit par moi-même en tant qu'utilisateur normal avec Windows 7:

  1. Téléchargez et installez Microsoft .NET Framework 4.5 à partir de http://www.microsoft.com/en-us/download/details.aspx?id=30653 .
  2. Téléchargez et installez Windows Management Framework 4.0 (Windows6.1-KB2819745-x64-MultiPkg.msu) à partir de http://www.microsoft.com/en-us/download/details.aspx?id=40855 .
  3. Exécutez PowerShell en tant qu'administrateur.
  4. Set-ExecutionPolicy -ExecutionPolicy RemoteSigned
  5. $ UserCredential = Get-Credential
    • Saisissez votre adresse e-mail et votre mot de passe.
  6. $ Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://outlook.office365.com/powershell-liveid/ -Credential $ UserCredential -Authentication Basic -AllowRedirection
  7. $ ImportResults = Import-PSSession $ Session
  8. Get-CASMailbox -identity YOUR@EMAIL.ADDRESS | Format-List
  9. Set-CASMailbox -identity YOUR@EMAIL.ADDRESS -PopUseProtocolDefaults: $ FALSE -ImapUseProtocolDefaults: $ FALSE -PopForceICalForCalendarRetrievalOption: $ TRUE -ImapForceICalForCalendarRetrievalOption: $ TRUE
  10. Remove-PSSession $ Session
  11. Set-ExecutionPolicy -ExecutionPolicy Restreint

Maintenant, mon mutt sur Linux récupère les invitations aux réunions au format iCalendar (.ics).


Cela a parfaitement fonctionné. Merci pour les instructions détaillées.
Jason Day

0

Pas exactement ce qu'OP a demandé, mais si la logique tierce est autorisée, alors consultez le fantastique échange (python). Exemple rapide py3 de récupération d'événements pour les 3 prochains mois (notez que les éléments récurrents ont été étendus):

import arrow  # not required, but highly recommended lib for time processing
import base64
from tzlocal import get_localzone
from subprocess import call

from exchangelib import DELEGATE, Account, Credentials, EWSDateTime

CREDENTIALS = Credentials(username='mymail@company.com', password='topsecret')
ACCOUNT = Account(primary_smtp_address='mymail@company.com', credentials=CREDENTIALS,
                autodiscover=True, access_type=DELEGATE)

def sanitize(p):
    '''some .ical files didn't have proper end:vcalendar closure'''
    end = 'END:VCALENDAR\n'
    s = base64.b64decode(p).decode().replace("\r\n", "\n")
    if not s.endswith(end):
        s += end

    return s

tz = get_localzone()
now = arrow.now()
upper_limit = now.replace(months=+3)
items = ACCOUNT.calendar.view(
    start=tz.localize(EWSDateTime(now.year, now.month, now.day)),
    end=tz.localize(EWSDateTime(upper_limit.year, upper_limit.month, upper_limit.day)),
)

cals = []  # list of .ical files' contents
for item in items:
    cals.append(sanitize(item.mime_content))

Une autre bonne bibliothèque est github.com/Narcolapser/python-o365
John Eikenberry
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.