Lorsque l’on veux héberger quelques boites de courriels pour un domaine et non pas l’intégralité des boites, il faut faire du split domain.
Voici l’article sur le wiki de Zimbra
Scénario
- Les courriels arrivent sur le serveur Primaire.
- Le serveur primaire ne connait pas le serveur secondaire.
- Toutes les boites sont configurées sur le serveur primaire.
- Le serveur secondaire va chercher les courriels sur le serveur primaire via fetchmail
Dans notre cas, Zimbra est le serveur secondaire et il suffit de lui donner les commandes suivantes:
Pour faire la configuration:
$ zmprov md example.com zimbraMailCatchAllAddress @example.com $ zmprov md example.com zimbraMailCatchAllForwardingAddress @example.com $ zmprov md example.com zimbraMailTransport smtp:mail.example.com
le paramètre smtp:mail.example.com est fournit en cherchant quel est le serveur responsable de la réception des courriel pour ce domaine.
Par exemple, si le domaine est sur l’infrastructure de valtechnet, alors il est probable que le transport sera: smtp:xeamsin.valtechnet.com
Pour voir la configuration existante:
$ zmprov gd example.com
Amélioration
Si le serveur primaire est sous notre contrôle (par exemple sous le cpanel de valtechnet), au lieu d’utiliser fetchmail a intervalle régulier, il est possible de mettre en place un forwarder vers le serveur secondaire, malheureusement, cela n’est pas aussi simple que de cocher une case ou de remplir un champ. 2 solutions sont possible:
- Via un alias de domaine sur le serveur secondaire
Sur le serveur secondaire on ajoute un pseudo domaine example.alias et on pourra donc faire suivre les courriels d’un compte en particulier du serveur primaire au serveur secondaire. - Via un script php
Sur le serveur primaire, on ajoute un forwarder via le cpanel. Les parametres avancés nous permettent de spécifier un programme. Il suffit d’écrire un programme PHP qui s’occupera de faire un suivre un email vers un serveur spécifique.
Exemple de script, comme preuve de concept
#!/usr/local/bin/php -q <?php ini_set("SMTP", "mail.valtechnet.com"); $message = mailRead(); //On recherche les elements du courriel // handle email $lines = explode("\n", $message); $from = ""; $subject = ""; $mail_to = ""; $splittingheaders = true; for ($i=0; $i < count($lines); $i++) { if ($splittingheaders) { // this is a header // look out for special headers if (preg_match("/^Subject: (.*)/", $lines[$i], $matches)) { $subject = $matches[1]; } if (preg_match("/^From: (.*)/", $lines[$i], $matches)) { $from = $matches[1]; } if (preg_match("/^To: (.*)/", $lines[$i], $matches)) { $mail_to = $matches[1]; } } else { // not a header, but message break; } if (trim($lines[$i])=="") { // empty line, header section has ended $splittingheaders = false; } } //On envoie le courriel // Il faudrait tester les variables pour s'assurer qu'elles ne sont pas vides mail($mail_to, $subject , $message); exit; function mailRead($iKlimit = "") { // Purpose: // Reads piped mail from STDIN // // Arguements: // $iKlimit (integer, optional): specifies after how many kilobytes reading of mail should stop // Defaults to 1024k if no value is specified // A value of -1 will cause reading to continue until the entire message has been read // // Return value: // A string containing the entire email, headers, body and all. // Variable perparation // Set default limit of 1024k if no limit has been specified if ($iKlimit == "") { $iKlimit = 1024; } // Error strings $sErrorSTDINFail = "Error - failed to read mail from STDIN!"; // Attempt to connect to STDIN $fp = fopen("php://stdin", "r"); // Failed to connect to STDIN? (shouldn't really happen) if (!$fp) { echo $sErrorSTDINFail; exit(); } // Create empty string for storing message $sEmail = ""; // Read message up until limit (if any) if ($iKlimit == -1) { while (!feof($fp)) { $sEmail .= fread($fp, 1024); } } else { while (!feof($fp) && $i_limit < $iKlimit) { $sEmail .= fread($fp, 1024); $i_limit++; } } // Close connection to STDIN fclose($fp); // Return message return $sEmail; } ?>