Autoconfig (thunderbird) & Autodiscover (outlook) sur messagerie hébergé ISPconfig

Thunderbird et Outlook représente une grosse part de marché dans les clients de messagerie. Je m’occupe de plusieurs service de messagerie (pro, asso…) et il est bien commode pour les usagés que « ça tombe en marche » tout seul pour le paramétrage…

A savoir :

  • Thunderbird chercher les paramètres dans un XML sur http://autoconfig.votredomain.fr/mail/config-v1.1.xml
  • Outlook cherche l’enregistrement DNS _autodiscover._tcp.votredomain.fr l’url à contacter et ensuite récupère le XML : https://url_donner_dans_le_dns/Autodiscover/Autodiscover.xml

Du coup nous allons rassemblé ces 2 demandes avec un htaccess et un script PHP qui génère le bon format XML fonction de si c’est outlook our thunderbird qui demande…

Pour cela il faut :

  • Créer un site « autoconfig.votredomain.fr » (ou un alias si vous avez plusieurs site) et faire pointer l’enregistrement DNS bien sûr…
  • Créer l’enregistrement DNS SRV type :
    • _autodiscover._tcp.votredomain.fr. 3600 IN SRV 10 10 443 autoconfig.votredomain.fr.

Dans le site autoconfig.votredomain.fr il vous suffit de glisser 2 fichiers à la racine :

Fichier .htaccess contient :

RewriteEngine On
RewriteRule ^Autodiscover/Autodiscover.xml autoconfig-mail.php
RewriteRule ^mail/config-v1.1.xml autoconfig-mail.php

Fichier autoconfig-mail.php contient :

<?php

/*
By David Mercereau
Licence Beerware
*/

function extract_domain($domain) {
    if(preg_match("/(?P<domain>[a-z0-9][a-z0-9\-]{1,63}\.[a-z\.]{2,6})$/i", $domain, $matches)) {
        return $matches['domain'];
    } else {
        return $domain;
    }
}

$domain = extract_domain($_SERVER['SERVER_NAME']);
$mailServeur='mail.'.$domain;

if (preg_match('/^\/mail\/config-v1\.1\.xml/', $_SERVER['REQUEST_URI'])) {
	header('Content-Type: text/xml');
    header('Content-Type: application/xml');
	?>
<clientConfig version="1.1">
	<emailProvider id="<?= $domain ?>">
	  <domain><?= $domain ?></domain>
	  <displayName><?= $domain ?></displayName>
	  <displayShortName><?= $domain ?></displayShortName>
	  <incomingServer type="imap">
		 <hostname><?= $mailServeur ?></hostname>
		 <port>143</port>
		 <socketType>STARTTLS</socketType>
		 <username>%EMAILADDRESS%</username>
		 <authentication>password-cleartext</authentication>
	  </incomingServer>
	  <outgoingServer type="smtp">
		 <hostname><?= $mailServeur ?></hostname>
		 <port>587</port>
		 <socketType>STARTTLS</socketType>
		 <username>%EMAILADDRESS%</username>
		 <authentication>password-cleartext</authentication>
	  </outgoingServer>
	  <documentation url="https://webmail.<?= $domain ?>">
		  <descr lang="fr">Connexion Webmail</descr>
		  <descr lang="en">Webmail connexion</descr>
	  </documentation>
	  <documentation url="http://projet.retzo.net/projects/hebergement/wiki">
		<descr lang="fr">Documentation</descr>
		<descr lang="en">Generic settings page</descr>
	  </documentation>
	</emailProvider>
</clientConfig>
	<?php
} else {
	// Outlook
	//get raw POST data so we can extract the email address
	$data = file_get_contents("php://input");
	preg_match("/\<EMailAddress\>(.*?)\<\/EMailAddress\>/", $data, $matches);

	//set Content-Type
	header('Content-Type: text/xml');
    header('Content-Type: application/xml');
	echo '<?xml version="1.0" encoding="utf-8" ?>'; 
	?>
<Autodiscover xmlns="http://schemas.microsoft.com/exchange/autodiscover/responseschema/2006">
   <Response xmlns="http://schemas.microsoft.com/exchange/autodiscover/outlook/responseschema/2006a">
	   <Account>
		   <AccountType>email</AccountType>
		   <Action>settings</Action>
		   <Protocol>
			   <Type>IMAP</Type>
			   <Server><?= $mailServeur ?></Server>
			   <Port>993</Port>
			   <DomainRequired>off</DomainRequired>
			   <LoginName><?php echo $matches[1]; ?></LoginName>
			   <SPA>off</SPA>
			   <SSL>on</SSL>
			   <AuthRequired>on</AuthRequired>
		   </Protocol>
		   <Protocol>
			   <Type>POP3</Type>
			   <Server><?= $mailServeur ?></Server>
			   <Port>995</Port>
			   <DomainRequired>off</DomainRequired>
			   <LoginName><?php echo $matches[1]; ?></LoginName>
			   <SPA>off</SPA>
			   <SSL>on</SSL>
			   <AuthRequired>on</AuthRequired>
		   </Protocol>
		   <Protocol>
			   <Type>SMTP</Type>
			   <Server><?= $mailServeur ?></Server>
			   <Port>587</Port>
			   <DomainRequired>off</DomainRequired>
			   <LoginName><?php echo $matches[1]; ?></LoginName>
			   <SPA>off</SPA>
			   <Encryption>TLS</Encryption>
			   <AuthRequired>on</AuthRequired>
			   <UsePOPAuth>off</UsePOPAuth>
			   <SMTPLast>off</SMTPLast>
		   </Protocol>
	   </Account>
   </Response>
</Autodiscover>
	<?php
}

?>

Des ressources :