It is possible to use Microsoft's Office 365 with native Linux clients for mail and calendar:
- Mozilla's Thunderbird with the Lightning plugin and the EWS provider
- GNOME's Evolution
However, neither have proven reliable. The web interface is good but being browser based has meeting and new mail alert limitations. Fortunately, Office 365 has a REST API...
Some familiarity with Python is assumed.
Office 365 API 🔗
Links:
The API is not final at time of writing:
This documentation covers features that are currently in preview. For information about working with preview features, see Preview developer features on the Office 365 platform.
Reading the Calendar 🔗
This Python code uses the Calendar API to read events up to a specified number of minutes in the future:
def find_events(): now = datetime.datetime.utcnow() start_date_time = now.isoformat() future = now + datetime.timedelta(minutes=delay_mins) end_date_time = future.isoformat() query = 'startDateTime=' + start_date_time + '&endDateTime=' + end_date_time + '&$select=Subject,Start,End,Location' url = 'https://outlook.office.com/api/v1.0/me/calendarview?' print 'GET', url r = requests.get(url, auth=(user, pw)) r.raise_for_status() return r.json()
The service returns any Calendar events that intersect with the startDateTime
and endDateTime
range.
The Python Requests library is used in this sample.
Displaying Alerts 🔗
The notify-send
program is commonly used to display messages in the notification area in Linux desktop systems.
This application can be invoked from Python:
def send_message(message): subprocess.Popen(['notify-send', message])
The message will appear and fade without user intervention or focus stealing.
Notification Script 🔗
Here is a command-line proof-of-concept script:
import subprocess import requests import getpass import datetime import threading import time user = raw_input("User: ") pw = getpass.getpass() delay_mins = 5 def find_events(): now = datetime.datetime.utcnow() start_date_time = now.isoformat() future = now + datetime.timedelta(minutes=delay_mins) end_date_time = future.isoformat() query = 'startDateTime=' + start_date_time + '&endDateTime=' + end_date_time + '&$select=Subject,Start,End,Location' url = 'https://outlook.office.com/api/v1.0/me/calendarview?' print 'GET', url r = requests.get(url, auth=(user, pw)) r.raise_for_status() return r.json() def send_message(message): subprocess.Popen(['notify-send', message]) def raise_message_at(delay_seconds, message): t = threading.Timer(delay_seconds, lambda: send_message(message)) t.start() return t def process_event(evt): start_str = evt['Start'] start = datetime.datetime.strptime(start_str, '%Y-%m-%dT%H:%M:%SZ') now = datetime.datetime.utcnow() if start < now: return delay = (start - datetime.datetime.utcnow()) location = evt['Location'] location_name = location['DisplayName'] subject = evt['Subject'] print 'Alerting', subject, ' in ', delay raise_message_at(delay.seconds, location_name + ': ' + subject) while True: try: response = find_events() print response events = response['value'] for event in events: process_event(event) except Exception as e: print e time.sleep(delay_mins * 60)
There is much room for improvement.
No comments:
Post a Comment
All comments are moderated