# [HOWTO] centralisation des mails  postfix/dovecot/dspam...

## Bapt

 INTRODUCTION

Nous allons mettre en place une solution centralisés de gestion des mails personnels depuis plusieurs fournisseurs.

Le but est de rapatrier tous les mails en provenance de multiples sources, de le passer dans un filtre anti-spam et anti-virus, de les trier, de les mettre à disposition sur un serveur imap, et de pouvoir envoyer les mails en utilisant les serveurs smtp des officiels des fournisseurs avec authentification.

Enfin de faire du nettoyage automatique de l'arborescence imap.

Pour cela nous allons utiliser les outils suivants : 

dovecot : net-mail/dovecot

dspam : mail-filter/dspam

clamav : app-antivirus/clamav

postfix : mail-mta/postfix

fetchmail : net-mail/fetchmail

imapfilter : mail-filter/imapfilter

plugin dpsam pour dovecot : à compiler à la main

 POSTFIX

Tout d'abord, il faut installer postfix :

```
paludis -i postfix
```

ou 

```
emerge postfix
```

Il faut s'assurer que postfix est bien compilé avec les options suivantes : ssl sasl.

Pour que postfix puisse faire du relay authentifié en fonction de l'adresse mail de l'envoyeur, il faut impérativement une utiliser une version 2.3 ou supérieure.

 CONFIGURATION DE POSTFIX POUR LE RELAI

Pour le relai, il faut dans le main.cf (/etc/postfix/main.cf) de postfix ajouter les options suivantes : 

```

sender_dependent_relayhost_maps = hash:/etc/postfix/sender_relay

smtp_sasl_auth_enable = yes

smtp_sasl_password_maps = hash:/etc/postfix/smtp_passwords

smtp_sasl_security_options = noanonymous

smtp_sasl_tls_security_options = noanonymous

smtp_sender_dependent_authentication = yes

smtp_tls_per_site = hash:/etc/postfix/tls_per_site 

```

le fichier /etc/postfix/sender_relay va permettre de mapper une adresse mail à un serveur smtp de la manière suivante :

```

user1@gmail.com smtp.gmail.com:587

user2@gmail.com smtp.gmail.com:587

user@free.fr smtp.free.fr

user@maboite.com smtp.maboite.com 

```

pour finir ne pas oublier : 

```
postmap /etc/postfix/sender_relay
```

Le fichier /etc/postfix/smtp_passwords va conserver les noms d'utilisateurs et mot de passer d'un compte smtp d'une adresse mail donnée de la manière suivante : 

```

user1@gmail.com user:passwd

user2@gmail.com user:passwd

user@free.fr user:passwd

user@maboite.com user:passwd

```

pour finir ne pas oublier : 

```
postmap /etc/postfix/smtp_passwords
```

Le fichier /etc/postfix/tls_per_site va permettre de définir si l'on doit utiliser une authentification de type tls ou non pour un serveur smtp donné :

```
smtp.gmail.com MUST

smtp.maboite.com MUST 
```

pour finir ne pas oublier : 

```
postmap /etc/postfix/tls_per_site
```

Pour le reste configurer postfix normalement, TLS ou pas, etc. La configuration si dessus fait que dès que postfix devra envoyer un mail depuis user1@gmail.com il le relayera au smtp de gmail par exemple.

 DOVECOT

installer dovecot :

```
paludis -i dovecot
```

ou 

```
emerge dovecot
```

Ne pas oublier le USEFLAG sieve pour permettre de filtrer les nouveaux mails

 CONFIGURATION DE DOVECOT

Le fichier de configuration de dovecot est très simple, /etc/dovecot.conf, lisez le et configurer le selon vos besoins. 

Pour activer le plugin de filtrage sieve, vérifier que vous avez bien les lignes suivante dans le fichier de configuration : 

```

protocol lda {

 

  ....

  mail_plugins = cmusieve

  mail_plugin_dir = /usr/lib/dovecot/lda

  ....

}

```

 DSPAM

