Thunderbird zentral konfigurieren: Mission Control Desktop AKA AutoConfig
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: