Il a longtemps de cela j’avais installé un z-push pour attaquer mon serveur Zimbra. A l’époque javais pas mal galéré avec l’intégration de z-push. 3 ans plus tard (ah ouai quand même 🙂 ) j’ai de nouveau tenté l’expérience avec la nouvelle version de z-push avec le backend pour zimbra.

Je refait un petit tuto pour le monter sur un nginx. Pour ça on commence par télécharger l’archive, la décompacter et la renommer :


cd /var/www/
wget http://zarafa-deutschland.de/z-push-download/final/2.0/z-push-2.0.6-1616.tar.gz
tar xzvf z-push-2.0.6-1616.tar.gz
mv z-push-2.0.6-1616 z-push

Puis le backend pour Zimbra:

wget http://downloads.sourceforge.net/project/zimbrabackend/Release55/zimbra55-zpush2--zimbra54-zpush1-as12.1.tgz?r=http%3A%2F%2Fsourceforge.net%2Fprojects%2Fzimbrabackend%2F
tar xzvf zimbra55-zpush2--zimbra54-zpush1-as12.1.tgz
mkdir z-push/backend/zimbra
cp zimbra55/z-push-2/* z-push/backend/zimbra/

une fois le système mis en place on modifie le config.php situé dans le dossier de z-push


define('BACKEND_PROVIDER', "BackendZimbra");
define('ZIMBRA_URL', 'http://zimbra.domain.tld');
define('ZIMBRA_USER_DIR', 'zimbra');
define('ZIMBRA_SYNC_CONTACT_PICTURES', true);
define('ZIMBRA_VIRTUAL_CONTACTS',true);
define('ZIMBRA_VIRTUAL_APPOINTMENTS',true);
define('ZIMBRA_VIRTUAL_TASKS',true);
define('ZIMBRA_IGNORE_EMAILED_CONTACTS',true);
define('ZIMBRA_HTML',true);
define('ZIMBRA_ENFORCE_VALID_EMAIL',true);
define('ZIMBRA_SMART_FOLDERS',false);
define('ZIMBRA_RETRIES_ON_HOST_CONNECT_ERROR',5);
define('ZIMBRA_DEBUG',false);
define('ZIMBRA_LOCAL_CACHE', false);

Puis on modifie la timezone dans le fichier z-push/lib/core/zpush.php

date_default_timezone_set('Europe/Amsterdam');
vers date_default_timezone_set('Europe/Paris');

Enfin on créé les fichiers/dossiers nécessaires au bon fonctionnement de z-push :
mkdir /var/log/z-push/ && touch /var/log/z-push/z-push.log /var/log/z-push/z-push-error.log && chown nginx: /var/log/z-push/z-push.log /var/log/z-push/z-push-error.log

et cela fonctionne directement ! Plus besoin de modifier le code pour qu’il fonctionne avec nginx 🙂

Référence : ZimbraBackend

Update : Nouvelle version !

Ayant un serveur de messagerie personnel sous Zimbra, je voulais le synchroniser avec mon téléphone. Pour cela j’ai d’abord utilisé Funambol mais le logiciel tournant sous Java, il me prenait trop de ressources sur mon petit serveur Kimsufi. De plus il faut installer un logiciel supplémentaire sur le téléphone alors que j’ai déjà un logiciel qui permet de synchroniser via activesync.

J’ai donc fait le tour des solutions existantes qui dispose d’un connecteur pour Zimbra et malheureusement il n’y a pas grand chose de disponible à l’heure actuelle. Le projet le plus intéressant et c’est celui que j’ai mis en place est z-push qui fait partie de la solution Zarafa. Via un plug-in développé par la communauté cela me permet de synchroniser mes mails/calendrier/contacts/tâches grâce au logiciel déjà disponible sur mon téléphone.

Ce logiciel tournant sous php il n’était pas difficile de l’ajouter à mon serveur existant sans consommer de ressources supplémentaire. Le plus compliqué c’est que celui-ci tourne sous nginx et qu’il n’y a aucune documentation existante pour faire fonctionner z-push avec nginx. J’ai du pas mal tâtonner avant de réussir à le faire fonctionner correctement.  J’espère que ce tutoriel vous conviendra et qu’il sera fonctionnel pour tout le monde (les mystères de l’informatique sont parfois impénétrables 🙂 )

Votre serveur nginx doit être paramétré pour tourner avec PHP (par ex.  fastcgi php-fmp ). Il est indispensable de faire tourner PHP avec nginx car z-push s’articule entièrement autour de scripts en PHP.

Une fois que tout fonctionne correctement, rendez-vous dans votre répertoire de site web pour installer z-push

[code lang= »bash »]
cd /var/www/
wget http://download.berlios.de/z-push/z-push-1.4.3.tar.gz
wget http://downloads.sourceforge.net/project/zimbrabackend/Release47/zimbra47.tgz
tar xzvf http://download.berlios.de/z-push/z-push-1.4.3.tar.gz
tar xzvf zimbra47.tgz -C z-push/backend/
chmod 740 z-push/state
chown www-data:www-data z-push/state
[/code]

ok une fois que tous est installé on va configurer z-push pour attaquer Zimbra en backend. Pour cela modifiez le fichier le fichier config.php comme suit :

[code]
$BACKEND_PROVIDER = "BackendZimbra";
define(‘MAPI_SERVER’, ‘file:///var/run/zarafa’);
define(‘ZIMBRA_URL’, ‘http://zimbra.domain.com’);
define(‘ZIMBRA_USER_DIR’, ‘zimbra’);
define(‘ZIMBRA_SYNC_CONTACT_PICTURES’, true);
define(‘ZIMBRA_VIRTUAL_CONTACTS’,true);
define(‘ZIMBRA_VIRTUAL_APPOINTMENTS’,true);
define(‘ZIMBRA_VIRTUAL_TASKS’,true);
define(‘ZIMBRA_IGNORE_EMAILED_CONTACTS’,true);
define(‘ZIMBRA_HTML’,false);
define(‘ZIMBRA_ENFORCE_VALID_EMAIL’,true);
define(‘ZIMBRA_NOKIA_MFE_FIX’,true);
define(‘ZIMBRA_NOKIA_MFE_ALWAYS_OVERWRITE’,true);
#Si jamais vous voulez debuger passer l’option suivante a true
define(‘ZIMBRA_DEBUG’,false);
#Et enfin si vous voulez gérer vos appareils mobile depuis une interface web passer l’option suivante
#a true et suivez les instruction que vous trouverez ici :
#http://downloads.sourceforge.net/project/zimbrabackend/Release47/Release%20Notes%20-%20Revision%2047.txt
define(‘PROVISIONING’, false);
[/code]

Comme on utilise nginx avec fastcgi il faut faire quelques modifications afin que les requêtes web soient traité correctement par z-push

Il faut ajouter ces lignes à la fin du fichier compat.php juste avant « ?> »

[code lang= »bash »]
if (!function_exists(‘apache_request_headers’)) {
function apache_request_headers() {
$header = array();
$header[‘Ms-Asprotocolversion’] = $_SERVER[‘HTTP_MS_ASPROTOCOLVERSION’];
$header[‘X-Ms-Policykey’] = $_SERVER[‘HTTP_X_MS_POLICYKEY’];
$header[‘User-Agent’] = $_SERVER[‘HTTP_USER_AGENT’];

return $header;
}

list($_SERVER[‘PHP_AUTH_USER’], $_SERVER[‘PHP_AUTH_PW’]) = explode(‘:’ , base64_decode(substr($_SERVER[‘HTTP_AUTHORIZATION’], 6)));
}
[/code]

et commenter la ligne suivante dans le fichier index.php

[code lang= »bash »]
//header("Content-Length: $len");
[/code]

enfin configurez votre virtualhost

[code language= »bash »]server {
listen 80;
server_name push.domain.com;
access_log  /var/log/nginx/z-push.access.log  combined;
error_log /var/log/nginx/z-push.error.log;

location / {
root   /var/www/z-push;
index  index.php index.html;

if (!-f $request_filename) {
rewrite  ^(.*)$  /index.php?q=$1  last;
break;
}
}

location ~ \.php$ {
include /etc/nginx/fastcgi_params;
proxy_read_timeout 120;
proxy_connect_timeout 120;
fastcgi_pass  127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME /var/www/z-push/$fastcgi_script_name;
}
}[/code]

Si comme moi vous avez un autre serveur qui fait office de reverse proxy en frontal, n’oubliez pas d’ajouter ces lignes dans votre nginx.conf  sinon votre serveur n’arrivera pas à communiquer avec votre téléphone :

[code lang= »bash »]
##Sert a recuperer l’adresse ip d’origine dans les headers
##Ref : http://wiki.nginx.org/HttpRealIpModule
set_real_ip_from        XX.XX.XX.XX; <= IP du Frontal
real_ip_header          X-Real-IP;[/code]

Et voila il ne reste plus qu’a configurer votre téléphone et le tour est joué.

Références :

http://z-push.sourceforge.net/phpbb/viewtopic.php?f=4&t=1245&p=4762&hilit=apache_request_headers#p4762
http://www.jopa.fr/index.php/2009/08/05/push-mail-sur-serveur-imap-gmail/

22 bis Rue de Trey