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 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:

<?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:

<?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.

Configuración de Apache2
<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>

Referencias

  1. Microsoft Response (POX)

  2. Thunderbird:Autoconfiguration

  3. Autodiscover information for mail clients

  4. php-autodiscover