bug 1318: Properly order MX records by order given in RFC 5321
authorBenny Baumann <BenBE@geshi.org>
Sat, 29 Nov 2014 12:46:50 +0000 (13:46 +0100)
committerBenny Baumann <BenBE@geshi.org>
Sat, 29 Nov 2014 12:46:50 +0000 (13:46 +0100)
includes/general.php

index 596cc49..d9c74b9 100644 (file)
                if(preg_match("/^([a-zA-Z0-9])+([a-zA-Z0-9\+\._-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9\._-]+)+$/" , $email))
                {
                        list($username,$domain)=explode('@',$email,2);
-                       $dom = escapeshellarg($domain);
-                       $line = trim(shell_exec("dig +short MX $dom 2>&1"));
-#echo $email."-$dom-$line-\n";
-#echo shell_exec("dig +short mx heise.de 2>&1")."-<br>\n";
-
-                       $list = explode("\n", $line);
-                       foreach($list as $row) {
-                               if(!strstr($row, " ")) {
-                                       continue;
+                       $mxhosts = array();
+                       $mxweight = array();
+                       if( !getmxrr($domain, $mxhosts) ) {
+                               $mxhostrr = array($domain);
+                               $mxweight = array(0);
+                       } else if ( !empty($mxhosts) ) {
+                               $mxhostrr = array($domain);
+                               $mxweight = array(0);
+                       }
+
+                       $mxhostprio = array();
+                       for($i = 0; $i < count($mxhostrr); $i++) {
+                               $mx_host = trim($mxhostrr[$i], '.');
+                               $mx_prio = $mxweight[$i];
+                               if(empty($mxhostprio[$mx_prio])) {
+                                       $mxhostprio[$mx_prio] = arraY();
                                }
-                               list($pri, $mxhosts[]) = explode(" ", trim($row), 2);
+                               $mxhostprio[$mx_prio][] = $mx_host;
+                       }
+
+                       array_walk($mxhostprio, function(&$mx) { shuffle($mx); } );
+
+                       $mxhosts = array();
+                       foreach($mxhostprio as $mx_prio => $mxhostnames) {
+                               foreach($mxhostnames as $mx_host) {
+                                       $mxhosts[] = $mx_host;
+                               ]
                        }
-                       $mxhosts[] = $domain;
-                       array_walk($mxhosts, function(&$mx) { $mx = trim($mx, '.'); } );
 
                        foreach($mxhosts as $key => $domain)
                        {