Ab einer gewissen Zahl zu betreuender Thunderbird-Installation wünscht man sich schnell eine zentrale Konfigurationsmöglichkeit. Mit AutoConf könnte man zumindest die Einrichtung des Mailkontos vereinfachen, aber Wörterbücher, Plugins und sonstige Einstellungen können so nicht verwaltet werden. Für Firefox bietet Mozilla ADMX Templates für Group Policies an. Für Thunderbird gibt es meines Wissen nur 3rd Party Addon-Lösungen. Aber auch mit Thunderbird-Bordmitteln ist eine zentrale Konfiguration möglich, man benötigt nicht einmal ein Active Directory und es funktioniert Plattformübergreifend.

Hilfreich ist ein Tool um Software zentral zu deployen. Ich nutze hierzu WPKG. Neben der eigentlichen Installation von Thunderbird benötigt man ein paar zusätzliche Dateien, die auf jeden Client gespielt werden müssen.

Die erste Datei wird im Unterordner ./defaults/prefs/ des Thunderbird-Installationsverzeichnis abgelegt. Der Name der Datei ist frei wählbar, z.B. 21x9_prefs.js. Der Inhalt lautet wie folgt:

pref("general.config.obscure_value", 0);
pref("general.config.filename", "thunderbird.js");

Die Datei thunderbird.js wird direkt in das Thunderbird-Installationsverzeichnis gelegt:

// thunderbird.js

try {
  lockPref("autoadmin.global_config_url","file://smb/wpkg/software/thunderbird/global_settings.js");
  lockPref("autoadmin.refresh_interval", 1440);
} catch(e) {
  displayError("thunderbird.js", e);
}

Warum man hier zwei Dateien benötigt weiß wohl nur Mozilla, jedenfalls ist es nicht möglich autoadmin.global_config_url direkt in der 21x9_prefs.js zu setzen. Auch warum man mit seinem Code erst ab der zweiten Zeile beginnen darf, erschließt sich mir nicht wirklich. Wer keinen Fileserver hat/nutzen möchte kann auch ein beliebiges anderes Protokoll angeben, welches Thunderbird unterstützt, also z.B. https://.

Der Parameter autoadmin.refresh_interval gibt die Zeit in Minuten an, in der Thunderbird nach Veränderungen an der zentralen Konfigurationsdatei suchen soll.

Ab hier sind im Grunde keine lokalen Anpassungen pro Client mehr nötig. Allerdings müssen eventuell gewünschte Wörterbücher und Addons in die entsprechenden Verzeichnisse befördert werden, bei mir übernimmt das WPKG. Addons werden (in entpackter Form) im Unterverzeichnis ./addons der Thunderbird-Installation abgelegt. Wörterbücher (ebenfalls in entpackter Form) in ./dictionaries. Beides geht natürlich auch ohne 21x9-prefs.js und thunderbird.js.

Aber zurück zu unserer zentralen Konfigurationsdatei global_settings.js. Hier kann man jetzt alles tun, was man auch direkt in der 21x9_prefs.js tun könnte, nur eben an einer zentralen Stelle. Die möglichen Einstellungen entsprechen denen in about:config. Folgende Funktionen stehen zur Verfügung:

  • pref: Einstellung wird gesetzt
  • lockPref: Einstellung wird gesetzt und kann vom Benutzer nicht geändert werden
  • defaultPref: Einstellung wird nur dann gesetzt wenn der Benutzer keine abweichenden, eigenen, Einstellungen vorgenommen hat

Außerdem stehen folgende Funktionen zur Verfügung:

Funktionsname Parameter Funktion
getPrefBranch() Keine Liefert die Wurzel des Einstellungsbaums zurück
pref prefName, value Setzt die Einstellung prefName auf value
defaultPref prefName, value Setzt die Default-Einstellung (Einstellung wird nur geändert, wenn der Benutzer keine eigene Einstellung vorgenommen hat.)
lockPref prefName, value Setzt die Einstellung und macht sie nur Lesbar (Benutzer kann sie nicht ändern.)
unlockPref prefName Macht eine nur Lesbare-Einstellung wieder schreibbar (Ohne den Wert zu ändern.)
getPref prefName Liefert den Wert von prefName zurück
getLDAPAttributes host, base, filter, attribs) Holt die angegebenen LDAP-Attribute vom angegebenen Server
getLDAPValue str, key Holt die angegebenen LDAP-Werte, gefiltert durch den angegebenen key
displayError funcname, message Zeigt einen Fehlerdialog an
getenv name Liest die angegebene Umgebungsvariable aus

