L'application dispose d'un fichier de configuration unique dont le format est JSON. Au sein de cette application, chaque bloc fonctionnel dispose de ses propres paramètres de configuration. Nous recensons ici les paramètres de configuration commun à tous les blocs fonctionnels.
L'application dispose d'un fichier de configuration unique dont le format est JSON. Au sein de cette application, chaque bloc fonctionnel dispose de ses propres paramètres de configuration. Nous recensons ici les paramètres de configuration commun à tous les blocs fonctionnels.
Tous les blocs fonctionnels tracent leur fonctionnement et notamment leurs difficuultés dans un système d'historisation. Ce système est un ensemble fini de journaux qui enregistrent par rotation. La rotation permet de ne pas saturer le support de stockage des journaux. Lorsque le dernier fichier journal est rempli, le premier est réutilisé pour les enregistrements suivants. On passe ensuite au second et ainsi de suite jusqu'à revenir au premier.
La rotation est fixée par deux facteurs et elle a leiu au premier des deux atteints :
Le nom de la racine des fichiers journaux ainsi que leur nombre, leur taille maximale et leur durée maximale d'utilisation sont paramétrables. Les versions actuelles des fichiers utilisent le format JSON. La plupart des paramètres sont facultatifs.
La propriété qui définit le journal se nomme log et son contenu est un tableau de propriétés. Le tableau qui suit précise les paramètres de ce tableau :
| Nom | Valeur par défaut | Description | ||||||
|---|---|---|---|---|---|---|---|---|
filename |
Obligatoire | Nom de la racine des fichiers journaux (chemin compris). L'extension si elle est précisée est ignorée. | ||||||
maxSize |
1048576 (1 Mio) | Taille maximale (en octets) d'un fichier journal avant rotation. | ||||||
timeout |
7 | Nombre de jours de conservation du journal avant rotation s'il n'a pas atteint sa limite de taille. | ||||||
filter |
warning |
Valeur du filtrage des traces :
{[ftl|fatal],[err|error],[wrn|warning],[dbg|debug|all]}.
Les traces d'une valeur située après celle indiquée ici ne sont pas enregistrées.
|
||||||
kept |
10 | Nombre total des fichiers journaux conservés. | ||||||
tee |
false | Indicateur d'affichage des traces sur la console (terminal). | ||||||
banner |
Facultatif |
|
Voici un exemple de fichier JSON pour configurer un journal :
"log": [
{"fileName": "/var/log/mon_journal"},
{"maxSize": 524288},
{"timeout": 1},
{"filter": "debug"},
{"kept": 3},
{"tee": true},
{"banner": [
{"title": "Prototypage du journal"},
{"properties": true}
]}
]
L'application dispose de deux files d'attente sur disque dont le rôle est de servir de tampon afin de réguler les différences de vitesse de traitement lors d'opérations d'entrées/sorties. La première file est appelée queue des courriels lus, la seconde queue des courriels redirigés
Ces deux files sont implementées par deux objets de classe FilesQueue de la
librairie jmp.
La méthode statique
shared_ptr<FilesQueue> FilesQueue::initFilesQueue(const QJsonObject& json)
permet de créer dans la pile (pointeur intelligent) une file d'attente disque.
Elle doit trouver dans le flux de configuration les propriétés suivantes :
| Nom | Valeur par défaut | Description |
|---|---|---|
path |
Obligatoire | Répertoire à utiliser pour stocker les fichiers de la file d'attente. |
period |
10000 | Période de la scrutation automatique du répertoire en ms. Une valeur négative ou nulle désactive la scrutation automatique. |
keep |
true | Indicateur de conservation et de prise en compte des fichiers existants sur le répertoire géré par la queue lors de son initialisation. |
Comme il y a deux files d'attente (courriels lus et courriels redirigés), les paramètres se présentent sous la forme :
{
"readQueue": [
{
"path": "/var/pimail/queue/read"
},
{
"period": 5000
},
{
"keep": true
}
],
"redirectedQueue": [
{
"path": "/var/pimail/queue/redirected"
},
{
"period": 6000
},
{
"keep": false
}
]
}
La boîte aux lettre "source" est un couple (adresse courriel, nom de dossier). Pour une même adresse courriel (appelée BAL "globale"), il peut y avoir plusieurs BAL "source". Il serait contre-productif de répéter les paramètres de la BAL "globale" pour chaque BAL "source". On déclare donc une BL "globale" dont les dossiers permettent de recomposer les BAL "source".
| Nom | Valeur par défaut | Description | |||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
label |
Obligatoire | Identifiant unique de la BAL (en générale l'adresse courriel de la BAL "globale"). | |||||||||
folders |
[{"leaf": "INBOX"}] |
Nom du ou des dossiers IMAP de stockage des messages de la ou des BAL "source".
Il s'agit d'un tableau qui comporte autant de fois la propriété
|
|||||||||
host |
Obligatoire | Alias ou adresse IP du serveur IMAP. | |||||||||
port |
993 | N° du port d'écoute TCP du serveur IMAP. | |||||||||
user |
Obligatoire | Nom du compte autorisé à accéder au serveur IMAP. | |||||||||
psssword |
Obligatoire |
Mot de passe chiffré, encodé ou en clair d'accès via le compte
Le chiffrement est obtenu avec la clef interne de la librairie cipher. |
|||||||||
authentication |
plain |
La valeur de cette propriété est insensible à la casse et doit être dans la liste qui suit :
A noter que
Actuellement, le mode |
|||||||||
transport |
Submission |
La valeur de cette propriété est insensible à la casse et doit être dans la liste qui suit :
A noter que |
|||||||||
queuePath |
Obligatoire |
répertoire sur lequel déposé les courriels lus. |
Voici un exemple de fichier JSON pour configurer une BAL source :
{
{"label": "jm@plumo.com-INBOX"},
{"folders": [
{"leaf": "INBOX"},
{"leaf": "SENT"}
]},
{"host": "imap.plumo.com"},
{"port": 993},
{"user": "jm"},
{"password": "Csecret"},
{"authentication": "plain"},
{"transport": "submission"},
{"queuePath": "/var/pimail/queue/read"}
}
Les BAL source sont une liste de BAL IMAP. Attention, il ne faut pas confondre adresse courriel et BAL. Un serveur IMAP maintient, pour une même adresse courriel, plusieurs dossiers. Ce sont ces dossiers qui sont en fait les BAL. Certains sont relativement standard (INBOX, SENT, TRASH, DRAW) mais d'autre sont personnalisés par le serveur, le founisseur et même l'utilisateur. Pour pimail, une BAL fait référence à un couple (adresse courriel, nom de dossier). Ainsi l'utilisateur qui veut rediriger ses courriels "envoyés" devra explicitement déclaré une BAL "source" sur ce dossier en plus de celle sur les messages reçus.
En d'autres termes, cela revient à dire que, contrairement à ce que font de trop nombreux utilisateurs, un serveur IMAP n'est pas une base de données où conserver ses courriels et où organiser son travail. Ce type de serveur n'a pas été conçu pour cela et il y a 2 raisons pour en respecter l'esprit :
La bonne pratique et d'utiliser les dossiers IMAP uniquement comme tampon entre vos partenaires et votre
propre système.
Les messages, quant à eux, doivent être récupérés et organisés sur votre propre système de fichier avant
d'être définitivement supprimés du serveur IMAP.
Notez que la "corbeille" correspond généralement au dossier TRASH des serveurs IMAP et le fait
de supprimer un message d'une des boîtes vers la corbeille ne libère aucun volume de quota.
Ainsi, pour récupérer de l'espace, il faut également vider cette corbeille.
La plupart des clients de messagerie non web et notamment Thunderbird créent dans leur arborescence par défaut un dossier avec un nom proche de Dossiers locaux. Pour déplacer un message d'un des dossiers du serveur vers votre systèmme et récupérer l'espace qu'il occupe dans le quota, il suffit généralement de le glisser-déposer vers l'arborescence des Dossiers locaux. Ces dossiers locaux sont gérés localement par le client de messagerie et non par le serveur IMAP. Vous pouvez donc y créer sans limitation l'arborecence souhaitée.
Un des intérêts du classement des messages dans les dossiers locaux et d'y avoir accès même en cas de panne réseau.
La déclaration des BAL source se fait via la propriété JSON mailboxes qui est un tableau de BAL
telles que nous les avons définies ci-dessus.
Si la propriété mailboxes n'est pas trouvée dans la configuration, l'application s'interrompt
sur un message d'erreur.
Voici un exemple de déclaration de deux BAL source :
"mailboxes": [
"mbx": {
{"label": "jm@plumo.com"},
{"folders": [
{"leaf": "INBOX"},
{"leaf": "SENT"}
]},
{"host": "imap.plumo.com"},
{"port": 993},
{"user": "jm"},
{"password": "Csecret"},
{"authentication": "plain"},
{"transport": "submission"}
}
"mbx": {
{"label": "contact@plumo.com"},
{"folders": [
{"leaf": "INBOX"},
{"leaf": "SENT"},
{"leaf": "Commercial"}
]},
{"host": "imap.plumo.com"},
{"port": 993},
{"user": "contact"},
{"password": "Cautre_secret"},
{"authentication": "plain"},
{"transport": "submission"}
}
]
Notez que nous définissons 2 BAL "globales". La première comporte 2 dossiers soit 2 BAL "source". La seconde comporte 3 dossiers soit 3 BAL "source". Notre déclaration comporte donc 5 BAL source. Si les dossiers contiennent des sous-dossier, ils ne seront pas analysés récursivement et vous devrez les déclarer explicitement en tant que dossier en précisant leur chemin depuis la racine. Comme nous le verrons plus tard, le mécanisme de redirection s'attache à la BAL "source" et non à la BAL globale.
{label}-{leaf}.
En reprenant notre exemple nos BAL "source" se nomment :
Chacun d'elle pourra être redirigée vers une ou plusieurs adresses quelconques par le redirecteur.
Remarque importante : le nom du dossier à déclarer n'est pas celui affiché par votre client de messagerie mais celui connu du serveur. Ainsi Thunderbird affiche Boîte de réception mais le vrai dossier est généralement INBOX (dépend du serveur). Thunderbird comme d'autres clients de messagerie permettent le plus souvent (dans les propriétés du dossier) de connaître son nom côté serveur.
Pour stocker nos informations, nous utilisons la base de données PostgreSQL. Cette base de données relationnelle supporte les transactions et nous disposons déjà d'une librairie en facilitant l'accès : pgsql.
La propriété qui définit le journal se nomme db et son contenu est un tableau de propriétés. Le tableau qui suit précise les paramètres de ce tableau :
| Nom | Valeur par défaut | Description |
|---|---|---|
host |
localhost | Adresse ou alias IP du serveur PostgreSQL. |
port |
5432 | N° du port d'écoute TCP du serveur PostgreSQL. |
schema |
Obligatoire | Nom du schéma de base de données. |
account |
Obligatoire | Nom du compte qui accède au schéma de la base de données. |
password |
Obligatoire |
Mot de passe chiffré, encodé ou en clair d'accès via le compte
Le chiffrement est obtenu avec la clef interne de la librairie cipher. |
Voici un exemple de fichier JSON pour configurer l'accès à la base de données :
"db": [
{"host": "192.168.6.32"},
{"port": 1234},
{"schema": "pimail"},
{"account": "pimail"},
{"password": "Csecret"},
]
La table de redirection indique vers quelles adresses courriel (To, Cc et Bcc) rediriger les messages reçus par une BAL "source".
| Nom | Valeur par défaut | Description | ||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
from |
Obligatoire | Adresse courriel du ré-émetteur. | ||||||||||||||||||||||||||||||||||||
smtp |
Obligatoire |
Il s'agit d'un tableau qui définit les paramètres du serveur SMTP à utiliser pour ré-émettre les messages.
|
||||||||||||||||||||||||||||||||||||
redirection |
Obligatoire |
Il s'agit d'un tableau répété pour chaque BAL "source" à rediriger.
|
La propriété "domain" précise le domaine à fixer dans l'en-tête Message-ID.
La partie préfixe de Message-ID est l'estampille temporelle (ms) suivi d'un alea sur 4 octets exprimé
en hexadécimal :
Message-ID: {timestamp}-{alea}@{domain}.
Lors du chargement de la configuration, le programme doit vérifier les règles suivantes :
Voici un exemple de fichier JSON qui sert de table de redirection :
{
"from": "...",
"smtp": [
{"domain": "..."},
{"host": "..."},
{"port": 465},
{"user": "..."},
{"password": "C|B|E..."},
{"authentication": "plain"},
{"transport": "submission"}
]
"redirection": [
"source": [
{"email": "..."},
{"folder": "..."}
],
"to": [
{"email": "..."},
...
{"email": "..."}
],
"cc": [
{"email": "..."},
...
{"email": "..."}
],
"bcc": [
{"email": "..."},
...
{"email": "..."}
]
]
...
}