Nous pouvons maintenant envoyer des mails, et stocker nos mails, Nous allons maintenant mettre en place un antispam, ici dspam car il est très efficace léger, et dispose d'une interface clamav, en plus il existe un plugin dovecot qui nous facilite la vie.

```
paludis -i dspam
```

ou 

```
emerge dspam
```

N'oubliez pas le USEFLAG clamav pour l'antivirus

et en choisir un dans cela pour le support des données utilisateurs : mysql oracle postgres sqlite sqlite3 user-homedirs

Dans mon cas j'ai choisi user-homedirs car je ne vois pas l'intérêt d'avoir une base de donnée un seul utilisateur  :Smile: 

 CONFIGURATION DE DSPAM

Dans notre cas nous allons délivrer tous les mails y compris les spam (afin de pouvoir détecter les éventuelles erreurs : faux-positifs)

Donc s'assurer que dans /etc/dspam.conf on a bien l'option suivante : 

```
Preference "spamAction=deliver"
```

DSPAM signe chaque message filtré afin de pour pouvoir faire un suivit pour l'apprentissage, cette signature nous la voulons uniquement dans les entêtes du mail donc : 

```
Preference "signatureLocation=headers"
```

Nous voulons utiliser le LDA (Local Delivery Agent) par dovecot, donc : 

```
TrustedDeliveryAgent  "/usr/libexec/dovecot/deliver -d %u"
```

et 

```
UnTrustedDeliveryAgent  "/usr/libexec/dovecot/deliver -d %u"
```

Dans mon cas je souhaite recevoir tous les mails qui arrive au serveur, y compris ceux des autres user du système donc j'ai ramplacer %u par le nom de mon user

Et on active le support clamav : 

```

ClamAVPort      3310

ClamAVHost      127.0.0.1

ClamAVResponse accept

```

 CONFIGURATION DE POSTFIX POUR DSPAM

DSPAM peut s'interfacer de plusieurs manière avec postfix : 

soit en tant que relay en faisant tourner dpsam en tant que serveur smtp, soit en ligne de commande, soit en tant que service LMTP, soit en tant que delivery agent

Dans notre cas, nous allons utiliser DSPAM en tant que LDA car c'est très simple.

dans main.cf

```
mailbox_command=/usr/bin/dspam --deliver=innocent -- -d %u
```

 FETCHMAIL

Nos mails sont maintenant correctement relayés, stockés, et filtrés.

Il ne nous restent plus qu'a les recevoir :

```
paludis -i fetchmail
```

ou

```
emerge fetchmail
```

 CONFIGURATION FETCHMAIL

Dans le répertoire de l'utilisateur qui executera fetchmail, éditer le fichier .fetchmailrc :

```
poll pop.free.fr protocol pop3 username "XXXXX" password "XXXXXXX"

poll mail.maboite.com protocol pop3 port 995 username "XXXXXXX" password "XXXXXXX" ssl

poll pop.gmail.com protocol pop3 port 995 username "XXXXXXX" password "XXXXXXX" ssl

poll pop.gmail.com protocol pop3 port 995 username "XXXXXXX" password "XXXXXXX" ssl

```

éditer la crontab pour l'exécuter toutes les 10 minutes par exemple  

```

*/10 * * * * /usr/bin/fetchmail -s

```

 DOVECOT-SIEVE

Pour filtrer les mails entrant et les répartir dans l'arborescence imap : 

il suffit de rajouter des ligne dans le fichier $HOME/.dovecoe.sieve

Par exemple pour mettre tous les spam dans le répertoire "spam"

```

if header :contains "X-DSPAM-Result" "Spam" {

        fileinto "spam";

        stop;

}

```

Pour plus d'information sur la syntaxe sieve 

http://www.bath.ac.uk/bucs/email/sieve.shtml

http://www.cmu.edu/computing/documentation/sieve/sieve.html

 DOVECOT-DSPAM

Dovecot dispose d'un interface lui permettant de rajouter des plugins vous trouverez ici : http://johannes.sipsolutions.net/Projects/dovecot-dspam-integration un plugin permettant l'intégration de dovecot et dspam.

