Roundcubemail : plugin rc-vacation 0.4
- Jeudi 9 septembre 2010
- Publié dans Réalisations
- Par Boris HUISGEN
- Ecrire
La version 0.4 du plugin rc-vacation est disponible. Au programme, l’inclusion d’un driver pour maildrop. Niveau interface, il est possible de configurer une date d’activation et d’expiration du message d’absence. L’installation du plugin jquery-ui est d’ailleurs conseillée afin de bénéficier des sélecteurs de date jQuery. Plusieurs adresses de redirection sont acceptées. Suite aux nombreuses demandes, des exemples de configuration sont fournis, notamment les schémas SQL.
Dépôt Git : http://github.com/bhuisgen/rc-vacation
Tarball : rc-vacation-0.4.tar.gz


Bonjour
Le plugin m’interesse pas mal, j’aimerai vraiment le faire fonctionner :)
J’ai aujourd’hui un webmail horde3 avec un plugin vacation qui existe. Je comptais remplacer le tout par roundcube et votre plugin, mais lorsque je configure le plugin, et que je clique sur préférence, j’ai le droit a une erreur « erreur de connexion », dans les logs apache j’ai l’erreur suivante :
LDAP_UNWILLING_TO_PERFORM\nParameters:\nBase: \nFilter: (objectClass=*)\nScope: base: LDAP_UNWILLING_TO_PERFORM (53): , referer: http://XX.XX.XX.XX/roundcube/?_task=settings&_action=identities
Dans le log roundcube c’est la meme erreur.
J’ai vérifié le paramétrage réseau, un ldapsearch avec le compte utilisé dans le plugin me retourne ce dont j’ai besoin…
Une idée ?
@Yann
Le module PEAR LDAP2 est-il installé ? C’est du LDAP sécurisé ?
J’ai installé le PEAR LDAP2 de la maniere suivante (je suis sous debian) :
pear install Net_LDAP2-2.0.1
C’est du LDAP non sécurisé. L’option TLS est a FALSE.
Ce que je trouve bizarre dans le log, c’est qu’il mette « Filter: (objectClass=*) », alors que j’ai mis le filter à (&(objectClass=mail)(status=active)).
@Yann
Si c’est le LDAP search qui pose problème, tu devrais obtenir un message d’erreur de traitement et non de connexion.
As-tu la gestion LDAP activée pour le carnet d’adresses dans la config de roundcube ?
@Boris HUISGEN
Je n’ai pas activé le carnet d’adresses via LDAP (mais par SQL), c’est un prérequis ou pas ?
Bon finalement le Net_ldap a été mis a jour et je n’ai plus l’erreur. Désolé pour le dérangement.
Hi Boris!
Great plugins, I use it with rc from svn, postfix and mysql db.
I’ve 1 question and 1 suggest.
Question: the start and the end date are used? how? in the sql schema i don’t see anything about.
Suggest:
for $rcmail_config['vacation_sql_read'] is required to change my.domain string?
« ‘autoreply.my.domain’),%email_domain,…..
I’ve changed with:
« ‘autoreply.’,%email_domain),%email_domain,….
This should work with multiple domains.
@qualcuno
The start/stop vacation dates are not used by postfixadmin so the default SQL requests don’t use them. You can change the SQL schema to use them but you must too change the vacation.pl script (called by postfix).
Check vacation.pl and change this request, line 268 :
# Recipient is an alias, check if mailbox has vacation
if ($rv == 1) {
my @row = $stm->fetchrow_array;
my $alias = $row[0];
$query = qq{SELECT email FROM vacation WHERE email=? and active=$db_true};
$stm = $dbh->prepare($query) or panic_prepare($query);
$stm->execute($alias) or panic_prepare($query, »email=’$alias’ »);
$rv = $stm->rows;
# Alias has vacation
if ($rv == 1) {
$realemail = $alias;
}
Hi,
I’ve installed and configured the plugin, I think…
I’ve changed the line $rcmail_config to $rcmail_config['vacation_sql_dsn'] =’mysql://roundcubeuser:roundcubeuserpassword@localhost/webmail’;
should I change anything else? it gives me ‘Error during processing’ when I go to the vacation tab.
Mouais pareil … « Erreur de traitement » quand j’essaie d’activer le répondeur … Je tourne en rond là … Tout ce que j’ai configuré c’est la même chose que Paulo … J’ai bien ajouté jqueryui … et j’ai rien de bon apparemment :/
@Djyp
Je précise que j’ai créé la table ‘vacation’ dans ma bdd
Bonjour
Votre plugin nous intéresse vraiment. Nous avons installé RoundCube + postfix. Tout fonctionne bien mais il nous manque l’autoreply. Avez-vous un tutorial pour le paramétrage de votre plugin avec postfix.
Que faut-il paramétré pour que votre plugin fonctionne. PostfixAdmin est obligatoire ? Apres l’installation de postfixAdmin que faut-il configuré dans les paramètres du plugin ?
Merci à vous
@Damien
Il faut regarder le script virtual_vacation dans le package de postfixadmin. Il y a un script perl vacation.pl à installer (toute la procédure est fournie). En fait, la configuration de rc-vacation est de base fonctionnelle avec le schéma SQL fourni avec postfixadmin. Si postfixadmin n’est pas installé, il faut veiller à faire le schéma, récupérer le script qui gère l’autoreply des messages + le mapper au schéma. Ce qui est plus complexe mais possible.
Bonjour.
Merci pour ce plugin bien pratique. J’ai cependant un problème de fonctionnement.
Pour la partie activation, désactivation de la réponse, pas de problème, tout fonctionne.
Par contre, j’ai un peu plus de mal avec les dates d’activation et d’expiration. J’ai lu le message relative à ce problème, mais je ne saisi toujours pas deux choses:
- les champs ne sont pas présent dans la table Postfix, donc à ajouter manuellement?
- de quelle façon doivent être modifiées les requêtes SQL dans le script vacation.pl?
@Rémi
Par défaut postfixadmin ne gère pas les dates d’activation/expiration, il faut donc les ajouter et modifier aussi bien l’interface d’administration que le script vacation.pl. Pour ce dernier, rajoute dans la requête une comparaison à NOW() sur chaque date.
Hi Boris,
We r trying to use the vacation but have several questions, the driver we use is LDAP and how you program do to write the vacation enabled or the message? when there is no field on LDAP?
The Plugin doesnt works with my postfix configuration
changes in sql write fixes
config.inc.php
« SELECT %email,CONCAT(%email_local,’@',%email_domain,’,',%email_local,’#',%email_domain,’@', » .
« ‘autoreply.’,%email_domain),%email_domain,NOW(),NOW(),1 «
Bonjour,
Je n’arrive pas à faire apparaitre l’onglet « Répondeur » dans RoundCube. Aurai-je manqué une étape?
J’ai pourtant suivi le fichier INSTALL.
Merci pour l’aide.
@Leonardo
Read my email :)
@masterjcl
The vacation script (vacation.pl) lookups only one « fake » domain in database. This value must be the same in the write request of rc-vacation.
@José
Peut être que tu as oublié d’activer le plugin dans le fichier principal de configuration ?!
Voici la seule ligne que j’ai entré dans le fichier main.inc.php de Roudcube:
$rcmail_config['plugins'] = array(‘vacation’);
C’est bien de cela dont tu parles?
@Boris HUISGEN
Voici la seule ligne que j’ai entré dans le fichier main.inc.php de Roudcube:
$rcmail_config['plugins'] = array(‘vacation’);
C’est bien de cela dont tu parles?
@José
Ok, reste à activer le log debug de roundcube pour voir ce qui ne va pas quand tu édites les préférences.
@Boris HUISGEN
Le log/errors est déjà activé et ne renvoie rien en rapport avec vacation.
Juste cette erreur :
PHP Error: Could not convert string from UTF-7 to UTF-8. Make sure iconv is installed or lib/utf8.class is available in /var/www/webmail/program/include/main.inc on line 0 (GET /webmail/?_task=settings&_action=)
@José
Bizarre, tu as bien l’extension iconv ? Il faudrait être certain que PHP interprète le code PHP du plugin. Esaaie de mettre un die() dans le script vacation.php en début de bloc de la fonction init().
Ça ne change rien. Et iconv est bien activé j’ai vérifié.
Bonjour,
Merci pour ce travail :) j’ai adapté le config.inc.php à ma structure de base.
Cela fonctionne par contre lorsque je désactive le répondeur, l’enregistrement dans la table ‘vacation’ passe bien à ‘actif=0′ mais pas dans la table ‘alias’ !! une idée ?
@Monty
L’enregistrement dans la table alias peut subsister, mais il faut être certain que l’alias ne pointe que sur la même adresse, sans l’adresse dédiée au script de vacation.
Effectivement le probleme est là. l’alias reste en active=1 donc la destinataire reçoit bien le mail, mais le destinataire reçoit une erreur à cause de l’alias pour vacation qui reste présent dans le champs. Je suis en train de voir pour passer sur la structure de base de postfixadmin.
Je ferais un retour ici pour dire ou j’en suis.
Merci
@Monty
Tu peux aussi directement supprimer l’alias durant l’écriture, par une requête SQL conditionnelle de ce genre :
DELETE FROM alias WHERE email=%email AND %vacation_enable=1
Le dev (propre :-)) n’est pas mon fort je ne vois pas trop ou placer cela dans le code du plugin
@Monty
Dans le fichier de configuration du plugin, tu peux configurer les requêtes SQL qu’il fait pour lire/écrire les données. Par défaut c’est pour du postfixadmin, mais rien ne t’empêche d’adapter la configuration à ton architecture mail actuelle.
Hmm il y a un ordre en particulier à respecter dans le array() pour placer les requêtes ?
@Monty
Oui, c’est exécuté de manière ordonnée. Pour la syntaxe de remplacement des variables, c’est ici : https://github.com/bhuisgen/rc-vacation/blob/master/doc/DRIVER-SQL
je vais jeter un regard la dessus :) merci bien !!
Bonjour et merci pour votre plugin.
Je suis en train d’essayé de l’installer et la directive de configuration ‘vacation_ldap_modify_dns’ me pose problème.
Si j’ai bien compris, c’est utilisé pour se connecter avec le dns de l’utilisateur voulant configurer son répondeur ? Qui du password ?
J’ai un second soucis, mon dns devrait être :
uid=Crupuk,ou=Users,dc=SoEz,dc=be or mon adresse e-mail est du type : rienavoir(at)soez .. Comment faire la correspondance ? ne serait-ce pas plus simple de récupérer le dns lors de la query ? (Ou alors, je n’ai rien compris … )
En tout cas, le plugin arrive bien à récupérer les informations depuis le ldap (Elles sont affichées dans roundcube) mais impossible de sauver les modifications (Et ce malgré un message de validation )
Pouvez-vous m’aidez ?
Merci
@Crupuk
Il faut distinguer deux cas :
- quand tu affiches les paramètres de ton ooo, il y a une opération de lecture, à savoir un appel LDAP « search ».
- quand tu enregistres ton ooo, il y a une opération de modification, équivalent à un LDAP « modify ».
J’utilise le module PEAR LDAP2, je fais donc appel aux fonctions search() et modify() :
- http://pear.php.net/package/Net_LDAP2/docs/latest/Net_LDAP2/Net_LDAP2.html#methodsearch
- http://pear.php.net/package/Net_LDAP2/docs/latest/Net_LDAP2/Net_LDAP2.html#methodmodify
Le schéma LDAP étant spécifique à ton installation, le plugin s’y adapte par le biais d’un mapping entre le nom des attributs LDAP et ceux des variables internes du plugin (paramètres de configuration vacation_ldap_attr_XXX). Le mapping est utilisé aussi pour le search que le modify.
Pour le search, il y a la base DN (vacation_ldap_search_base), le filtre (vacation_ldap_search_filter) pour éviter un parcours complet de ta base (plus il est restrictif, plus la recherche est rapide), et la liste des attributs à récupérer. Les valeurs récupérées seront ensuite mappées.
Pour le modify, il peut y avoir en fait plusieurs opérations (exécutées les unes après les autres) d’où l’utilisation de deux arrays :
- le premier vacation_ldap_modify_dns
- le second vacation_ldap_modify_ops
Ils doivent avoir le même nombre d’éléments. Ainsi, l’élément n de vacation_ldap_modify_dns permet de se placer dans ta base, pour effectuer l’opération n de vacation_ldap_modify_ops. Au niveau des opérations LDAP, il peut y avoir un add/delete/replace sur ta base. Une opération peut avoir besoin de valeurs à enregistrer, ce qui fait qu’un élément doit être de la forme :
array « type opération » => array (« attribute_A » => « valeur », « attribute_B » => « valeur ABC »)
Maintenant, il reste un unique point. Il faut bien pouvoir stocker les valeurs du plugin, ce qui se fait par la syntaxe %vacation_XXX (par ex %vacation_email pour la valeur de l’email côté plugin/interface).
Pour l’exemple, la config par défaut est de cette sorte :
// array of DN to use for modify operations required to write data.
$rcmail_config['vacation_ldap_modify_dns'] = array (
‘cn=%email_local,ou=Mailboxes,dc=%email_domain,ou=MailServer,dc=ldap,dc=my,dc=domain’
);
// array of operations required to write data.
$rcmail_config['vacation_ldap_modify_ops'] = array(
array (‘replace’ => array(
$rcmail_config['vacation_ldap_attr_vacationenable'] => ‘%vacation_enable’,
$rcmail_config['vacation_ldap_attr_vacationmessage'] => ‘%vacation_message’,
$rcmail_config['vacation_ldap_attr_vacationforwarder'] => ‘%vacation_forwarder’
)
)
);
Il y a donc une opération de remplacement LDAP effectuée sur 3 attributs. Comme tu le vois le mapping est fait par code PHP.
Jette un oeil à la doc pour la syntaxe de remplacement (https://github.com/bhuisgen/rc-vacation/blob/master/doc/DRIVER-LDAP). Sur @github,
j’ai ajouté un search/replace sur les paramètres de bind de l’utilisateur (login/mot de passe mail) pour pouvoir faire une connexion avec les mêmes credentials. Ce ne sera pas possible sur la version 0.4 actuelle.
Merci pour ces explications plus que clair, mais à moins que je n’ai pas compris une subtilité ma question reste entière.
Mon vacation_ldap_modify_dns devrait dans le meilleur des monde être : uid=Crupuk,ou=Users,o=SoEz,dc=soez,dc=be or la valeur Crupuk n’est pas connue de Roundcube ni du plugin. Cette valeur doit être récupérée depuis le LDAP et c’est la que je coince.
Comment récupérer l’uid pendant mon search pour l’utiliser pour le modify ?
Encore merci pour votre temps, votre plugin et votre aide :-)
@Crupuk
Tu souhaites donc une chaîne de connexion dynamique. Pour cela, récupères le code du plugin sur github car ce n’est pas possible avec la version 0.4.
https://github.com/bhuisgen/rc-vacation/
@Boris :
J’ai déjà téléchargé la branche 6675535 (Soit le commit du 17 janvier 2011 ), je ne suis donc pas sur la version 4 mais la version en développement.
Mais malheureusement, je ne vois pas ou c’est possible de spécifier un dns dynamique (Soit basé sur l’uid récupéré lors du read, soit sur le dns complet récupéré lors du read)
Je penses que nous avons ici, un petit problème de compréhension.
Mon idée ou ce que j’en ai compris :
vacation_ldap_modify_dns : Spécifie le dns sur le quel les modifications vacation_ldap_modify_ops seront effectuées.
Or, ce dns pour le moment n’accepte de dynamique que les valeurs %email,%email_local,.. défini dans DRIVER-LDAP.
Pour que ce plugin fonctionne dans ma configuration, je dois :
- Soit pouvoir récupérer le DNS lors du read uid=Crupuk,ou=Users,o=SoEz,dc=soez,dc=be
- Soit récupérer le Uid pour pouvoir le passer dynamiquement au modify_dns :
uid=%uid,ou=Users,o=Soez,dc=soez,dc=be
Est-ce possible dans la version en développement ?
@Crupuk
Avec l’email de ton utilisateur (local part ou complet) tu dois pouvoir construire le DN de l’entrée LDAP à modifier. Bref, la local part doit correspondre à un nom d’utilisateur LDAP.
Merci, donc ce n’est pas possible d’utiliser le plugin en l’état, c’est bien ce qu’il me semblait.
- Soit je revois le schéma LDAP
- Soit j’essaye d’ajouter un attribut dans le read .
Planifiez-vous d’ajouter une options pour récupérer d’autre champs dans le ldap pour pouvoir les utiliser ?
Merci pour vos réponses, en espérant que cette « demande » vous semble intéressante :-)
Ce patch n’est peut être pas le plus propre ni le plus pratique mais il permet d’utiliser le champ %uid pour le vacation_ldap_modify_dns .
Qu’en pensez-vous ?
http://files.soez.be/CentOs/Scripts/roundcube_vacation_uid.patch
Bonjour,
j’ai découvert votre plugin et l’ai aussitôt installé dans mon installation RoundCube.
Au niveau Vacation, je travaille avec LDAP et j’ai activé le support des dates de début et de fin.
Toutefois, pour sauvegarder correctement les dates dans LDAP, j’ai du modifier le fichier vacation.php :
– ligne 92: vacation_dateformat au lieu de vacation_calendar_dateformat
– ligne 504: $date au lieu de $value
Une fois ces deux modifications faite, la gestion des dates est parfaite.
@Benoit
Je viens de pusher ton fix sur github (https://github.com/bhuisgen/rc-vacation). Merci !
Hello Boris. I’m sorry but I can’t write french, so I will use english :(
I thing that I understood the problem that Crupuk has. The problem is that if you have your e-mail users in different OU’s, so you will have different DNs for the same mail domain.
For example, I have my users into:
uid=username,ou=*,ou=Users,ou=domain
where * is some string and username is the user name main attribute. This user contains other mail and vacation attributes.
With the current scheme, I can’t set vacation_ldap_mopdify_dns properly, because I don’t know the dn of the user.
I managed to get all the attributes, but not the dn, or the ou’s of the user.
I also seen that the op. that LDAP2 provides, ldap_search(), ALWAYS returns the dn. So, would it be very difficult to give an option to get these dn instead of setting manually the vacation_ldap_modify_dns?
Thank you.
Good job!.
@Boris HUISGEN
Réponse un peu tardive, mais merci Boris, tout fonctionne.
Enfin tout, presque, je planche sur le type MIME, défini comme ceci dans vacation_message_mime:
MIME-version: 1.0\nContent-type: text/html\n\n
Malheureusement, le type par défaut (text/plain), n’est pas remplacé. Le type défini précédemment apparaît alors à l’intérieur du message.
Il me semble que le problème se situe plus au niveau du script vacation.pl, mais je n’ai rien trouvé jusqu’à présent (de quelle façon désactiver le type MIME par défaut?).
Quelqu’un aurait une idée sur le sujet?
@Rémi
Il faut recoder la fonction do_mail dans vacation.pl. Si tu ne veux pas breaker les vacations existants, je te conseille de checker si $body contient du HTML et remplacer le MIME type le cas échéant.
Bonjour,
Vraiment un très bon plugin :)
La customisation des requêtes sql est parfaite pour s’adapter à une architecture particulière.
J’ai un problème cependant au niveau des dates et des redirections multiples.
Dans le fichier config.inc.php, ne peut-on pas y ajouter du code à nous ? A chaque fois que j’en ajoute, l’onglet préférence plante m’affiche une page vierge…
@Romain
N’hésite pas à modifier le code source du plugin si cela t’es nécessaire (pas dans le fichier de config !). Dans le cas d’ajout de nouvelles fonctions, j’accepte volontiers les patchs.
Je viens de résoudre mon problème pour ce qui est de la récupération de la date.
Concernant l’enregistrement. Le champ de ma table est de type datetime.
Ta méthode set_vacation_start($date) prend un timestamp en paramètre. Est-ce que je peux tout simplement formater ce timestamp avec date() pour que ça colle à mon type datetime et retourner le résultat ? Ça ne va pas poser de problème avec le type de %vacation_start ?