| Partage d'une boîte aux lettresDenis BRAUSSEN |
version du samedi 11 avril 1998
révisée le mardi 14 avril 1998
révisée le mercredi 15 avril 1998
le document qui suit décrit une 'astuce' permettant de fournir ce service individuellement (à chaque membre du groupe) dans des conditions acceptables (voir paragrahes (1.2.1) et (4.3))
les moyens mis en oeuvre sont simples et gratuits, tous les programmes utilisés etant sous licence "GPL"
par exemple: denis.braussen@hol.fr
- on a une machine ("batman.gotham.city"), reliée grâce à PPP (Point to
Point Protocol) avec une adress IP (Internet Protocol) dynamique,
qui se connecte regulierement sur le serveur SMTP (Simple
Mail Transport Protocol) de ce FAI.
En gros c'est la méthode habituelle de connexion pour un
particulier abonné à un provider (hol, oleane, wanadoo, easynet,
etc...)
(Bien entendu, la méthode décrite ici serait également valable si le mode de connexion était different : IP fixe, protocole SLIP au lieu de PPP, etc...)
- sur cette même machine, plusieurs comptes sont ouverts.
par exemple: denis, gilles, thierry
c'est-à-dire que l'on souhaite :
+-----------------------------------------+-------------------------+
| si le champ "To:" contient : | alors procmail vers : |
+-----+-----------------------------------+-------------------------+
| To: | gilles <denis.braussen@hol.fr> | gilles@localhost |
| To: | denis <denis.braussen@hol.fr> | denis@localhost |
| To: | thierry <denis.braussen@hol.fr> | thierry@localhost |
+-----------------------------------------+-------------------------+
(je pense qu'il n'est pas obligatoire que ce droit soit conféré à UN seul utilisateur, mais si on choisit que PLUSIEURS utilisateurs puissent se connecter sur le serveur POP alors chacun devra posséder un $HOME/.procmailrc identique en tous point à ceux des autres utilisateurs. Bien entendu ceci est hors de question car :
-wr-------
et appartenir à l'utilisateur qui l'invoque. donc
cet utilisateur pourrait l'éditer à sa guise et de fait
manipuler le courrier (le sien mais aussi celui des autres).
Ce n'est évidemment pas envisageable.sur batman.gotham.city j'ai donc créé un nouvel user. Il est seul habilité à retirer du courrier sur le serveur POP. j'ai choisi pour lui le login : "postman"
voici ses caractéristiques :
! batman:~$ finger postman
!
! Login: postman Name: Post Office
! Directory: /home/postman Shell: /bin/bash
Remarquer son "Name:" qui est : "Post Office"
ce choix n'est pas fortuit :
"postman" et "Post Office" commencent par "post"
ce qui sera bien utile lors de l'écriture des
regles dans /home/postman/.procmailrc
(et en plus, Post Office, ça a de l'allure :-) )
(note : par defaut PROCMAIL ne prend pas garde à la casse (case insensitive) donc pour lui "post" et "Post" ou "POST" etc... sont équivalents)
2.2.2) - créer le fichier /home/postman/.procmailrc et y écrire nos règles de redistribution du courrier (voir exemple plus bas dans "Annexes")
2.2.3) - modifier les éventuels scripts de connexion et de rapatriement du courrier pour que "postman" seul qui puisse les lancer
En particulier, il est possible que le rapatriement du courrier se fasse automatiquement lors de l'exécution du script /etc/ppp/ip-up lancé automatiquement par le daemon "pppd" (man pppd pour plus de renseignements)
or pppd doit être lancé par "root" (ou être suid-root) et /etc/ppp/ip-up appartient à root (-rwx------)
===> si FETCHMAIL est lancé depuis un /etc/ppp/ip-up il est nécessaire qu'il soit "su" pour l'utilisateur "postman" afin que /home/postman/.procmailrc soit interprete.renseignements :
- man su
- exemple en "Annexes"
les mails sortant de votre machine *doivent* apparaître pour les machines de l'Internet avec un nom de domaine existant réellement, sous peine de se voir refuser la distribution des mails par certains serveurs; Il faut donc configurer sendmail de sorte qu'il modifie le champ "From:" de mails sortants.
La solution utilisée sur batman.gotham.city utilise les "GENERICSTABLE" : ces "tables génériques" obligent sendmail remplacer le contenu du "From:" de tout message écrit par chaque user par un autre, prédéterminé.
Comme les mails sortants sont aliasées par sendmail via /etc/revaliases (voir 2.3.1) il faut aliaser chaque utilisateur avec cette adresse email unique :
voici un exemple de /etc/revaliases
denis: denis.braussen@hol.fr
gilles: denis.braussen@hol.fr
thierry: denis.braussen@hol.fr
postman: denis.braussen@hol.fr
(notez l'ajout de "postman")
(n'oubliez pas de lancer un /usr/sbin/sendmail -bi -oA/etc/revaliases pour remettre la base à jour apres chaque modification. Si sendmail fonctionne en mode daemon, il faudra le killer puis le relancer pour qu'il prenne les modifs en compte)
ainsi, chaque mail sortant verra son champ "From:" réécrit par sendmail ainsi:
denis -> denis.braussen@hol.fr
gilles -> denis.braussen@hol.fr
etc..
| au total, à chaque session : | sendmail -q | (envoi normal) |
| fetchmail | (rapatriement normal) | |
| sendmail -q | (renvoi si erreur) | |
| fetchmail | (si l'erreur provient d'un user de batman) |
(pour éviter d'avoir a effectuer deux fois le cycle
sendmail -q (envoi normal)
fetchmail
)
comme décrit au paragraphe précédent, il serait judicieux que
les mails renvoyés à des expediteurs qui sont des users de
batman.gotham.city ne repassent pas par le FAI mais soient
transportés localement au lieu de retourner chez le FAI
avant d'être a nouveau rapatrié.
j'ai écris un mini patch à placer dans /etc/sendmail.cf qui
fait exactement ceci :
but: remplacer tous les <denis.braussen@hol.fr>
par <postman.gotham.city> dans les champs "to:" des
mails 'partant'
ainsi tout le courrier au départ de <postman.gotham.city>
et adressé à "user <denis.braussen@hol.fr>" sera distribué
localement.
comment: attaquons nous à la règle qui canonise les adresses : on cherche une correspondance puis on renvoie a une règle habituelle ($96) qui fera le travail pour nous avec au passage une substitution ! et le tour est joué !
voici :
############################################
# Ruleset 3 -- Name Canonicalization ###
############################################
S3
# remplace tous les <denis.braussen@hol.fr> par des <postman.gotham.city>
# dans les champs "To:"
#
R$* <denis.braussen@hol.fr> $>96 $: $1 <postman@batman.gotham.city>
# ^^^^^^^attention: mettre ici une tabulation
Denis BRAUSSENS <denis.braussen@hol.fr>noter que l'adresse email (entre crochets) ne varie pas : seul le nom, considéré par sendmail et ses pairs comme un commentaire, change. les "From:" des messages expédiés à nos utilisateurs (donc récupérés dans la boîte aux lettres fournie par le FAI) seront donc, dès réception sur notre machine, analysés par procmail et ventilés dans les boîtes à lettres locales en fonction de ce nom.ou bien
gilles <denis.braussen@hol.fr>
thierry <denis.braussen@hol.fr>
il peut être utile (mais non obligatoire, on peut le faire à la main... mais bof... :-) ) que les utilisateurs de batman.gotham.city configurent leur lecteur de mail pour que celui, lors de la création d'un message (nouveau ou réponse), écrive correctement le champ "From:" (rajout du nom de l'user devant l'email) afin de ne pas avoir de probleme en cas de 'reply'.
En effet, les règles écrites dans /home/postman/.procmailrc utiliseront ce champ (en le transformant en champ "To:" d'ou l'importance pour les utilisateurs de batman.gotham.city d'avoir un champ "From:" correctement écrit) pour retourner le mail en cas d'erreur (voir paragraphe 1.2.1 et aussi "Annexes")
Si SENDMAIL ne tourne pas en mode daemon, le mail ira
attendre un "sendmail -q" dans /var/spool/mqueue.
Si
SENDMAIL tourne en mode daemon, le mail est renvoyé
diretement sur le serveur SMTP (Simple Mail Transport
Protocol) du FAI
1er cas: l'envoyeur n'est pas un user de batman.gotham.city
le mail est distribue par le serveur SMTP du FAI tout a fait normalement...
2ième cas: l'envoyeur EST un user de batman.gotham.city
le mail est distribue par le serveur SMTP du FAI tout a fait normalement...ET VA TOUT NATURELLEMENT REVENIR VERS denis.braussen@hol.fr !!
le prochain appel a "fetchmail" ira donc le chercher sur le serveur POP du FAI et ce mail subira a son tout /home/postman/.procmailrc !!!
ex 1:
+-------------------------------------------------+
| From: Denis BRAUSSEN <denis.braussen@hol.fr> |
| To: nimportequoi <denis.braussen@hol.fr> |
+-------------------------------------------------+
(nimportequoi est inconnu sur batman.gotham.city)
sera renvoyé à "denis"
ex 2:
+-------------------------------------------------+
| From: nimportequoi <denis.braussen@hol.fr> |
| To: un_autre <denis.braussen@hol.fr> |
+-------------------------------------------------+
(nimportequoi est inconnu sur batman.gotham.city)
(un_autre est inconnu sur batman.gotham.city)
sera renvoyé a "postman" car "nimportequoi" n'est pas connu
sur batman.gotham.city
ex 3:
+-------------------------------------------------+
| From: un_autre <un_autre@ailleurs.org> |
| To: nimportequoi <denis.braussen@hol.fr> |
+-------------------------------------------------+
(nimportequoi est inconnu sur batman.gotham.city)
(on ne se soucie pas de savoir si "un_autre" est
connu sur "ailleurs.org" : cela ne nous regarde plus.)
sera renvoyé a "nimportequoi <un_autre@ailleurs.org>"
note: j'utilise PINE et dans ce cas il faut renseigner le champ "personal-name" avec "Denis BRAUSSEN" (menu: SETUP/CONFIGURATION)
voir en "Annexes" /home/postman/procmailrc
de même :
- un mail envoyé à "Denis BRAUSSEN <denis.braussen@hol.fr>" sera rapatriées par "postman" puis redirigé vers "denis"
etc...
- un mail envoye a "albert <denis.braussen@hol.fr>" ou "albert" n'est pas un utilisateur de batman.gotham.city sera retourné à l'envoyeur avec un message d'erreur. dans le même temp l'en-tête de ce mail sera envoyé à "postman" (l'administrateur du système), à titre d'information.
idem pour l'user "postman", "gilles", "thierry", etc...
sera retourné à l'envoyeur.
===> il est primordial de prévoir une règle dans /home/postman/.procmailrc qui accepte au moins les emails adressés ainsi:
To: denis.braussen@hol.fr
car en général ils émanent de personnes qui ne connaissent pas les règles utilisées sur batman.gotham.city. Ces mails pourront être redirigés vers un user "special" (le Postmaster, en general).
note:
dans ce cas précis, pour /home/postman/.procmailrc
To: denis.braussen@hol.fr
et
To: Denis BRAUSSEN <denis.braussen@hol.fr>
c'est la même chose : ces mails seront expediés à "denis".
ça tombe bien, c'est lui l'administrateur :-)
mais ce cas de figure n'est pas général, alors pensez
à rediriger les mails qui n'ont pas de nom d'user dans le
libellé du champ "To:"
ATTENTION aussi : cette redirection doit se faire exclusivement par /home/postman/.procmailrc et non par un /home/postman/.forward car une .forward a PRIORITÉ sur .procmailrc !!
les champs cc (Carbon Copy) et Bcc (Blind Carbon Copy) ne peuvent pas être honorés avec ce système.
en clair, cela signifie qu'un utilisateur extérieur ne peut pas (sauf peut être en ecrivant des règles .procmailrc plus complètes) envoyer le même mail à plusieurs de nos utilisateurs en même temps.
le même problème se pose avec les listes de diffusion (mailing list)
sendmail + procmail (transport),
fetchmail (POP),
formail (filtre),
pine (lecteur),
dnl ---> /sendmail.mc a compiler par: m4 sendmail.mc > /etc/sendmail.cf
dnl ---> FEATURE(masquerade_envelope) et
dnl ---> FEATURE(genericstable,``hash -N /etc/revaliases'') sont
dnl ---> obligatoires pour reecrire le champ From: comme decrit plus haut
dnl ---> les autres options sont decrites sur www.linux-france.org, section
dnl ---> doc puis chercher sendmail...
dnl ---> (auteur: JC Delepine et Eric Jacoboni, il y a encore d'autres
dnl ---> articles mais ce sont ceux la dont je me suis le plus servi,
dnl ---> et je tiens a les remercier ici pour leur aide. MERCI, donc. :-)
dnl --->-----------------------------------------------------------------
include(`../m4/cf.m4')dnl
OSTYPE(`linux')dnl
define(`confCON_EXPENSIVE', `True')dnl
FEATURE(genericstable,``hash -N /etc/revaliases'')dnl
GENERICS_DOMAIN(batman.gotham.city batman)dnl
FEATURE(always_add_domain)dnl
FEATURE(nocanonify)dnl
FEATURE(redirect)dnl
FEATURE(masquerade_envelope)dnl
define(`PROCMAIL_MAILER_PATH', `/usr/bin/procmail')dnl
FEATURE(local_procmail)dnl
define(`confCOPY_ERRORS_TO', `Postmaster')dnl
define(`confME_TOO', `True')dnl
define(`confDEF_CHAR_SET', `ISO-8859-1')dnl
define(`confSMTP_MAILER', `smtp8')dnl
define(`SMTP_MAILER_FLAGS', `e')dnl
define(`confMIME_FORMAT_ERRORS',`True')dnl
define(`confCF_VERSION', `Denis BRAUSSEN - 19/fev/98')dnl
define(`SMART_HOST', `smtp8:mail.hol.fr')dnl
define(`confTO_QUEUEWARN', `24h')dnl
MAILER(local)dnl
MAILER(smtp)dnl
denis: denis.braussen@hol.fr
gilles: denis.braussen@hol.fr
thierry: denis.braussen@hol.fr
postman: denis.braussen@hol.fr
# For loopbacking.
127.0.0.1 batman.gotham.city localhost batman
# ^^^^^^^^^^^^^^^^^^
# le nom complet de ta machine EN PREMIER !!
# End of hosts.
#-----------------------------------------------------------------
# /home/postman/.procmailrc Denis BRAUSSEN 14 avril 1998
#-----------------------------------------------------------------
VERBOSE = on
LOGABSTRACT = all
LOGFILE = /home/postman/procmail.log
#
# pensez a vider de temps en temps /home/postman/procmail.log !! :-)
# grace a un cron par exemple (ou desactivez le)
# -> man procmailrc
# -> man procmailex
# ----------------------------------------------------------
# USERS CONNUS SUR batman.gotham.city
#
# test (U1)
# denis (U2)
# postman (U3)
#
#
# REMARQUE
# --------
#
# j'ai la "malchance" d'avoir une email qui commence par
# "denis" (denis.braussen@hol.fr) ET un user dont le loggin
# est "denis" --> je suis obligé d'ecrire la regle (U1)
# concernant "denis" differemment que les autres users.
#
# pour "denis" --> * ^To:.Denis|^To:..denis
#
# qui me permets d'attraper To: denis <denis.braussen@hol.fr>
# mais aussi To: Denis BRAUSSEN <denis.braussen@hol.fr>
# To: "denis" <denis.braussen@hol.fr>
# To: "Denis BRAUSSEN" <denis.braussen@hol.fr>
# To: denis.braussen@hol.fr
# To: <denis.braussen@hol.fr>
# etc...
#
#
#
# de même pour l'utilisateur privilégié : "postman" (U4)
#
#
# pour les autres users c'est beaucoup plus simple : un simple
# * ^To:.*gilles suffit à attraper n'importe quel "To:" qui contient
# "gilles" quelque part...
#
#
#
#
# ----------------------------------------------------------
#user: gilles------------------------------------------- (U1)
:0
* ^To:.*gilles
! gilles@batman.gotham.city
#user: thierry------------------------------------------- (U2)
:0
* ^To:.*thierry
! thierry@batman.gotham.city
#user: denis-------------------------------------------- (U3)
:0
* ^To:.Denis|^To:..denis
! denis@batman.gotham.city
#user: post (postman)----------------------------------- (U4)
:0
* ^To:.Post|^To:..Post
! denis@batman.gotham.city
#-(A2)-----------test generique--------------------------------------
#
# c'est ce test qui va renvoyer le mail a l'expediteur....
#
# attrape meme les mails sans champ "To:" comme les mails en "Bcc"
#
# 1) envoie de l'entete a "postman"
# 2) retour a l'envoyeur
#
#--------------------------------------------------------------------
:0
* .*
{
#-------------------- cc _ONLY_ the header of the mail to postmaster------
:0 Ac
| (formail -X "" | formail -R "To:" "To_ERREUR_SUR_CETTE_ADRESSE:"
| formail -A "To: postman@batman.gotham.city" ; cat postman_info)
| $SENDMAIL -t
# ATTENTION: les *3* ligne ci dessus sont a rassembler sur UNE SEULE
# ********** grande ligne dans le fichier original. C INDISPENSABLE.
#
# ne garde que l'entete
# renomme le champ "To:"
# recree un nouveau champ "To: postman..."
# rajoute le contenu de /home/postman/postman.info
# envoie le mail grace a sendmail
#---- return to sender with the list of valid email on the server --------
:0 A
| return_the_mail $SENDMAIL
# lance les script /home/postman/return_the_mail puis renvoie le mail
# grace a sendmail (voir ce script en 5.6)
}
#----------------------------------------------------------------------
ATTENTION: procmail est assez capricieux : la moindre erreur dans ce fichier le bloque
par exemple: (l'étoile devant 'Denis')
TIP: pour faire des test 'hors connexion' vous devez
envoyer vos mails a "postman@batman.gotham.city"
(car le .procmailrc est chez lui !)
ex: denis <postman@batman.gotham.city> OK
musclor <postman@batman.gotham.city> ECHEC :)
sous root, tapez : touch /etc:sendmail.cw
5.7.2) ne pas oublier l'indispensable /etc/aliases
pour rediriger certains mails.
attention : après chaque modif ce fichier la base qui en
dépend doit être reconstruite par un appel à 'newaliases'
# --> /etc/.forward
ATTENTION: - pas de .forward chez postman ! (voir 4.3.1)
- méfiez vous des 'boucles infinies' !
Je crée une adresse mail par utilisateur sur un des nombreux services de
boite aux lettres gratuites (hotmail, caramail, netaddress, mygale,
chez, yahoo etc.).
Chaque utilisateur a donc son adresse personelle de la forme
user@hotmail.com
Pour toutes ces adresses, je configure hotmail pour qu'il forwarde tout
vers adresse@mon-fournisseur.com
Pour récuperer le mail j'utilise fetchmail qui permet de dispatcher les
mails en fonction du champ to: .
Les logins n'ont même pas besoin d'être les mêmes chez hotmail et chez
moi, il suffit de donner la correspondance login hotmail -> login locaux
à fetchmail.
1) Si un message est envoyé à Denis *et* Gilles, seul Denis le
recevra. Il faudrait utiliser l'option 'c' mais cela impose
d'ajouter un champ pour noter que le message a déjà été reçu.
2) Si Denis ou Gilles sont en Cc:, ils ne verront rien. Il
faudrait utiliser la macro ^TO de procmail.
l'auteur de ce document utilise le champ "subject"
pour rediriger les mails.
Merci d'avance ;-)
Jean Charles Delepine delepine@lan.univ-lyon1.fr,
et enfin à tous ceux qui ecrivent sur
l'USENET pour 'faire avancer les choses' ... :-))
Bien amicalement,
:0
* ^To:.*Denis
! denis@batman.gotham.city
fait échouer toutes les redirections
car "denis" est contenu dans
"truc
d'ailleurs si quelqu'un de des meilleurs regles
qu'il n'hesite pas a le faire savoir ! :-)
5.6) le script /home/postman/return_the_mail
ce script sert a renvoyer les mails dont le champ
"To:" contient un nom qui n'est pas répertorié dans
/home/postman/.procmailrc
#!/bin/sh
# /home/postman/return_the_mail Denis BRAUSSEN 14 avril 1998
# note: $1==$SENDMAIL
#
POSTMAN="Post Office <denis.braussen@hol.fr>"
(formail -k -X From: -X Subject: -X To: | \
formail -R "To:" "To_ERREUR_SUR_CETTE_ADRESSE:" | \
formail -A "X-AUTHENTIFICATION: $POSTMAN" | \
formail -A "X-From: $POSTMAN" | \
formail -R "From:" "To:" | \
formail -I "Return-Path:" \
; cat info_file)| $1 -t
# enlève l'entête sauf les champs "From:" et "To:"
# renomme "To:" en "To_ERREUR_SUR_CETTE_ADRESSE:"
# rajoute un champ "X-AUTHENTIFICATION: $POSTMAN"
# rajoute un champ "X-From: $POSTMAN"
# renomme "From:" et "To:"
# rajoute un champ "return-Path:"
# rajoute en fin de mail le fichier /home/postman/info_file
# (ce fichier peut etre une notice explicative du fonctionnement
# du service jointe a la liste des user valides de batman.gotham.city)
#
# note: ce script est un 'premier jet' (mais il marche !),
# **** ne vous genez pas pour l'ameliorer (en n'oubliant
# pas de m'en envoyer une copie :-) )
#
# le champ "To_ERREUR_SUR_CETTE_ADRESSE:" pourra etre
# consulte par l'auteur pour qu'il puisse comprendre
# son erreur.
#
#
#------------------------------------------------------------
5.7) Divers
5.7.1) il se peut que la config de sendmail demande
un fichier /etc/sendmail.cw s'il est absent. en
créer un meme vide :
# ---> exemple de /etc/aliases
tous ces trucs vont chez root, mais sont finalement
redirigés par /root/.forward vers le véritable compte de
l'administateur (moi même ;) !)
# Put any sendmail aliases in here
MAILER-DAEMON: postmaster
postmaster: root
usenet: root
news: root
#
denis
5.7.3) fetchmail depuis /etc/ppp/ip-up
#extrait de /etc/ppp/ip-up________________________________________
#
sudo -u postman fetchmail -v -f /home/postman/.fetchmailrc
#
#-----------------------------------------------------------------
5.7.3) d'autres avis, d'autres possibilités (ref: fr.comp.mail) :
5.7.3.1) Alexis de Goriainoff degoria@mines.u-nancy.fr
Voici la solution que j'utilise
5.7.3.2) Stephane Bortzmeyer bortzmeyer@pasteur.fr
"cette méthode à base de procmail, /.../ je pense qu'elle est
beaucoup plus compliquée que de configurer UUCP."
de plus :
5.7.3.3) Denis BRAUSSEN denis.braussen@hol.fr (moi meme :-) )
en réponse à Stéphane Bortzmeyer :
"je sais bien que ce n'est pas fait pour un gros serveur.
mais je continue a penser que dans le cas d'une utilisation
restreinte par exemple:
ce genre de config est tout a fait acceptable."
5.7.3.4) autre lien sur une technique analogue :
http://www.linux-france.org/article/mail/repart-mail.html
6) Appel aux bonnes volontés :
si vous avez des remarques concernant ce document, des améliorations,
des corrections, des critiques, n'hésitez pas a m'en faire part !
7) REMERCIEMENTS (ca ne fait pas de ma(i)l ;-) )
merci à ceux qui m'ont aidé à tenter cette 'astuce'
dont, et non exhaustivement :
Nat Makarevitch nat@nataa.fr.eu.org
Pablo Saratxaga srtxg@chanae.alphanet.ch
Eric Jacoboni jaco@mail.dotcom.fr
Stephane Bortzmeyer bortzmeyer@pasteur.fr
Edgar Bonet Orozco bonet@labs.polycnrs-gre.fr
"Pascal A. Dupuis" dupuis@lei.ucl.ac.be
Sebastien TANGUY sebastien.tanguy@wanadoo.fr
Laurent Frigault lfrigault@teaser.fr
Vladimir NOVIKOV vnovikov@starnet.fr
Alexis de Goriainoff degoria@mines.u-nancy.fr
Sebastien Phelep phelep@svc.univ-ubs.fr pour le gloubiboulga,
l'Excellent Thierry Pinelli tpinelli@pinux.gyptis.frmug.org
pour son humour ;-) ,
P.Coulon cdc@bceom.fr qui m'a donné
l'occasion d'écrire ces qques lignes, :)
Denis.