Für Mailserverbetreiber: Outlook automatisch konfigurieren

In meinem letzten Eintrag ging es darum, wie man den E-Mailassistenten von Thunderbird automatisch mit den richtigen Einstellungen für den eigenen Mailserver ausstattet. Im folgenden wollen wir das selbe für Outlook (getestet mit der 2010er Version) erstellen.

Eine komplette Anleitung über alle Möglichkeiten der automatischen Konfiguration hat Microsoft hier veröffentlicht:
http://office.microsoft.com/download/afile.aspx?AssetID=AM102105061033

Ich habe mich für den Weg entschieden, der dem für Thunderbird am ähnlichsten ist.

Die Schritte:

  1. Anlegen eines DNS-Namen:  autodiscover.<domainname> (in diesem Beispiel: autodiscover.mein-edv-blog.de)
  2. Konfigurieren eines Webserver auf diesen DNS-Eintrag zu reagieren (in diesem Beispiel: apache2)
  3. Der Webserver braucht ein gültiges SSL-Zertifikat
  4. Dort muss eine spezielle xml-Datei unter dem Pfad /autodiscover/autodiscover.xml vorhanden sein

Sofern der Loginname gleich der E-Mailadresse ist, muss nichts weiter konfiguriert werden.

Ist der Loginname nicht mit der E-Mailadresse identisch, muss in der XML-Datei dafür gesorgt werden, dass der Loginname zu der E-Mailadresse rausgesucht wird. Die E-Mailadresse wird in einem Post verb bei der Anfrage von Outlook mit übermittelt und sieht z.B. so aus:

<!-- REQUEST TO SERVER. In HTTP POST DATA -->
<?xml version="1.0" encoding="utf-8" ?>
<Autodiscover xmlns="http://schemas.microsoft.com/exchange/autodiscover/outlook/requestschema/2006">
<Request>
<AcceptableResponseSchema>http://schemas.microsoft.com/exchange/autodiscover/outlook/responseschema/2006a</AcceptableResponseSchema>
 
<!-- EMailAddress: Optional
This tag indicates the user’s email address.
-->
<EMailAddress>harald.popke@mein-edv-blog.de</EMailAddress>
</Request>
</Autodiscover>