Eine global_settings.js könnte dann wie folgt aussehen:

// global_settings.js

try {

  var userInfo = new Object();

  if(getenv("USER") != "") {
    // *NIX settings
    userInfo.envUser = getenv("USER");
  } else {
    // Windows settings
    userInfo.envUser = getenv("USERNAME");
  }

  // create account
  // Identity
  defaultPref("mail.identity.id1.fullName", userInfo.envUser ); // envUser enthält den Benutzernamen, nicht den Vor- und Nachnamen, aber als Beispiel soll es reichen.
  defaultPref("mail.identity.id1.smtpServer", "smtp1" );
  lockPref("mail.identity.id1.useremail", userInfo.envUser + "@example.com" );
  lockPref("mail.identity.id1.organization", "example.com" );
  defaultPref("mail.identity.id1.archive_enabled", false );
  defaultPref("mail.identity.id1.htmlSigText", "Mit freundlichen Grüßen\r\n" + userInfo.envUser + "\r\n");

  defaultPref("mail.server.server1.purgeSpam", true);
  defaultPref("mail.server.server1.moveOnSpam", true);

  defaultPref("mail.spam.manualMark", true);
  defaultPref("mail.spam.markAsReadOnSpam", false);

  // IMAP server settings
  defaultPref("mail.server.server1.hostname", "mx0.example.com" );
  defaultPref("mail.server.server1.name", userInfo.mail );
  defaultPref("mail.server.server1.port", 143 );
  defaultPref("mail.server.server1.socketType", 2 );
  defaultPref("mail.server.server1.type", "imap" );
  defaultPref("mail.server.server1.userName", userInfo.envUser );
  defaultPref("mail.server.server1.using_subscription", false ); //show all folder not only subscribed ones
  defaultPref("mail.server.server1.spamActionTargetAccount", "imap://" + encodeURIComponent(userInfo.mail) + "@mx0.example.com" );
  defaultPref("mail.server.server1.spamActionTargetFolder", "mailbox://" + encodeURIComponent(userInfo.mail) + "@mx0.example.com/Junk" );

  // SMTP server settings
  defaultPref("mail.smtpserver.smtp1.authMethod", 3 );
  defaultPref("mail.smtpserver.smtp1.description", "example.com" );
  defaultPref("mail.smtpserver.smtp1.hostname", "mx0.example.com" );
  defaultPref("mail.smtpserver.smtp1.port", 587 );
  defaultPref("mail.smtpserver.smtp1.try_ssl", 2 );
  defaultPref("mail.smtpserver.smtp1.username", userInfo.envName );

  // Glue it all together
  defaultPref("mail.account.account1.identities", "id1" );
  defaultPref("mail.account.account1.server", "server1" );
  defaultPref("mail.accountmanager.accounts", "account1" );
  defaultPref("mail.accountmanager.defaultaccount", "account1" );
  defaultPref("mail.smtp.defaultserver", "smtp1" );
  defaultPref("mail.smtpservers", "smtp1" );

  // Configure the Users Directory as LDAP from AD
  defaultPref("ldap_2.servers.intern.auth.dn", "");
  defaultPref("ldap_2.servers.intern.description", "example.com" );
  defaultPref("ldap_2.servers.intern.uri", "ldap://192.168.1.10/cn=Users,dc=example,dc=localdomain??sub?(mail=*)" );

  // Set the default ldap auto completion to the Example Directory
  defaultPref("ldap_2.autoComplete.directoryServer", "ldap_2.servers.intern");
  defaultPref("ldap_2.autoComplete.useDirectory", true);

  // Options -> Advanced -> Update -> Automatically check for updates to : Installed Extensions and Themes
  lockPref("extensions.update.enabled", false);
  lockPref("extensions.update.autoUpdateDefault", false);

  // Options -> Advanced -> Update -> Automatically check for updates to : Thunderbird
  pref("app.update.enabled", false);
  pref("app.update.autoUpdateEnabled", false);

  // Options -> Advanced -> Update -> Automatically check for updates to : Search Engines
  pref("browser.search.update", false);

  // stops the request to send performance data
  pref("toolkit.telemetry.enabled", false);
  // stops the request to send performance data from displaying
  pref("toolkit.telemetry.prompted", 2);

  // To prevent the "Know Your Rights" info bar at the bottom of the application, use:
  pref("mail.rights.version", 1);

  // To prevent the Migration Assistant and the What's New page from showing after upgrades, use:
  pref("mail.ui.show.migration.on.upgrade", false);
  pref("app.update.showInstalledUI", false);
  pref("browser.startup.homepage_override.mstone", "ignore");
  pref("mailnews.start_page_override.mstone", "ignore");

  pref("mail.fixed_width_messages", false);
  pref("mailnews.display.html_as", 3);
  lockPref("mailnews.start_page.url", "https://www.21x9.org"); // enter an alternativ start url

  // Disable Flash plugin
  lockPref("plugin.state.flash", 0);

  // Disable FileLink
  lockPref("mail.compose.big_attachments.notify", false);

  // "Disable" Breakpad (Error Reporting)
  pref("breakpad.reportURL", "");

  //enable extensions by default
  defaultPref("extensions.enabledAddons", "{e2fda1a4-762b-4020-b5ad-a41df1933103}" );

  // Create CalDAV-Calendar in Lightning
  defaultPref("calendar.registry.2e90ea26-8363-4d3a-ba69-5438f7b5e64f.cache.enabled",true);
  defaultPref("calendar.registry.2e90ea26-8363-4d3a-ba69-5438f7b5e64f.calendar-main-default",true);
  defaultPref("calendar.registry.2e90ea26-8363-4d3a-ba69-5438f7b5e64f.calendar-main-in-composite",true);
  defaultPref("calendar.registry.2e90ea26-8363-4d3a-ba69-5438f7b5e64f.color","#009bea");
  defaultPref("calendar.registry.2e90ea26-8363-4d3a-ba69-5438f7b5e64f.imip.identity.key","id1");
  defaultPref("calendar.registry.2e90ea26-8363-4d3a-ba69-5438f7b5e64f.name", userInfo.envUser);
  defaultPref("calendar.registry.2e90ea26-8363-4d3a-ba69-5438f7b5e64f.suppressAlarms",true);
  defaultPref("calendar.registry.2e90ea26-8363-4d3a-ba69-5438f7b5e64f.type","caldav");
  defaultPref("calendar.registry.2e90ea26-8363-4d3a-ba69-5438f7b5e64f.uri","https://example.com/dav/"+userInfo.envUser+"/Calendar/personal/");
  defaultPref("calendar.timezone.local","Europe/Berlin");

} catch(e) {
  displayError("global_settings.js", e);
}

Die in der Zeile defaultPref("extensions.enabledAddons"... erwähnten AddOns installieren sich nicht automatisch sondern werden nur Aktiv geschaltet, sie müssen sich hierzu bereits in entpackter Form im ./addons-Unterverzeichnis von Thunderbird befinden.

Wie bereits im Kommentar in der Zeile defaultPref("mail.identity.id1.fullName", userInfo.envUser ); angemerkt: userInfo.envUser enthält den Benutzernamen, der in den meisten Fällen nicht der Vor- und Nachname sein dürfte (schon gar nicht mit Leerzeichen). Daher empfiehlt es sich, sofern vorhanden, die entsprechenden Werte (ggf. auch noch die Adresse, Telefonnummer, etc. für die Mailsignatur) aus einen LDAP-Verzeichnis oder einem Active Directory auszulesen.

Entsprechende Beispiele hierfür finden sich unter:


Kommentare

Kommentare unterstützt von Disqus.

Nächster Beitrag Vorheriger Beitrag