Ce plugin je l'ai légèrement modifier pour pouvoir définir manuellement le répertoire de spam ici : http://baptux.free.fr/libdspam.c

Pour l'installer il faut relancer la compilation de dovecot sans nettoyage des sources, ou le compiler à la main à côter.

Puis dans les sources de dovecot dans le répertoire src/plugins mettre le fichier libdspam.c

compiler :

```
gcc -fPIC -shared -Wall -I../ -I../lib -I../../ -I../lib-storage -I../lib-mail -I../lib-imap -I../imap -DHAVE_CONFIG_H -DDSPAM=\"/usr/bin/dspam\" -DSPAMFOLDER=\"spam\" libdspam.c -o lib_dspam.so
```

puis copier copier lib_dspam.so dans /usr/lib/dovecot/imap

Activer le plugin dans dovecot : dans dovecot.conf : 

```

protocol imap {

...

  mail_plugins = dspam

  mail_plugin_dir = /usr/local/lib/dovecot/imap

...

}

```

Dorénavant quand vous enlèverez un mail du répertoire spam, dpsam l'apprendra comme "non spam" et si vous en mettez un, il l'apprendra comme spam.

 IMAPFILTER

imapfilter est un utilistaire permettant de se connecter à un ou plusieurs compte imap et de faire des manipulation dessus.

Nous allons nous en servir pour faire du nettoyage automatique.

```
paludis -i imapfilter
```

ou 

```
emerge imapfilter
```

Le fichier de configuration est un script en lua : $HOME/.imapfilter/config.lua

Pour nettoyer tous les spam vieux de 2 jours par exemple : 

```
jour = {

        'before ' .. date_before(1),

}

results = match ( account1, "spam", jour)

delete (account1, "spam", results)

```

un ajout dans le cron et c'est automatique.

Plein de filtres peuvent être ainsi mis en place.

----------

## geekounet

Il est possible aussi d'utiliser le SASL Dovecot pour l'authentification à Postfix aussi, ce qui permet de ne conserver qu'un seul mécanisme (PAM personnellement)  :Smile: 

Il faut déjà compiler postfix avec les use sasl dovecot-sasl, et ensuite :

```
smtpd_sasl_auth_enable = yes

smtpd_sasl_type = dovecot

smtpd_sasl_path = private/auth

smtpd_sasl_local_domain = $myhostname

smtpd_recipient_restrictions = permit_sasl_authenticated,permit_mynetworks,reject_unauth_destination
```

```
auth default {

  ...

  socket listen {

    client {

      path = /var/spool/postfix/private/auth

      mode = 0660

      user = postfix

      group = postfix

    }

  ...

  }

}
```

----------

## zeuss1414

Bon ben nikel se ptit tuto, Merci    :Wink: 

J'utilise déja un certain nombre de ces outils (dovcot, fetchmail ...) donc je vais essayer tout ca à l'occaz, genre la semaine prochaine car la ca va être tendu. 

Si tout marche bien j'essaierai d'ajouter un parti webmail (genre roundcube) que je trouve sympa, et si on pouvait rajouter une partie envoie de mail pour un domaine donnée ca serait un tuto complet pour quelqu'un qui veux se monter un serveur de messagerie. Et ca lui évitera de galérer comme nous tous pour faire un truc comme ca.

----------

## Bapt

 *geekounet wrote:*   

