Autodiscover dei parametri di posta elettronica

Chi non desidererebbe che ogni volta dobbiamo aggiungere un account di posta elettronica da qualche parte tutti i parametri si auto-configurino senza farci perdere tempo?
In questo post descriverò come si possono implementare diverse strategie per fare in modo che l’utente finale non debba impazzire ogni volta debba configurare un account di posta nuovo sul suo pc.
Esistono tantissimi client per leggere la posta elettronica, sono riuscito ad automatizzare la configurazione dei parametri per questi:

  • Microsoft Outlook
  • Mozilla Thunderbird
  • iPhone e iPad

Microsoft Outlook

Microsoft Outlook sfrutta un meccanismo chiamato autodiscover, in dettaglio, se da Outlook facciamo aggiungi account, ci viene chiesto in un primo step solo l’indirizzo mail e la password.
Dopo aver inserito questi due valori Outlook taglia l’indirizzo mail in due parti, account e dominio e fa una query DNS di tipo SRV sul nome autodiscover per individuare il server dove poter scaricare il file di configurazione autodiscover.xml.
Il primo step quindi è inserire un record SRV _autodiscover._tcp.dominio.it contenente il nome host e la porta dove abbiamo pubblicato in HTTPS questo file (supporta esclusivamente HTTPS, se il certificato che avete non è trustato da una CA valida, vi appare un box di avviso).
Se questo record esiste, Outlook farà una richiesta in HTTPS a questo URL: https://nomeserver/autodiscover/autodiscover.xml passando in POST alla richiesta l’account mail per il quale richiediamo le impostazioni.
Possiamo mettere un file xml statico se abbiamo un mail server che gestisce un singolo dominio oppure scrivere una pagina php che ci restituisca l’xml elaborato, truccando il tutto con modrewrite di Apache, ecco come ho scritto il codice php che restituisce i parametri in funzione dell’account scritto in Outlook; questo è il file .htaccess:

Options +SymLinksIfOwnerMatch
RewriteEngine on

RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ autodiscover.php [NC,L]

E questo è il codice PHP che restituisce in output un XML in base all’account mail che riceve in POST:

<?php
  $data = file_get_contents("php://input");
  preg_match("/\<EMailAddress\>(.*?)\<\/EMailAddress\>/", $data, $matches);
  header("Content-Type: application/xml");
  list($account, $domain) = split('@' ,$matches[1]);
?>
<?php 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>POP3</Type>
     <Server><?php echo 'pop.'.$domain; ?></Server>
     <Port>110</Port>
     <LoginName><?php echo $matches[1]; ?></LoginName>
     <DomainRequired>off</DomainRequired>
     <SPA>off</SPA>
     <SSL>off</SSL>
     <AuthRequired>on</AuthRequired>
     <DomainRequired>off</DomainRequired>
    </Protocol>
    <Protocol>
     <Type>IMAP</Type>
     <Server><?php echo 'pop.'.$domain; ?></Server>
     <Port>143</Port>
     <DomainRequired>off</DomainRequired>
     <LoginName><?php echo $matches[1]; ?></LoginName>
     <SPA>off</SPA>
     <SSL>off</SSL>
     <AuthRequired>on</AuthRequired>
    </Protocol>
    <Protocol>
     <Type>SMTP</Type>
     <Server><?php echo 'mail.'.$domain; ?></Server>
     <Port>587</Port>
     <DomainRequired>off</DomainRequired>
     <LoginName><?php echo $matches[1]; ?></LoginName>
     <SPA>off</SPA>
     <SSL>off</SSL>
     <AuthRequired>on</AuthRequired>
     <UsePOPAuth>on</UsePOPAuth>
     <SMTPLast>off</SMTPLast>
    </Protocol>
   </Account>
 </Response>
</Autodiscover>

Mozilla Thunderbird

Anche Thunderbird utilizza un meccanismo molto simile ad Outlook; seppur con qualche piccola differenza tecnica, il concetto rimane il medesimo.
Aggiungendo un account in Thunderbird come per Outlook, la prima richiesta è quella di inserire indirizzo mail e password.

Successivamente il programma dividerà la mail in account e dominio e farà una query DNS per il record A autoconfig.dominio.it.
Successivamente, se il record esiste, proverà a scaricare i parametri con una richiesta HTTP all’url: http://autoconfig.dominio.it/mail/config-v1.1.xml passando in GET l’indirizzo mail da configurare.
Anche qui ho implementato una pagina PHP che restituisce l’XML corretto in base alla mail che viene passata in GET, ecco il codice nel file config-v1.1.php:

<?php
  header("Content-Type: application/xml");
  $data = $_GET["emailaddress"];
  list($account, $domain) = split('@', $data);
?>
<?php echo '<?xml version="1.0" encoding="utf-8" ?>'; ?>
 <clientConfig version="1.1">
  <emailProvider id="dominio.it">
   <domain><?php echo $domain; ?></domain>
   <displayName>Creso Mail Server</displayName>
   <displayShortName>cresosrl.it</displayShortName>

   <incomingServer type="pop">
    <hostname><?php echo 'pop.'.$domain; ?></hostname>
    <port>110</port>
    <socketType>plain</socketType>
    <username><?php echo $data; ?></username>
    <authentication>password-cleartext</authentication>
   </incomingServer>

   <incomingServer type="imap">
    <hostname><?php echo 'pop.'.$domain; ?></hostname>
    <port>110</port>
    <socketType>plain</socketType>
    <username><?php echo $data; ?></username>
    <authentication>password-cleartext</authentication>
   </incomingServer>

   <outgoingServer type="smtp">
    <hostname><?php echo 'mail.'.$domain; ?></hostname>
    <port>587</port>
    <socketType>plain</socketType>
    <username><?php echo $data; ?></username>
    <authentication>password-cleartext</authentication>
    <addThisServer>true</addThisServer>
    <useGlobalPreferredServer>true</useGlobalPreferredServer>
   </outgoingServer>

   <identity></identity>
  </emailProvider>
 </emailProvider>