Mein Problem war nun mit PHP an die dort gespeicherte E-Mailadresse zu kommen. Im $_POST-Array von PHP stand leider nichts drin. Die Informationen erhält man aber, wenn man die Funktion ‘file_get_contents(‘php://input’)’ aufruft.
Folgendes PHP-Skript nimmt die XML-Anfrage von Outlook entgegen und sucht zu der E-Mailadresse den passenden Loginnamen aus einer LDAP-Datenbank raus:

Achtung: der Dateiname muss autodiscover.xml lauten!

<? header("Content-type: text/xml"); ?>
<?
//Lese den Body der XML-Anfrage von Outlook aus
$xmlObj = simplexml_load_string(file_get_contents('php://input'));
//Suche in der XML-Antwort die E-Mailadresse raus
$arraydata = (array) $xmlObj;
$arraydata = (array) $arraydata["Request"];
$email = $arraydata["EMailAddress"];
 
$ds=ldap_connect("adressen.mein-edv-blog.de");
if ($ds) {
//Eine gültige Kennung besteht aus der vom LDAP gelieferten UID gefolgt von einem + und der Domäne der E-Mail 
//Beispiel: E-Mail: harald.popke@mein-edv-blog.de 
//Antwort vom LDAP-Server: uid = hp1123, mail = harald.popke@mein-edv-blog.de 
//die Kennung lautet dann hp1123+mein-edv-blog.de 
 
    $r=ldap_bind($ds);
        $sr=ldap_search($ds, 'o=internet',"mail=".$email,array("uid","mail"));
    $info = ldap_get_entries($ds, $sr);
        $uid = $info[0]['uid'][0];
        $domain = substr(strstr($info[0]['mail'][0],'@'),1);
        $kennung = "$uid+$domain";
        if(strlen($kennung)==1){
                $kennung = "";
        }
        ldap_close($ds);
}
?>
<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>mailbox.mein-edv-blog.de</Server>
                                <Port>993</Port>
                                <LoginName><? echo $kennung ?></LoginName>
                                <DomainRequired>off</DomainRequired>
                                <SPA>off</SPA>
                                <SSL>on</SSL>
                                <AuthRequired>on</AuthRequired>
                        </Protocol>
                        <Protocol>
                                <Type>SMTP</Type>
                                <Server>relay.mein-edv-blog.de</Server>
                                <Port>465</Port>
                                <LoginName><? echo $kennung ?></LoginName>
                                <DomainRequired>off</DomainRequired>
                                <SPA>off</SPA>
                                <SSL>on</SSL>
                                <AuthRequired>on</AuthRequired>
                        </Protocol>
                </Account>
        </Response>
</Autodiscover>

Damit der PHP-Parser diese XML-Datei abarbeitet, steht in der vhost-Directive als gültige Erweiterung für PHP-Dateien noch:

AddType application/x-httpd-php .xml

vor dem schließenden VirtualHost Tag.

Tipp zum Testen:

Per “Strg+rechte Maustaste” auf das Outlookicon neben der Uhr klicken und “E-Mail-AutoKonfiguration testen” auswählen.

Für Mailserverbetreiber: Thunderbird automatisch konfigurieren

Folgender Eintrag ist für Mailserverbetreiber, die Ihren Nutzern die Einrichtung ihres E-Mailkontos im Thunderbird vereinfachen wollen.

Bei der Einrichtung eines E-Mailkontos versucht der Mailassistent automatisch die Einstellungen zu laden:

Es werden verschiedene Varianten durch probiert. Im Screenshot wurden die Einstellungen nirgends gefunden.

Um dem Abhilfe zu schaffen, kann man folgende Schritte durcharbeiten:

  1. Anlegen eines DNS-Namen:  autoconfig.<domainname> (in diesem Beispiel: autoconfig.mein-edv-blog.de)
  2. Konfigurieren eines Webserver auf diesen DNS-Eintrag zu reagieren (in diesem Beispiel: apache2)
  3. Dort muss eine spezielle xml-Datei unter dem Pfad /mail/config-v1.1.xml vorhanden sein
  4. Beispiele für den Aufbau dieser Datei findet man bei https://developer.mozilla.org/en/Thunderbird/Autoconfiguration/FileFormat/HowTo

Sofern der Loginname gleich der E-Mailadresse ist, muss nichts weiter konfiguriert werden.

Ist der Loginname nicht mit der E-Mailadresse identisch, muss in der XML-Datei dafür gesorgt werden, dass der Loginname zu der E-Mailadresse rausgesucht wird. Praktischerweise wird die E-Mailadresse direkt mit in der URL übermittelt. (in diesem Beispiel: http://autoconfig.mein-edv-blog.de/mail/config-v1.1.xml?emailaddress=harald.popke@mein-edv-blog.de)

Ich habe dazu in PHP ein kleines Skript geschrieben, welches in meiner Umgebung funktioniert. Ist nichts schwieriges, aber vielleicht hilft es ja jemanden schneller zum Ziel zu kommen. Im Skript wird zu einer E-Mailadresse per LDAP die passende Loginkennung ermittelt.

Achtung: der Dateiname muss config-v1.1.xml lauten!

 <? 
//Ausgabe des XML-Headers 
header("Content-type: text/xml"); 
$ds=ldap_connect("adressen.mein-edv-blog.de"); // must be a valid LDAP server!
 if ($ds) { 
//Eine gültige Kennung besteht aus der vom LDAP gelieferten UID gefolgt von einem + und der Domäne der E-Mail 
//Beispiel: E-Mail: harald.popke@mein-edv-blog.de 
//Antwort vom LDAP-Server: uid = hp1123, mail = harald.popke@mein-edv-blog.de 
//die Kennung lautet dann hp1123+mein-edv-blog.de 
$r=ldap_bind($ds); // this is an "anonymous" bind, typically 
$sr=ldap_search($ds, 'o=mitarbeiter',"mail=".$_GET[emailaddress],array("uid","mail"));
$info = ldap_get_entries($ds, $sr);
 $uid = $info[0]['uid'][0];
 $domain = substr(strstr($info[0]['mail'][0],'@'),1);
 $kennung = "$uid+$domain";
 ldap_close($ds);
 } ?> 
<clientConfig version="1.1">
  <emailProvider id="mein-edv-blog.de">
  <domain>mein-edv-blog.de</domain>
  <displayName>Blogmail</displayName>
  <displayShortName>mein-edv-blog</displayShortName>
  <incomingServer type="imap">
    <hostname>mailbox.mein-edv-blog.de</hostname>
    <port>993</port>
    <socketType>SSL</socketType>
    <authentication>password-cleartext</authentication>
    <username><? echo $kennung ?></username>
 </incomingServer>
 <outgoingServer type="smtp">
   <hostname>relay.mein-edv-blog.de</hostname>
   <port>465</port>
   <socketType>SSL</socketType>
   <authentication>password-cleartext</authentication>
   <username><? echo $kennung ?></username>
  </outgoingServer>
  <documentation url="http://www.mein-edv-blog.de">
  <descr lang="de">Allgemeine Beschreibung der Einstellungen</descr>
  </documentation>
  </emailProvider>
</clientConfig>

Damit der PHP-Parser diese XML-Datei abarbeitet, steht in der vhost-Directive als gültige Erweiterung für PHP-Dateien noch:

AddType application/x-httpd-php .xml

vor dem schließenden VirtualHost Tag.

statische DHCP-Adressen mit Fritzbox 7270

Ich habe mich schon lange gewundert, dass man in der Weboberfläche der Fritz!Box nur festlegen kann, einem Netzwerkgerät per DHCP immer die selbe IP-Adresse zu geben, diese aber nicht selber festlegbar ist.

Nun habe ich in der Weboberfläche unter Netzwerk:

folgenden Menüpunkt unten auf der Seite gefunden:

Der Hinweis, dass das Gerät bisher noch keinen Kontakt zur FRITZ!Box gehabt haben darf, kann ignoriert werden.

Der Hinweis, dass das Netzwerkgerät bisher noch keinen Kontakt zur Fritz!Box haben durfte, kann ignoriert werden.

Es kommt diese Maske:

Wurde dem Gerät bisher eine andere IP-Adresse zugewiesen, kommt noch folgender Hinweis:

Somit funktioniert das nun auch. :-)