I’m a fan of push mail. Not having to pull your mail manually or at a given interval is a huge advantage. That’s why I use Z-Push on my private mail server.
Lately I’ve been playing for the second time with the Autodiscovery protocol. Found a neaty little PHP script that does all the magic for me and it seems to work on both iOS 6 and Android 4.2.2. Great! But there was one little problem. Autodiscovery always put the whole email adress as the username. I don’t allow that in my mail configuration. So what now? I couldn’t find a way to persuade Autodiscovery to put the right username as username and I found that this would be too complicated as you can have aliases for mail, so the login part would be wrong anyway.
Fortunately I already use the virtuser_file plugin in RoundCube Mail. Porting it to Z-Push was a piece of cake. Here’s the patch if you’re interested:
--- backend/imap.php.orig 2013-03-27 14:28:03.231378003 +0100 +++ backend/imap.php 2013-03-27 15:01:04.395096310 +0100 @@ -65,6 +65,48 @@ * default backend methods */ + public function email2user($p) + { + $r = $this->findinvirtual('/^' . preg_quote($p, '/') . '\s/'); + + for ($i=0; $i<count($r); $i++)="" {="" +="" $arr="preg_split('/\s+/'," trim($r[$i]));="" if="" (count($arr)=""> 0) { + $res = trim($arr[count($arr)-1]); + break; + } + } + + return $res; + } + + public function findinvirtual($pattern) + { + $file = "/etc/mail/virtual"; + $result = array(); + $virtual = null; + + if ($file) + $virtual = file($file); + + if (empty($virtual)) + return $result; + + // check each line for matches + foreach ($virtual as $line) { + $line = trim($line); + if (empty($line) || $line[0]=='#') + continue; + + if (preg_match($pattern, $line)) + $result[] = $line; + } + + return $result; + } + + /** * Authenticates the user * @@ -84,6 +126,10 @@ if (!function_exists("imap_open")) throw new FatalException("BackendIMAP(): php-imap module is not installed", 0, null, LOGLEVEL_FATAL); + # if username is a full email, try to find out the real user + if (preg_match("/@/", $username)) + $username = $this->email2user($username); + /* BEGIN fmbiete's contribution r1527, ZP-319 */ $this->excludedFolders = array(); if (defined('IMAP_EXCLUDED_FOLDERS')) { @@ -1804,4 +1850,4 @@ /* END fmbiete's contribution r1528, ZP-320 */ }; -?> \ Brak znaku nowej linii na końcu pliku +?> </count($r);>
This works with Z-Push 2.0.7. My virtual map file looks like this:
email@domain.tld real_username1 email2@anotherdomain.tld real_username1 test@domain.tld real_username2 etc...
If you like it, you can copy&paste the patch or download it from here
Cheers!