Skip to main content

Nothing feels better than relief

The most glorious thing happened to the worst software ever. As you probably know, I’ve been on the hunt for some way to export my Exchange calendar to iCal. Google yields little. Here are the options:

  • Use Entourage
  • Use Entourage sync to iCal
  • Use Groupcal sync to iCal
  • Use Sync’Em sync to iCal

Well, Entourage just sucks. That’s all I’ll say about that. As for the others, they all fail in the same way. They are unable to reconcile differences between iCal and Exchange, and will often break syncing entirely, or start presenting duplicate/missing data. Once this happens there’s the painful process of repairing the data, then clearing one side or the other and resyncing.

Another option that I had previously used, was to use a script that would log into Exchange via IMAP and read the messages in the Calendar folder then present the content as a .ics file which I would then pull from a web server. The problem with this is that A) it’s read only and B) recent versions of Exchange don’t show any messages in the Calendar folder to parse.

Enter the Holy Grail of Exchange Access, the unsuck proxy, Davmail. Davmail is an Exchange gateway. It connects to your Exchange server and presents the data in a way that is standards compliant. For mail, that’s IMAP. For the GAL, it’s LDAP. And for calendar that’s CalDav. CalDav is the protocol that iCal, Thunderbird, Evolution, Google, Apple’s calendar server, etc. use to host editable calendars that are accessed over the network, in real time. After setting up Davmail, I can now access my Exchange calendar in iCal through Davmail’s CalDav gateway. When I create an event in iCal it is instantly reflected in Exchange. Unfortunately CalDav doesn’t support push (it is just HTTP afterall), so iCal polls the gateway every few minutes, but God, it feels great. Since iCal is editing a realtime CalDav view of my actual Exchange data rather than trying to reconcile two different copies there will be one of this corrupting the entire dataset anymore.