</clientConfig>

Ed il file .htaccess che serve a mascherare l’XML dietro al PHP:

Options +SymLinksIfOwnerMatch
RewriteEngine on

RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ config-v1.1.php [NC,L]

iPhone e iPad

Infine abbiamo la possibilità di configurare anche iPhone e iPad in maniera semplificata attraverso la creazione di file con estensione .mobileconfig.
I file mobileconfig sono sostanzialmente dei file XML che una volta scaricati da Safari, vengono installati nella sezione Profili del dispositivo e possono contenere le configurazioni di molte cose.

L’obbiettivo dei file .mobileconfig è quello di deployare una configurazione aziendale standard in maniera veloce sui dispositivi con iOS.
In questo caso il meccanismo è diverso da come verrebbe naturale fare, non dobbiamo andare su Impostazioni -> Posta contatti calendari per aggiungere un account di posta ma dobbiamo aprire safari e raggiungere un URL a piacere dove un form ci chiederà l’indirizzo email da configurare, ad esempio io ho creato un indirizzo http://mail.dominio.it/apple per facilitare l’utente.

Ecco l’homepage (index.php):

<form action="dominio.mobileconfig" method="POST">
 <header>
  <h2>Creso Mail</h2>
 </header>
 <div id="forms">
  Indirizo email:<br>
   <input type="email" name="emailaddress" required placeholder="[email protected]" >
 </div>
 <br>
 <input type="submit" value="Installa sul dispositivo" />
</form>

Ecco il file getmobileconfig.php:

<?php
  $data = file_get_contents("php://input");
  list($var, $account) = split('=', strtolower($data));
  header("Content-Type: application/xml");
  $mail = str_replace('%40', '@', $account);
  list($account, $domain) = split('@', $mail);
?>
<?php echo '<?xml version="1.0" encoding="utf-8" ?>'; ?>
<!DOCTYPE plist PUBLIC "-//Apple/DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">

<plist version="1.0">
<dict>
 <key>PayloadContent</key>
  <array>
   <dict>
    <key>PayloadDisplayName</key>
    <string>Email Settings</string>
    <key>PayloadType</key>
    <string>com.apple.mail.managed</string>
    <key>PayloadVersion</key>
    <integer>1</integer>
    <key>PayloadUUID</key>
    <string>362e5c11-a332-4dfb-b18b-f6f0aac032fd</string>
    <key>PayloadIdentifier</key>
    <string>com.example.iPhone.settings.email</string>
    <key>EmailAccountDescription</key>
    <string>E-mail dominio</string>
    <key>EmailAccountName</key>
    <string><?php echo $mail; ?></string>
    <key>EmailAccountType</key>
    <string>EmailTypePOP</string>
    <key>EmailAddress</key>
    <string><?php echo $mail; ?></string>
    <key>IncomingMailServerAuthentication</key>
    <string>EmailAuthPassword</string>
    <key>IncomingMailServerHostName</key>
    <string><?php echo 'pop.'.$domain; ?></string>
    <key>IncomingMailServerUseSSL</key>
    <false />
    <key>IncomingMailServerPortNumber</key>
    <integer>110</integer>
    <key>IncomingMailServerUsername</key>
    <string><?php echo $mail; ?></string>
    <key>OutgoingPasswordSameAsIncomingPassword</key>
    <true />
    <key>OutgoingMailServerAuthentication</key>
    <string>EmailAuthPassword</string>
    <key>OutgoingMailServerHostName</key>
    <string><?php echo 'mail.'.$domain; ?></string>
    <key>OutgoingMailServerPortNumber</key>
    <integer>587</integer>
    <key>OutgoingMailServerUseSSL</key>
    <false />
    <key>OutgoingMailServerUsername</key>
    <string><?php echo $mail; ?></string>
   </dict>
  </array>

  <key>PayloadOrganization</key>
  <string>dominio srl</string>
  <key>PayloadDisplayName</key>
  <string>dominio Settings</string>
  <key>PayloadVersion</key>
  <integer>1</integer>
  <key>PayloadUUID</key>
  <string>954e6e8b-5489-484c-9b1d-0c9b7bf18e32</string>
  <key>PayloadIdentifier</key>
  <string>com.example.iPhone.settings</string>
  <key>PayloadDescription</key>
  <string>Sets up Organization email on the iOS</string>
  <key>PayloadType</key>
  <string>Configuration</string>
 </dict>
</plist>

Ecco il file .htaccess:

Options +SymLinksIfOwnerMatch
RewriteEngine on

RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ getmobileconfig.php [NC,L]

RedirectMatch ^/apple/$ /apple/index.php

Questo post è il risultato di almeno 1 giorno di ricerche e prove, ma se avete in gestione centinaia di domini in hosting, vi assicuro che ne vale la pena!

PS: per i dispositivi Android non esiste nulla ancora (almeno io non son riuscito a trovare nulla)

Rispondi

Leggi articolo precedente:
Apple Carplay e il mio attimo di euforia

Curiosando per la rete ho letto un articolo riguardante il nuovissimo Apple Carplay, una specie di autoradio che integra perfettamente il telefonino...

Chiudi