aboutsummaryrefslogtreecommitdiff
path: root/php/thunderbird.php
diff options
context:
space:
mode:
authorAdam Spragg <adam@spra.gg>2021-10-04 09:40:04 +0100
committerAdam Spragg <adam@spra.gg>2021-10-04 09:40:04 +0100
commitedf137a7d0a15f5b63f50392aad9927f043bf53c (patch)
tree0f7ac8467eabae62daf5406f557a2f1c088f7e06 /php/thunderbird.php
First working version of emailautoconf
Diffstat (limited to 'php/thunderbird.php')
-rw-r--r--php/thunderbird.php91
1 files changed, 91 insertions, 0 deletions
diff --git a/php/thunderbird.php b/php/thunderbird.php
new file mode 100644
index 0000000..cc35f09
--- /dev/null
+++ b/php/thunderbird.php
@@ -0,0 +1,91 @@
+<?php
+// Copyright © 2021 Adam Spragg
+//
+// This file is part of emailautoconf
+//
+// emailautoconf is free software: you can redistribute it and/or modify
+// under the terms of the GNU Lesser General Public License as published
+// by the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// emailautoconf is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with emailautoconf. If not, see
+// <https://www.gnu.org/licenses/>.
+//
+// SPDX-License-Identifier: LGPL-3.0-or-later
+
+// Thunderbird autoconfiguration described at:
+// https://wiki.mozilla.org/Thunderbird:Autoconfiguration
+// https://wiki.mozilla.org/Thunderbird:Autoconfiguration:ConfigFileFormat
+//
+// Should be installed at:
+// http://autoconfig.[domain]/mail/config-v1.1.xml
+// http://[domain]/.well-known/autoconfig/mail/config-v1.1.xml
+
+if ($_SERVER['REQUEST_URI'] == "/mail/config-v1.1.xml"
+ && preg_match('/^autoconfig\.(.*)$/', $_SERVER['HTTP_HOST'], $matches))
+{
+ $domain = $matches[1];
+}
+else if ($_SERVER['REQUEST_URI'] == "/.well-known/autoconfig/mail/config-v1.1.xml") {
+ $domain = $_SERVER['HTTP_HOST'];
+}
+else {
+ http_response_code(500);
+ header('Content-Type: text/plain');
+ echo "Unable to determine email domain from //".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
+ exit(1);
+}
+
+$IMAP = dns_get_record("_imaps._tcp.".$domain, DNS_SRV)
+ ?: dns_get_record("_imap._tcp.".$domain, DNS_SRV);
+$SMTP = dns_get_record("_submission._tcp.".$domain, DNS_SRV);
+
+if (!$IMAP || !$SMTP) {
+ http_response_code(500);
+ header('Content-Type: text/plain');
+ if (!$IMAP) {
+ echo "Missing/unavailable IMAP(S) SRV record for ".$domain;
+ }
+ if (!$SMTP) {
+ echo "Missing/unavailable Submission SRV record for ".$domain;
+ }
+ exit(1);
+}
+
+$sitename = getenv("EMAIL_SITENAME") ?: $domain;
+$shortname = getenv("EMAIL_SHORTNAME") ?: $sitename;
+
+header('Content-Type: application/xml');
+?>
+<?xml version="1.0"?>
+<clientConfig version="1.1">
+ <emailProvider id="<?= htmlspecialchars($domain, ENT_XML1) ?>">
+ <domain><?= htmlspecialchars($domain, ENT_XML1) ?></domain>
+ <displayName><?= htmlspecialchars($sitename, ENT_XML1) ?></displayName>
+ <displayShortName><?= htmlspecialchars($shortname, ENT_XML1) ?></displayShortName>
+<?php foreach ($IMAP as $srv) { ?>
+ <incomingServer type="imap">
+ <hostname><?= htmlspecialchars($srv['target'], ENT_XML1) ?></hostname>
+ <port><?= htmlspecialchars($srv['port'], ENT_XML1) ?></port>
+ <socketType>SSL</socketType>
+ <username>%EMAILLOCALPART%</username>
+ <authentication>password-cleartext</authentication>
+ </incomingServer>
+<?php } ?>
+<?php foreach ($SMTP as $srv) { ?>
+ <outgoingServer type="smtp">
+ <hostname><?= htmlspecialchars($srv['target'], ENT_XML1) ?></hostname>
+ <port><?= htmlspecialchars($srv['port'], ENT_XML1) ?></port>
+ <socketType>STARTTLS</socketType>
+ <username>%EMAILLOCALPART%</username>
+ <authentication>password-cleartext</authentication>
+ </outgoingServer>
+<?php } ?>
+ </emailProvider>
+</clientConfig>