> Il est possible aussi d'utiliser le SASL Dovecot pour l'authentification à Postfix aussi, ce qui permet de ne conserver qu'un seul mécanisme (PAM personnellement) 
> 
> Il faut déjà compiler postfix avec les use sasl dovecot-sasl, et ensuite :
> 
> ```
> ...

 

Oui mais je n'ai pas mis d'authentification à mon postfix car il n'est pas ouvert de l'extérieur  :Smile: 

En revanche ça m'a permis de comprendre pourquoi mon le sasl de dovecot de fonctionnait pas pour l'authentification sur les relais  :Smile:  je vais essayer avec smtp_sasl_type = dovecot pour voir (ça fait une dépendance de moins si ça marche)

----------

## Bapt

Testé et rejeté.

Pour l'authentification vers les smtp externes genre gmail : il faut smtp_sasl_auth or smtp_sasl_type = dovecot n'est pas encore pris en compte pas postfix  :Sad: 

Donc on conserve la dépendance cyrus pour le moment.

postfix ne connait pour le moment que smtpd_sasl_type = dovecot.

Ou alors je me suis loupé quelque part

EDIT : Bon en fait il s'agit d'un bug sur les ports de FreeBSD, je ne sais pas ce qu'il en est sous gentoo.

Quoi qu'il en soit le SASL dovecot ne fonctionne que pour le smtpd_sasl_type, il faut conserver cyrus pour le smtp_sasl_auth.

----------

## Bapt

A noter que fetchmail peut être remplacer allègrement par fdm (non encore présent sous forme d'ebuild) mais ça ne devrait pas être trop dur à faire.

fdm est très léger et très efficace, au niveau fonctionnalité il fait : fetchmail+procmail+mda. http://fdm.sourceforge.net/

----------

## man in the hill

Salut,

Merci pour ce tuto car quand on veut monter ce genre de conf on est bien heureux de trouver ce travail bien fait   :Wink:   !

Je signal un soucis que j'ai eu avec la redirection vers gmail, j'ai du rajouter ds le fichier tls_per_site

```
smtp.gmail.com    MUST_NOPEERMATCH
```

car j'avais l'erreur suivante entre autre :

```
(Cannot start TLS: handshake failure)
```

----------

## Bapt

Tiens c'est étonnant chez moi ça marche sans problèmes sans cette option (postfix 2.4.3) tu utilises qu'elle version ?

----------

## man in the hill

 *Bapt wrote:*   

> Tiens c'est étonnant chez moi ça marche sans problèmes sans cette option (postfix 2.4.3) tu utilises qu'elle version ?

 

Salut,

J'utilise une version postfix-2.3.6 avec une gentoo profile server 2007 .

----------

## Bapt

Bah ça doit être lié à la version de postfix alors.

----------

## olivier elmekki

Cette solution me semble un peu excessive. Je m'explique : elle convient parfaitement si on désire envoyer des mails depuis différents serveurs smtp, mais cela implique de devoir définir manuellement, pour chaque mail, un sender, ou alors, cela prend sens dans un environnement multi-utilisateurs si on veut que chacun utilise un serveur smtp différent.

Néanmoins, je pense que la plupart des utilisateurs qui seront intéressés par ce sujet voudront centraliser leurs mails sur leur ordinateur personnel, comportant un seul utilisateur et ne nécessitant pas l'utilisation de plusieurs serveur smtp différents.

Dans ces conditions, c'est l'emploi de postfix qui me semble exagéré, je veux dire le fait d'installer un serveur mail aussi complet, pour ensuite le brider. Bien qu'il soit fait pour être plus facile à configurer que d'autres serveur mail, il reste complexe à administrer, et une erreur de configuration de la part d'un utilisateur mal renseigné peut vite amener à faire de sa machine un serveur de spam à son insu.

La solution alternative que je proposerai serai l'emploi de fetchmail + nbsmtp + clamav + maildrop. Il n'y a guère que la configuration de maildrop qui demandera une certaine attention (ce qui est inévitable pour un filtre de mail, puisqu'il faut lui définir des règles), mais une erreur de configuration, au moins, ne risquera pas de créer des trous de sécurité.

Voici un exemple de mise en place.

FETCHMAIL

------------

Deux choix : 

1°) utiliser le script init.d et le fichier conf.d de gentoo

a) éditer /etc/conf.d/fetchmail pour définir l'intervalle de temps dans laquelle fetchmail est lancé

b) executer 

```
rc-update add default fetchmail
```

c) placer la configuration dans /etc/fetchmailrc

Fetchmail se plaint de cette option, car il recommande de ne pas être lancé par root.

2°) configurer fetchmail pour être lancé par un utilisateur

a) définir le type d'appel

 - soit on lance fetchmail en mode daemon ( 

```
fetchmail -d NBR_SECONDE
```

 ), dans ce cas, il faut faire lancer par l'utilisateur au démarrage, par exemple dans ~/.xinitrc

 - soit on place une règle dans /etc/crontab qui appelle fetchmail régulièrement en tant qu'utilisateur. Par exemple, pour l'utilisateur USER :

```
*/3  *  * * *   USER    fetchmail -a
```

 (toutes les 3 minutes)

b) Placer la configuration dans ~/.fetchmailrc

exemple de configuration :

```
poll pop.server.com protocol pop3 

  user "NOM.PRENOM" there with password "PASSWORD" 

  is "USER" here 

  and wants mda "/usr/bin/maildrop"

