Autoconfiguración de clientes de correo
La configuración aquí mostrada permite autoconfigurar clientes de correo como Outlook y Thunderbird. Se basa en entradas DNS que redirigen a un servidor web. La configuración consta de las siguientes partes:
Crear un sitio web que responda a autodiscover.midominio.com y autoconfig.midominio.com con lo indicado posteriormente.
Para cada dominio hay que crear dos entradas DNS CNAME hacia los sitios web anteriores.
Configurar Apache2 para que responda con el script PHP adecuado.
Consideraciones:
Cuidado en las pruebas, ya que Microsoft cachea las respuestas y no se actualizan.
Para Thunderbird el dominio es autoconfig
Para Outlook es autodiscover
Documentación adicional en Microsoft Response (POX).
Autodiscover - Outlook
Autodiscover es el sistema de autoconfiguración de Microsoft Outlook. Para que funcione, estas son las entradas DNS que tengo para mi dominio 20cones.org apuntando a autodiscover.art-website.com, que es mi servidor de correo multidominio.
autodiscover CNAME autodiscover.art-website.com.
_autodiscover._tcp.20cones.org. 3600 IN SRV 10 10 443 autodiscover.art-website.com.
El destino no tiene que tener un certificado válido para el dominio de origen, pero si tiene que tener el certificado válido para el dominio de destino. Realmente la entrada DNS-SRV no es necesario, pero sí es recomendable.
En primer lugar voy a hacer una prueba contra mi servidor de correo autodiscover.art-website.com con la cuenta test@example.com. Para ello, hay que hacer un POST con el siguiente XML:
autodiscover.xml<Autodiscover xmlns="http://schemas.microsoft.com/exchange/autodiscover/outlook/requestschema/2006">
<Request>
<EMailAddress>
test@example.com
</EMailAddress>
<AcceptableResponseSchema>
http://schemas.microsoft.com/exchange/autodiscover/outlook/responseschema/2006a
</AcceptableResponseSchema>
</Request>
</Autodiscover>
Descargando el fichero anterior se puede hacer la prueba con CURL hacia https://autodiscover.art-website.com/AutoDiscover/AutoDiscover.xml mediante:
curl -X POST -H "Content-Type: text/xml" -d @autodiscover.xml https://autodiscover.art-website.com/AutoDiscover/AutoDiscover.xml
La respuesta obtenida se ha generado con el siguiente script PHP que he obtenido de Internet y modificado un poco:
autodiscover.php<?php
//get raw POST data so we can extract the email address
$request = file_get_contents("php://input");
// optional debug log
// file_put_contents( 'request.log', $request."\n----------------\n", FILE_APPEND );
// retrieve email address from client request
if(preg_match( "/\<EMailAddress\>(.*?)\<\/EMailAddress\>/", $request, $email ))
{
$email_s = trim($email[1]);
// Prevent XSS
if (!filter_var($email_s, FILTER_VALIDATE_EMAIL)) {
throw new Exception('Invalid E-Mail provided');
}
}
else
$email_s = "";
// POP settings
$popServer = 'mail.art-website.com';
$popPort = 995;
$popSSL = true;
// IMAP settings
$imapServer = 'mail.art-website.com';
$imapPort = 993;
$imapSSL = true;
// SMTP settings
$smtpServer = 'mail.art-website.com';
$smtpPort = 465;
$smtpSSL = true;
//set Content-Type
header( 'Content-Type: application/xml' );
?>
<?php echo '<?xml version="1.0" encoding="utf-8" ?>'; ?>
<Autodiscover xmlns="http://schemas.microsoft.com/exchange/autodiscover/responseschema/2006" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
<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 $popServer; ?></Server>
<Port><?php echo $popPort; ?></Port>
<LoginName><?php echo $email_s; ?></LoginName>
<DomainRequired>off</DomainRequired>
<SPA>off</SPA>
<SSL><?php echo $popSSL ? 'on' : 'off'; ?></SSL>
<DomainRequired>off</DomainRequired>
</Protocol>
<Protocol>
<Type>IMAP</Type>
<Server><?php echo $imapServer; ?></Server>
<Port><?php echo $imapPort; ?></Port>
<DomainRequired>off</DomainRequired>
<LoginName><?php echo $email_s; ?></LoginName>
<SPA>off</SPA>
<SSL><?php echo $imapSSL ? 'on' : 'off'; ?></SSL>
<AuthRequired>on</AuthRequired>
</Protocol>
<Protocol>
<Type>SMTP</Type>
<Server><?php echo $smtpServer; ?></Server>
<Port><?php echo $smtpPort; ?></Port>
<DomainRequired>off</DomainRequired>
<LoginName><?php echo $email_s; ?></LoginName>
<SPA>off</SPA>
<SSL><?php echo $smtpSSL ? 'on' : 'off'; ?></SSL>
<AuthRequired>on</AuthRequired>
<UsePOPAuth>on</UsePOPAuth>
<SMTPLast>on</SMTPLast>
</Protocol>
</Account>
</Response>
</Autodiscover>
Autoconfig - Thunderbird
Para Thunderbird la configuración DNS es la siguiente:
autoconfig CNAME autoconfig.art-website.com.
El problema aquí es que la respuesta esperada es diferente a la de Outlook. La información detallada está en Thunderbird:Autoconfiguration. Sólo me interesa contemplar la configuración del servidor IMAP y SMTP. Como test se puede usar la siguiente llamada con CURL:
curl "https://autoconfig.art-website.com/mail/config-v1.1.xml?emailaddress=info@art-website.com"
La respuesta es:
<?xml version="1.0"?>
<clientConfig version="1.1">
<emailProvider id="art-website.com">
<domain>art-website.com</domain>
<displayName>art-website.com</displayName>
<displayShortName>art-website.com</displayShortName>
<incomingServer type="imap">
<hostname>mail.art-website.com</hostname>
<port>993</port>
<socketType>SSL</socketType>
<authentication>password-cleartext</authentication>
<username>info@art-website.com</username>
</incomingServer>
<outgoingServer type="smtp">
<hostname>mail.art-website.com</hostname>
<port>587</port>
<socketType>STARTTLS</socketType>
<authentication>password-cleartext</authentication>
<username>info@art-website.com</username>
</outgoingServer>
</emailProvider>
</clientConfig>
El script PHP que genera esta respuesta es el siguiente:
thunderbird.php<?php
$emailaddress = "";
if (isset($_GET["emailaddress"]))
{
$emailaddress = $_GET["emailaddress"];
if (!filter_var($emailaddress, FILTER_VALIDATE_EMAIL)) {
throw new Exception('Invalid E-Mail in request');
}
}
$parts = explode("@",$emailaddress);
$domain = $parts[1];
// IMAP settings
$imap_server = 'mail.art-website.com';
$imap_port = 993;
$imap_type = "SSL";
//$smtp_type = "STARTTLS";
// SMTP settings
$smtp_server = 'mail.art-website.com';
$smtp_port = 587;
$smtp_type = "STARTTLS";
//$smtp_type = "SSL";
header( 'Content-Type: application/xml' );
?>
<?xml version="1.0"?>
<clientConfig version="1.1">
<emailProvider id="art-website.com">
<domain><?php echo $domain ?></domain>
<displayName><?php echo $domain ?></displayName>
<displayShortName><?php echo $domain ?></displayShortName>
<incomingServer type="imap">
<hostname><?php echo $imap_server ?></hostname>
<port><?php echo $imap_port ?></port>
<socketType><?php echo $imap_type ?></socketType>
<authentication>password-cleartext</authentication>
<username><?php echo $emailaddress; ?></username>
</incomingServer>
<outgoingServer type="smtp">
<hostname><?php echo $smtp_server ?></hostname>
<port><?php echo $smtp_port ?></port>
<socketType><?php echo $smtp_type ?></socketType>
<authentication>password-cleartext</authentication>
<username><?php echo $emailaddress ?></username>
</outgoingServer>
</emailProvider>
</clientConfig>
Configuración de Apache2
Para terminar la configuración es necesario poner los scripts en un sitio Web configurado con reglas de reescritura para que responda adecuadamente. En mi caso uso Apache2 con un único VirtualHost para ambos dominios.
<VirtualHost *:80>
ServerName autodiscover.art-website.com
ServerAlias autoconfig.art-website.com
ServerSignature Off
Redirect permanent / https://autodiscover.art-website.com/
</VirtualHost>
<VirtualHost *:443>
ServerName autodiscover.art-website.com
ServerAlias autoconfig.art-website.com
ServerAdmin hostmaster@art-website.com
ServerSignature Off
DocumentRoot /var/www/autodiscover.art-website.com
SSLCertificateFile /etc/letsencrypt/live/autodiscover.art-website.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/autodiscover.art-website.com/privkey.pem
RewriteEngine On
# Regla para renovar el certificado con certbot/letsencrypt
RewriteRule (^/\.well-known/acme-challenge/.*) $1 [L]
# Regla para redirigir a la página de autodiscover
RewriteCond %{REQUEST_FILENAME} mail/config-v1.1.xml.*$
RewriteRule ^.*$ thunderbird.php [NC,L]
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ autodiscover.php [NC,L]
ErrorLog /var/log/apache2/autodiscover.art-website.com-error.log
CustomLog /var/log/apache2/autodiscover.art-website.com-access.log combined
ServerSignature On
</VirtualHost>