{"id":1124,"date":"2024-06-26T21:19:53","date_gmt":"2024-06-26T19:19:53","guid":{"rendered":"https:\/\/valentijn.sessink.nl\/?p=1124"},"modified":"2024-06-30T09:02:42","modified_gmt":"2024-06-30T07:02:42","slug":"thunderbird-calendars-the-definitive-guide","status":"publish","type":"post","link":"https:\/\/valentijn.sessink.nl\/?p=1124","title":{"rendered":"Thunderbird Calendars &#8211; the definitive guide"},"content":{"rendered":"\n<p>Setting up Thunderbird calendars with a CalDAV back-end is easy. However, setting it up <em>correctly<\/em>, especially when you are working in a professional environment where colleagues share their calendars and send invitations, isn&#8217;t straightforward or well documented. Fine tuning is needed for invitations to work correctly.<\/p>\n\n\n\n<p>For as long as I&#8217;ve been using Thunderbird calendars, (previously known as Lightning), there have been complaints about calendering not working. Non working invitations, appointments getting lost &#8211; it&#8217;s all there. Here I present you a simple guide to setup Thunderbird in a multi-calendar (i.e. lots of colleagues with shared calendars) environment.<\/p>\n\n\n\n<p>What you need is:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>a CalDAV calendar server. Most well known today is <a href=\"https:\/\/nextcloud.com\/\">Nextcloud<\/a>, but also working are <a href=\"https:\/\/owncloud.com\/\">Owncloud<\/a>, <a href=\"https:\/\/sabre.io\/\">Sabre\/DAV<\/a> derivatives (<a href=\"https:\/\/fruux.com\/\">fruux<\/a> actually being the ones behind Sabre\/DAV and Sabre\/DAV being the calendering in Owncloud\/Nextcloud, as far as I can see).<\/li>\n\n\n\n<li>Obviously, you will need an account on this calendar server. You should have a username and a working password.<\/li>\n\n\n\n<li>A <a href=\"https:\/\/www.thunderbird.net\/\">Thunderbird<\/a> e-mail client &#8211; probably with a working e-mail address.<\/li>\n<\/ul>\n\n\n\n<p>First of all, you&#8217;ll probably want to <strong>check if your calendar server supports iMIP<\/strong>, where iMIP stands for e-mail invitations.<\/p>\n\n\n\n<p>The thing is: until about 2015, e-mail clients (i.e. calendar programs) used to send their own invitations to the outside world. But nowadays, most CalDAV servers do the e-mail handling server side. So please make sure your server does that, too. Then also check if your actual e-mail address is known to the calendar server. You&#8217;ll want the server to send out invitations with your.mail@example.com as sender address and not youraccount@vhost55228.serverblock.example.com &#8211; or even noreply@localhost or something.<\/p>\n\n\n\n<p>If the server does not send out mails by itself, you can tell Thunderbird to do so. But I didn&#8217;t test that and this guide is not addressing any of that. Could work, could not.<\/p>\n\n\n\n<p>OK, so you have checked the e-mail capacities of your server, now let&#8217;s add our calendar to Thunderbird.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Adding calendars<\/h2>\n\n\n\n<p>Adding calendars is pretty straightforward: go to the <code>Calendar<\/code> tab. Press the small <code>\ud83d\uddd3\ufe0f New Calendar...<\/code>button, choose <code>on the network<\/code>. Your username obviously is the username from your OwnCloud, NextCloud or Sabre\/DAV server and the URL could be something like <a href=\"https:\/\/server.example.com\/remote.php\/dav\/\">https:\/\/server.example.com\/remote.php\/dav\/<\/a> but will be different in your situation.<\/p>\n\n\n\n<p>Thunderbird will happily detect all your and all your collegues&#8217; calendars. But beware: <strong>do not press the Subscribe button<\/strong> because there is a catch: all these detected calendars, yours and your colleagues&#8217;, will be <strong>your<\/strong> own calendars for Thunderbird. So <strong>click <code>properties<\/code> for every calendar that is not your own<\/strong>;  set <strong><code>Email<\/code><\/strong> to <strong><code>None<\/code><\/strong>. You may also want to <strong>uncheck <\/strong>the<strong> <code>Show Reminders<\/code><\/strong> checkbox to prevent reminders for colleagues to show up on <em>your<\/em> computer.<\/p>\n\n\n\n<p> Should you not do this and leave your own mail address for email in your colleagues calendar, then whenever a colleague sends you an invititation, Thunderbird will see the appointment in one of <strong>&#8220;your&#8221;<\/strong> calendars (actually: in your colleagues calendar) and will tell you <strong>This message contains an event that has already been processed<\/strong>.<\/p>\n\n\n\n<p>So, having your colleagues&#8217; calender with your own mail address leads to:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>you will not see invitations by your direct colleagues;<\/li>\n\n\n\n<li>you will only see &#8220;This message contains an event that has already been processed&#8221;;<\/li>\n\n\n\n<li>your colleague will not know if you&#8217;re going to attend;<\/li>\n\n\n\n<li>and even worse: the appointments will <strong>not show up in your<\/strong>, like <em>really your<\/em>, <strong>calendar<\/strong>.<\/li>\n<\/ul>\n\n\n\n<p>For the calendars that actually <em>are<\/em> yours, keep the email identity as is or set it to one of your other mail addresses. Now Thunderbird will correctly assume that an invitation from colleague@example.com to your.mailaddress@example.com is an actual invitation &#8211; and ask you to Accept, Tentative or Decline.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">New colleague<\/h2>\n\n\n\n<p>Should a new colleague enter the building, your workflow is identical. Unfortunately, it is <em>really<\/em> identical: press again the small <code>\ud83d\uddd3\ufe0f New Calendar...<\/code>button, and again choose <code>on the network<\/code>. Re-enter your username and re-enter the URL; then also <em>re-enter the password<\/em> &#8211; even if you had Thunderbird remember that for you.<\/p>\n\n\n\n<p>You can, obviously, fetch the password first from within Thunderbird (edit, settings, Privacy &amp; Security, Saved Passwords&#8230;, right click the provider URL and click &#8220;copy password&#8221;), which saves a bit of time but not much.<\/p>\n\n\n\n<p>Thunderbird will happily find your new colleagues calendars and luckily, it will remember the other calendars so you only have to click <code>properties<\/code> for the new colleagues calendar. But you&#8217;ll have to do this for every Thunderbird installation that has to see the new shared calendar.<\/p>\n\n\n\n<p>Any new calendar, obviously, asks for the same amount of work: re-entering credentials for every Thunderbird instance that has to show the new calendar.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Workaround<\/h2>\n\n\n\n<p>Luckily, there is an add-on that helps with the password and URL. If you install the <a href=\"https:\/\/addons.thunderbird.net\/en-US\/thunderbird\/addon\/tbsync\/?src=valentijn.sessink.nl\">TbSync add-on<\/a> and the accompanying <a href=\"https:\/\/addons.thunderbird.net\/en-US\/thunderbird\/addon\/dav-4-tbsync\/?src=valentijn.sessink.nl\">Provider for CalDAV &amp; CardDav<\/a>, aka dav-4-tbsync, life becomes a tiny bit easier, but not that much. TbSync can detect new calendars all by itself; but you still need to change the Email identity for newly detected calendars and you&#8217;ll have to manually enable the newly found calendars.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Advanced preferences<\/h2>\n\n\n\n<p>Can&#8217;t this be scripted? Well, it could, but it&#8217;s not easy. Calendars are in prefs.js under <code>calendar.registry <\/code>and they are named with a random UUID string for ID. To set the email identity, you would need to <em>add<\/em> <code>imip.identity.key<\/code>, because initially, it isn&#8217;t there. This looks like so in the <code>prefs.js<\/code> file:<\/p>\n\n\n\n<p>user_pref(&#8220;calendar.registry.7f836935-d991-4727-99db-d9520747fd30.imip.identity.key&#8221;, &#8220;&#8221;);<br>user_pref(&#8220;calendar.registry.7f836935-d991-4727-99db-d9520747fd30.name&#8221;, &#8220;Colleague&#8221;);<br>user_pref(&#8220;calendar.registry.7f836935-d991-4727-99db-d9520747fd30.notifications.times&#8221;, &#8220;&#8221;);<br>user_pref(&#8220;calendar.registry.7f836935-d991-4727-99db-d9520747fd30.suppressAlarms&#8221;, true);<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Free\/busy?<\/h2>\n\n\n\n<p>Whenever you invite anyone to your appointment, Thunderbird is supposed to show their availibility. However, the only thing Thunderbird shows is a pink column that says &#8220;No Information&#8221;. I haven&#8217;t found out how to actually publish or fetch this free\/busy information.  I did, however, find Sabre\/DAV <a href=\"https:\/\/github.com\/sabre-io\/dav\/issues\/1241\">bugs<\/a> that seem to point to this <a href=\"https:\/\/github.com\/sabre-io\/dav\/issues\/1185\">issue<\/a> but also a few that seem to <a href=\"https:\/\/docs.nextcloud.com\/server\/latest\/admin_manual\/groupware\/calendar.html#freebusy\">suggest<\/a> it is <a href=\"https:\/\/github.com\/nextcloud\/server\/pull\/6715\">there<\/a> already. So I&#8217;m not sure if publishing free\/busy information is available yet, I&#8217;m tempted to think it is not. If I find out, I&#8217;ll add to this post and in case you know, please drop me a line.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Final words<\/h2>\n\n\n\n<p>There is a feature request for the <code>imip.identity.key<\/code> issue (being <code>id1<\/code>, your primary mail address, if empty), that can be found at <a href=\"https:\/\/github.com\/jobisoft\/TbSync\/issues\/678#issuecomment-2188665457\">https:\/\/github.com\/jobisoft\/TbSync\/issues\/678#issuecomment-2188665457<\/a>. I actually hope that someone with more javascript skills than I have will address it. Hopefully we&#8217;ll have working interoperable calendars for workgroups soon&#8230;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>If you&#8217;re getting a &#8220;This message contains an event that has already been processed&#8221; warning in Thunderbird invitations, this post is for you.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3,22],"tags":[195,197,196,198,9,32,194],"class_list":["post-1124","post","type-post","status-publish","format-standard","hentry","category-happy-hacking","category-vrije-software","tag-caldav","tag-ical","tag-imip","tag-lightning","tag-linux","tag-open-source","tag-thunderbird"],"_links":{"self":[{"href":"https:\/\/valentijn.sessink.nl\/index.php?rest_route=\/wp\/v2\/posts\/1124","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/valentijn.sessink.nl\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/valentijn.sessink.nl\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/valentijn.sessink.nl\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/valentijn.sessink.nl\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1124"}],"version-history":[{"count":26,"href":"https:\/\/valentijn.sessink.nl\/index.php?rest_route=\/wp\/v2\/posts\/1124\/revisions"}],"predecessor-version":[{"id":1151,"href":"https:\/\/valentijn.sessink.nl\/index.php?rest_route=\/wp\/v2\/posts\/1124\/revisions\/1151"}],"wp:attachment":[{"href":"https:\/\/valentijn.sessink.nl\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1124"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/valentijn.sessink.nl\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1124"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/valentijn.sessink.nl\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1124"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}