poll imap.server2.com protocol imap

  user "SURNOM" there with password "PASSWORD2"

  is "USER" here

  and wants mda "/usr/bin/maildrop"

```

S'assurer que ce fichier n'est pas lisible par other, voir même par group, pour ne pas compromettre ses mots de passe.

nbsmtp

--------

placer la configuration dans ~/.nbsmtp

```
relayhost=smtp.server.com

fromaddr=NOM.PRENOM@server.com

domain=server.com

auth_mech=login

auth_user=NOM.PRENOM

auth_pass=PASSWORD

```

S'assurer que ce fichier n'est pas lisible par other, voir même par group, pour ne pas compromettre ses mots de passe.

clamav

--------

pas de configuration particulière

maildrop

---------

La configuration va dans /etc/maildroprc ou dans ~/.mailfilter (dans ce dernier cas, le fichier n'est lu que s'il a les permissions 600)

exemple :

```
DEFAULT="/home/USER/Mail/default"

MAILDIR="/home/USER/Mail/"

logfile "$MAILDIR/.maildrop.log"

log "----------------"

log ""

#utiliser clamdscan au lieu de clamscan si vous avez fait des configurations particulières dans /etc/clamd.conf

# (cela peut servir par exemple à envoyer un mail d'avertissement quand un virus est détecté)

`clamscan -`

if ( $RETURNCODE == 1 )

{

  log "mail vérolé!"

  to $MAILDIR/.viruses

}

if   (  /^X-Advertisement:.*/       \

   || /^X-Spam-Status: YES /       \

   || /^Message-ID:*<>/          \

        || /^From: "spammer\.biz"/         \

        || /<html>|<HTML>/:b           )

{

    exception {

        to $MAILDIR/.junk

    }

    log "Error while deliver to junk"

}

```

Ce fichier permet à la fois de filtrer les spams et d'appeler l'antivirus (et toute application de traitement des mails, d'ailleurs). Sa syntaxe est décrite dans maildropfilter(7).

----------

## Shadow AOK

J'ai un petit problème avec ce sympathique tuto que je déroule sur un serveur fraichement installé.

Dovecot ne veut plus démarrer depuis que j'ai renseigné le path pour le socket client.

Voici ce que j'ai dans mes logs :

```
Oct  5 23:40:36 rdv dovecot: Dovecot v1.1.1 starting up

Oct  5 23:40:36 rdv dovecot: auth-worker(default): mysql: Connected to localhost (srv_postfix)

Oct  5 23:40:36 rdv dovecot: Fatal: auth(default): Socket already exists: /var/spool/postfix/private/auth

Oct  5 23:40:36 rdv dovecot: Fatal: Auth process died too early - shutting down
```

J'utilise postfix 2.5.5 et Dovecot 1.1.1.

Que le fichier auth existe ou pas, que postfix ne soit déjà lancé ou non, l'erreur reste la même.

Voici les permissions du fichier auth :

```
srw-rw-r--  1 postfix postfix    0 oct  5 23:54 auth
```

Quelqu'un aurait une idée svp ?

----------

## Shadow AOK

J'ai trouvé la solution il y a quelques jours.

Il faut rajouter ceci dans le main.cf de postfix :

```
dovecot_destination_recipient_limit = 1
```

----------

