{"id":829,"date":"2009-10-20T16:48:16","date_gmt":"2009-10-20T14:48:16","guid":{"rendered":"http:\/\/michauko.org\/blog\/?p=829"},"modified":"2015-11-21T10:06:52","modified_gmt":"2015-11-21T09:06:52","slug":"postfix-utilisateurs-virtuels-mysql-acces-pop3s-imaps-sasl-et-tls-quota-bingo-jai-tout-mis-dans-le-titre","status":"publish","type":"post","link":"https:\/\/michauko.org\/blog\/postfix-utilisateurs-virtuels-mysql-acces-pop3s-imaps-sasl-et-tls-quota-bingo-jai-tout-mis-dans-le-titre-829\/","title":{"rendered":"postfix : utilisateurs \u00ab\u00a0virtuels\u00a0\u00bb MySQL ; acc\u00e8s POP3[S], IMAP[S], SASL et TLS ; quota (bingo, j&rsquo;ai tout mis dans le titre)"},"content":{"rendered":"<h1>Introduction<\/h1>\n<p>Hop,<br \/>\nApr\u00e8s <a href=\"https:\/\/michauko.org\/docs\/debian_testing\/\">ma doc d&rsquo;initiation Debian<\/a>, o\u00f9 un rapide chapitre est consacr\u00e9 au montage d&rsquo;un serveur postfix, spamassassin, greylisting etc, dans une configuration simple,<br \/>\nApr\u00e8s <a href=\"https:\/\/michauko.org\/blog\/2009\/09\/21\/montage-dun-serveur-de-mail-complet-postfix-postgrey-amavisd-new-clamav-spamassassin-etc\/\">cet article sur le montage complet cette fois<\/a>, en incluant amavisd-new, anti-virus etc,<br \/>\n=> Voici le compl\u00e9ment id\u00e9al, par exemple en PME  (et m\u00eame plus gros) :<\/p>\n<ul>\n<li>\nGestion d&rsquo;utilisateurs virtuels, entendez par l\u00e0  \u00ab\u00a0utilisateurs d\u00e9finis en base de donn\u00e9es et non pas utilisateurs r\u00e9els de l&rsquo;OS\u00a0\u00bb.\n<\/li>\n<li>Mise en place de tout ce qu&rsquo;il faut pour lire les mails (POP3, POP3S, IMAP, IMAPS) via les outils \u00ab\u00a0courier-*\u00a0\u00bb\n<\/li>\n<li>Authentification via SASL\n<\/li>\n<li>Mise en place d&rsquo;authentification s\u00e9curis\u00e9e plus forte pour l&rsquo;envoi (TLS).\n<\/li>\n<\/ul>\n<p>Pour le webmail, j&rsquo;en ai parl\u00e9 d\u00e9j\u00e0  quelques fois sur mon blog et derni\u00e8rement, la version 0.3 de roundcubemail a fait de gros progr\u00e8s par rapport \u00e0  la 0.1. Ca s&rsquo;installe en 3 clics. Si j&rsquo;ai le temps je ferai un article, mais c&rsquo;est mal barr\u00e9.<!--more--><\/p>\n<h2>Situation de d\u00e9part<\/h2>\n<p>Avoir un serveur postfix correctement mont\u00e9, avec (ou pas) amavis, spamassassin, un anti-virus, du greylisting, un nom correct etc. Bref, un serveur qui fonctionne et qui accepte les mails correspondant \u00e0  des Maildir d&rsquo;utilisateur de l&rsquo;OS. En gros, ce qui est <a href=\"https:\/\/michauko.org\/blog\/2009\/09\/21\/montage-dun-serveur-de-mail-complet-postfix-postgrey-amavisd-new-clamav-spamassassin-etc\/\">expliqu\u00e9 l\u00e0 <\/a>.<br \/>\nJe ne parlerai pas d&rsquo;ouverture de ports r\u00e9seaux etc, mais \u00e7a tombe sous le sens. Ni du fait qu&rsquo;il vous faudra une base MySQL en \u00e9tat de marche.<\/p>\n<p>Je n&rsquo;ai pas trouv\u00e9 de doc officielle sur le sujet. En gros, on a <code>postfix-mysql<\/code> qui permet de faire le lien entre le serveur de mails et la base, mais rien dans un gros fichier README qu&rsquo;on a habituellement avec ce genre de paquet. Ou alors je l&rsquo;ai loup\u00e9.<br \/>\nLe \u00ab\u00a0<em>postfix mysql howto<\/em>\u00a0\u00bb est juste r\u00e9sum\u00e9 \u00e0  \u00e7a : <a href=\"http:\/\/www.postfix.org\/MYSQL_README.html\">http:\/\/www.postfix.org\/MYSQL_README.html<\/a> et \u00e7a : <a href=\"http:\/\/www.postfix.org\/mysql_table.5.html\">http:\/\/www.postfix.org\/mysql_table.5.html<\/a>. Et pour le coup, ce n&rsquo;est pas tr\u00e8s sexy.<\/p>\n<p>J&rsquo;ai donc compil\u00e9 tout un tas de diff\u00e9rents articles le sujet, parfois incomplet, parfois des articles d\u00e9crivant des m\u00e9thodes \u00e0 grand coup de compilation-c-est-p\u00e9nible-et-stupide-pour-suivre-les-mises-\u00e0 -jour etc. Parfois sans gestion de quota, parfois avec. Et en g\u00e9n\u00e9ral, en expliquant rien du tout. Donc dans mon cas, je t\u00e2che d&rsquo;expliquer ce qu&rsquo;on fait.<\/p>\n<p>Alors, comme \u00e0  mon habitude, je laisserai trainer 2\/3 bugs que j&rsquo;ai pu rencontrer (de ma faute), \u00e7a peut permettre d&rsquo;aider si vous faites les m\u00eames erreurs. Et on y apprend l&rsquo;existence de quelques outils pour tester en ligne de commande.<\/p>\n<p><strong>Remarque pour la partie quota qui ne fonctionne pas nativement dans postfix<\/strong>, je la passe sous silence volontairement au d\u00e9but et y consacre un chapitre \u00e0  la fin. En effet, c&rsquo;est relativement dissoci\u00e9 de tout le reste et \u00e7a implique de recompiler postfix (ou d&rsquo;utiliser un .deb fourni par je ne sais qui, mais vous \u00eates d\u00e9pendant de lui pour les mises \u00e0  jour). Comme certains se moqueront des quotas, je le traite \u00e0  la fin. Beaucoup de guides de mise en place m\u00e9langent tout et pr\u00e9voient des fonctions qu&rsquo;ils n&rsquo;exploitent pas. J&rsquo;essaye pour ma part de faire des briques dissociables.<\/p>\n<p>J&rsquo;ai aussi tout install\u00e9 sur un unique serveur. Ce n&rsquo;est pas une n\u00e9cessit\u00e9, sur une grosse installation par exemple.<\/p>\n<h2>Autres documentations<\/h2>\n<p>A ce propos, j&rsquo;ai lu \u00e0  peu pr\u00e8s tout ce qui suit (et plein d&rsquo;autres) pour monter le serveur, notamment les 2 premiers lien. J&rsquo;ai m\u00eame en gros simplement repomp\u00e9, traduit et expliqu\u00e9 :<\/p>\n<ul>\n<li>\nhttp:\/\/library.linode.com\/email-guides\/postfix\/postfix-courier-mysql-debian-5-lenny\n<\/li>\n<li>\n<a href=\"http:\/\/www.howtoforge.com\/virtual-users-domains-postfix-courier-mysql-squirrelmail-debian-lenny\" target=\"_blank\">http:\/\/www.howtoforge.com\/virtual-users-domains-postfix-courier-mysql-squirrelmail-debian-lenny<\/a>\n<\/li>\n<li>\nQuelques survols de docs ici : <a href=\"http:\/\/www.postfix.org\/docs.html\" target=\"_blank\">http:\/\/www.postfix.org\/docs.html<\/a>\n<\/li>\n<\/li>\n<li>Un psycho de la recompilation : <a href=\"http:\/\/www.phparchitecture.com\/howto_show.php?id=2\">http:\/\/www.phparchitecture.com\/howto_show.php?id=2<\/a>, mais y&rsquo;a 2\/3 trucs \u00e0  prendre\n<\/ul>\n<h2>Grandes \u00e9tapes de la proc\u00e9dure<\/h2>\n<p>En gros, on va :<\/p>\n<ul>\n<li>\n1) Installer les applicatifs,\n<\/li>\n<li>\nCr\u00e9er la structure en base,\n<\/li>\n<li>\nD\u00e9crire cette structure \u00e0  postfix pour qu&rsquo;il sache l&rsquo;interroger\n<\/li>\n<li>\n2) Cr\u00e9er ce qu&rsquo;il faut pour stocker les boites virtuelles\n<\/li>\n<li>\nFaire quelques tests de livraison de mails pour valider la partie \u00ab\u00a0utilisateurs d\u00e9finis en base\u00a0\u00bb\n<\/li>\n<li>\n3) Param\u00e9trer les outils pour r\u00e9cup\u00e9rer les mails (courier-POP, IMAP et versions s\u00e9curis\u00e9es par SSL)\n<\/li>\n<li>\nTester ces protocoles pour la r\u00e9cup\u00e9ration des mails\n<\/li>\n<li>\nVoir l&rsquo;analyse de quelques erreurs sur la partie \u00ab\u00a0courier\u00a0\u00bb\n<\/li>\n<li>\n4) Param\u00e9trer les m\u00e9canismes d&rsquo;authentification pour l&rsquo;envoi (SASL, TLS)\n<\/li>\n<li>\nTester l&rsquo;envoi, en TLS ou pas\n<\/li>\n<li>\nVoir l&rsquo;analyse de quelques erreurs sur la partie authentification pour l&rsquo;envoi\n<\/li>\n<li>\n5) Optionnel : activer les quotas\n<\/li>\n<li>\nEt enfin, voir ce que je n&rsquo;ai pas trait\u00e9\n<\/li>\n<\/ul>\n<h1>Installation des paquets<\/h1>\n<p>Pour une fois, tout ne descend pas par d\u00e9pendance, car les diff\u00e9rents modules d&rsquo;authentification (identification via une base MySQL) ne sont pas obligatoires, donc pas de d\u00e9pendance. Donc pour une fois il faut absolument tout copier-coller. Pour illustrer, installer <code>courier-authlib<\/code> n&rsquo;am\u00e8ne pas forc\u00e9ment <code>courier-authlib-mysql<\/code>.<\/p>\n<p>On a donc :<\/p>\n<pre>\r\naptitude install postfix-mysql courier-pop courier-pop-ssl courier-imap courier-imap-ssl postfix-tls  libsasl2-2 libsasl2-modules libsasl2-modules-sql sasl2-bin libpam-mysql openssl courier-authdaemon courier-authlib-mysql<\/pre>\n<p>Vous pouvez \u00e0  la limite zapper certains, comme le POP, si vous ne comptez pas l&rsquo;utiliser. Notez que les webmails tapent en IMAP, si vous ne le saviez pas.<\/p>\n<h1>Connexion postfix <-> MySQL<\/h1>\n<h2>Cr\u00e9ation de la base de donn\u00e9es<\/h2>\n<p>J&rsquo;ai vu des d\u00e9finitions de base hyper compl\u00e8te, pour d\u00e9sactiver le POP (ou je ne sais quoi d&rsquo;autre) par utilisateur. Sachez qu&rsquo;il sera toujours temps d&rsquo;ajouter une colonne \u00e0  une table, de mettre des valeurs par d\u00e9faut et d&rsquo;ajouter une r\u00e8gle dans postfix pour prendre en compte une nouvelle fonctionnalit\u00e9 (c&rsquo;est d&rsquo;ailleurs ce qu&rsquo;on fera pour les quotas de bo\u00eetes mails). Donc faisons simple au d\u00e9but.<\/p>\n<p>On cr\u00e9e une base et un utilisateur d\u00e9di\u00e9, avec des droits pas trop larges. Une fois connect\u00e9 en root dans votre base (exemple : <code>mysql -u root -p<\/code>), on cr\u00e9e la base et donne des droits \u00e0 cet utilisateur qu&rsquo;on cr\u00e9e au passage :<\/p>\n<pre>mysql> create database postfix;\r\nQuery OK, 1 row affected (0.00 sec)\r\n\r\nmysql> grant select,insert,update,delete on postfix.* TO 'mail_adm'@'localhost' identified by 'monpassadmin';\r\nQuery OK, 0 rows affected (0.00 sec)\r\n\r\nmysql> flush privileges;\r\nQuery OK, 0 rows affected (0.00 sec)<\/pre>\n<blockquote><p>ATTENTION : dans toute la suite, le nom de la base, le nom des tables, les identifiants etc sont \u00e0  modifier pour refl\u00e9ter votre installation. Attention \u00e0  ne pas copier-coller trop vite.<\/p><\/blockquote>\n<p>Ensuite, dans la base \u00ab\u00a0postfix\u00a0\u00bb, on cr\u00e9e quelques tables :<\/p>\n<pre>use postfix;\r\n\r\nCREATE TABLE domains (\r\n        domain varchar(50) NOT NULL,\r\n        PRIMARY KEY (domain)\r\n);\r\nCREATE TABLE forwardings (\r\n        source varchar(80) NOT NULL,\r\n        destination TEXT NOT NULL,\r\n        PRIMARY KEY (source)\r\n);\r\nCREATE TABLE users (\r\n        email varchar(80) NOT NULL,\r\n        password varchar(20) NOT NULL,\r\n        PRIMARY KEY (email)\r\n);\r\nCREATE TABLE transport (\r\n        domain varchar(128) NOT NULL default '',\r\n        transport varchar(128) NOT NULL default '',\r\n        UNIQUE KEY domain (domain)\r\n);<\/pre>\n<p>Ces 4 tables permettront, dans l&rsquo;ordre, de :<\/p>\n<ul>\n<li>\nd\u00e9finir la liste des domaines qu&rsquo;on g\u00e8re\n<\/li>\n<li>\ncr\u00e9er des alias (renvoyer toto@domaine.fr vers tata@blabla.com + titi@blibli.com)\n<\/li>\n<li>\nd\u00e9finir nos comptes et leurs propri\u00e9t\u00e9s\n<\/li>\n<li>\nd\u00e9finir une table de transport, au besoin\n<\/ul>\n<h2>Cr\u00e9ation des requ\u00eates pour savoir comment interroger ces tables<\/h2>\n<p>Le principe est le suivant : on a cr\u00e9\u00e9 des tables avec des noms de colonnes et de tables libres (on aurait pu tout changer), on doit donc indiquer \u00e0  postfix comment v\u00e9rifier un mot de passe, voir s&rsquo;il y a un forward etc. Pour chaque action, on a une directive dans <code>\/etc\/postfix\/main.cf<\/code> et un fichier de conf d\u00e9crivant la base et la requ\u00eate.<br \/>\nLe truc \u00e9norme, c&rsquo;est qu&rsquo;on pourrait ajouter n&rsquo;importe quelle colonne (attribut) pour ajouter un test. Exemple stupide : le password est OK entre 8h et 20h, sinon impossible de relever ses mails.<br \/>\nOn ajouterait une colonne et une clause suppl\u00e9mentaire dans le WHERE, tenant compte de l&rsquo;heure et d&rsquo;horaires autoris\u00e9s pour tel utilisateur.<\/p>\n<p>Voici les 4 fichiers de conf pour les 4 tables pr\u00e9c\u00e9dement cr\u00e9\u00e9es :<br \/>\nFichier <code>\/etc\/postfix\/mysql-virtual_domains.cf<\/code> :<\/p>\n<pre>user = mail_adm\r\npassword = monpassadmin\r\ndbname = postfix\r\nquery = SELECT domain AS virtual FROM domains WHERE domain=&apos;%s&apos;\r\nhosts = 127.0.0.1<\/pre>\n<p>Fichier <code>\/etc\/postfix\/mysql-virtual_forwardings.cf<\/code> :<\/p>\n<pre>user = mail_adm\r\npassword = monpassadmin\r\ndbname = postfix\r\nquery = SELECT destination FROM forwardings WHERE source=&apos;%s&apos;\r\nhosts = 127.0.0.1<\/pre>\n<p>Fichier <code>\/etc\/postfix\/mysql-virtual_mailboxes.cf<\/code> :<\/p>\n<pre>user = mail_adm\r\npassword = monpassadmin\r\ndbname = postfix\r\nquery = SELECT CONCAT(SUBSTRING_INDEX(email,&apos;@&apos;,-1),&apos;\/&apos;,SUBSTRING_INDEX(email,&apos;@&apos;,1),&apos;\/&apos;)\r\n        FROM users WHERE email=&apos;%s&apos;\r\nhosts = 127.0.0.1<\/pre>\n<p>Fichier <code>\/etc\/postfix\/mysql-virtual_transports.cf<\/code> :<\/p>\n<pre>user = mail_adm\r\npassword = monpassadmin\r\ndbname = postfix\r\nquery = SELECT transport FROM transport WHERE domain=&apos;%s&apos;\r\nhosts = 127.0.0.1<\/pre>\n<p>Ensuite on s\u00e9curise ces fichiers qui contiennent des infos sensibles sur la base d&rsquo;authentification de mails :<\/p>\n<pre>chown root:postfix \/etc\/postfix\/mysql*cf\r\nchmod 640 \/etc\/postfix\/mysql*cf<\/pre>\n<h2>Cr\u00e9ation de la structure de stockage des bo\u00eetes<\/h2>\n<p>Le principe est le suivant : on indique un r\u00e9pertoire racine, avec un utilisateur d\u00e9di\u00e9 sous lequel tout est stock\u00e9.<br \/>\nOn aura une belle arborescence de ce type :<\/p>\n<pre>\/ma\/racine\/des\/maildirs\/\r\n        - \/mon.domaine.fr\/\r\n                - user1\r\n                        - cur\r\n                        - new\r\n                        - tmp\r\n                        + .autre.sous.rep.de.maildir.genre.Sent\r\n                + user2\r\n        - \/autre.domaine.a.moi.fr\/\r\n                + userX<\/pre>\n<p>Donc, disons que que le r\u00e9pertoire racine de stockage des bo\u00eetes mails sera <code>\/vmailboxes<\/code>. On cr\u00e9e l&rsquo;utilisateur avec un ID arbitraire :<\/p>\n<pre>groupadd -g 5000 vmail\r\nuseradd -g vmail -u 5000 vmail -d \/vmailboxes -m<\/pre>\n<p>Attention, vous allez aussi recopier le contenu de \/etc\/skel dans \/vmailboxes, le home de \u00ab\u00a0vmail\u00a0\u00bb. Ce n&rsquo;est pas forc\u00e9ment utile. Adaptez au besoin.<\/p>\n<h2>On indique tout \u00e7a \u00e0  postfix<\/h2>\n<p>Dans un premier temps, je n&rsquo;ajoute pas toute la conf dans <code>\/etc\/postfix\/main.cf<\/code>. On va y aller progressivement vu ce qu&rsquo;on vient d&rsquo;installer. On ajoute donc :<\/p>\n<pre>virtual_alias_domains =\r\nvirtual_alias_maps = hash:\/etc\/postfix\/virtual,proxy:mysql:\/etc\/postfix\/mysql-virtual_forwardings.cf\r\nvirtual_mailbox_domains = proxy:mysql:\/etc\/postfix\/mysql-virtual_domains.cf\r\nvirtual_mailbox_maps = proxy:mysql:\/etc\/postfix\/mysql-virtual_mailboxes.cf\r\nvirtual_mailbox_base = \/vmailboxes\r\nvirtual_uid_maps = static:5000\r\nvirtual_gid_maps = static:5000\r\nvirtual_create_maildirsize = yes\r\nvirtual_maildir_extended = yes\r\ntransport_maps = proxy:mysql:\/etc\/postfix\/mysql-virtual_transports.cf\r\nproxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps \\\r\n             $virtual_alias_domains $virtual_mailbox_maps $virtual_mailbox_domains \\\r\n             $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps \\\r\n             $recipient_canonical_maps $relocated_maps $transport_maps $mynetworks\r\n<\/pre>\n<p>Les fichiers de conf MySQL en \u00ab\u00a0mode proxy\u00a0\u00bb (si on peut dire) permettent d&rsquo;optimiser les acc\u00e8s en conservant en m\u00e9moire le contenu. Pratique pour \u00e9viter une tonne d&rsquo;acc\u00e8s disque inutile.<\/p>\n<p><em>N&rsquo;oubliez pas de g\u00e9n\u00e9rer le fichier virtual.db, la \u00ab\u00a0version base de donn\u00e9es\u00a0\u00bb associ\u00e9e au fichier \u00ab\u00a0virtual\u00a0\u00bb. Il vous sert \u00e0 faire suivre par exemple certains comptes locaux vers d&rsquo;autres adresses e-mails. Pour centraliser vos remont\u00e9es de serveur autre part.<\/em><\/p>\n<p>Rechargez postfix, \u00e7a devrait bien se passer. Allez voir dans <code>\/var\/log\/mail.info<\/code> ou <code>syslog<\/code> sinon.<br \/>\nOn va pouvoir tester.<\/p>\n<h2>Quelques tests de livraison de mails<\/h2>\n<p>Pour cr\u00e9er une bo\u00eete, il faudra au minimum :<\/p>\n<ul>\n<li>\nAvoir d\u00e9clar\u00e9 le domaine qu&rsquo;on g\u00e8re\n<\/li>\n<li>\nAvoir d\u00e9clar\u00e9 le compte\n<\/li>\n<li>\nAvoir envoy\u00e9 un mail de bienvenue, localement, pour forcer la cr\u00e9ation de bo\u00eete (arborescence\n<\/li>\n<li>\nEventuellement avoir ajout\u00e9 des sous-r\u00e9pertoires pour que le webmail (si vous en mettez un) soit content : Sent, Trash, Drafts, Junk.<br \/>\n<\/il><\/ul>\n<h3>Ajout d&rsquo;un domaine<\/h3>\n<p>Tout comme en postfix \u00ab\u00a0normal\u00a0\u00bb, on indique dans \u00ab\u00a0mydestination\u00a0\u00bb la liste des noms de domaines g\u00e9r\u00e9s, il faut ici les indiquer dans la base. Et les supprimer de \u00ab\u00a0mydestination\u00a0\u00bb si vous les g\u00e9riez localement jusqu&rsquo;alors. On cr\u00e9e simplement un enregistrement en base :<\/p>\n<pre>INSERT INTO domains (domain) VALUES (&apos;mxtest.mondomaine.fr&apos;);<\/pre>\n<p>(Je suppose que <code>mxtest.mondomaine.fr<\/code> existe et que l&rsquo;enregistrement MX existe aussi et pointe vers notre serveur.<\/p>\n<h3>Cr\u00e9ation d&rsquo;un utilisateur<\/h3>\n<p>Simplissime, dans la base aussi :<\/p>\n<pre>INSERT INTO users (email, password) VALUES (&apos;jacques@mxtest.mondomaine.fr&apos;, ENCRYPT(&apos;mon_pass_en_clair&apos;));<\/pre>\n<h3>Initialisation de sa bo\u00eete mail<\/h3>\n<p>Connect\u00e9 localement, par exemple, sur la machine, envoyez un mail en ligne de commande, avec mailx, mutt. Ce que vous voulez.<br \/>\nL\u00e0 , \u00f4 magie, vous devriez voir l&rsquo;arborescence \/vmailboxes se peupler, par exemple avec \/vmailboxes\/mxtest.mondomaine.fr\/jacques\/<br \/>\nC&rsquo;est une arborescence \u00ab\u00a0Maildir\u00a0\u00bb classique, avec <code>cur<\/code>, <code>new<\/code>, <code>tmp<\/code>.<br \/>\nSi le mail est arriv\u00e9, on peut pour l&rsquo;instant le lire en ligne de commande en allant dans le r\u00e9pertoire, tout b\u00eatement.<\/p>\n<h3>Cr\u00e9ation des autres sous-r\u00e9pertoires<\/h3>\n<p>Dans cette proc\u00e9dure de cr\u00e9ation d&rsquo;un compte, je sugg\u00e8re d&rsquo;ajouter, pour le webmail, la cr\u00e9ation des r\u00e9pertoires habituels d&rsquo;un compte en IMAP. Si vous ne comptez livrer que des bo\u00eetes r\u00e9cup\u00e9rables en POP, ne vous cassez pas la t\u00eate, c&rsquo;est inutile.<br \/>\nSinon :<\/p>\n<pre>su - vmail\r\ncd \/vmailboxes\/mxtest.mondomaine.fr\/jacques\r\nfor i in Sent Trash Drafts Junk\r\ndo\r\n        maildirmake .$i #le . est important\r\ndone<\/pre>\n<p>Vous devriez voir les sous-r\u00e9pertoires .Sent, .Junk etc avec \u00e0  chaque fois le cur\/tmp\/new et des permissions restreintes \u00e0  l&rsquo;utilisateur vmail.<\/p>\n<p>Voil\u00e0 , la bo\u00eete sait recevoir et postfix sait g\u00e9rer nos comptes virtuels, pour livrer le courier dans les bo\u00eetes virtuelles.<\/p>\n<h3>Abonnement aux r\u00e9pertoires IMAP ; pour le webmail ou la consultation IMAP<\/h3>\n<p>Si besoin, pensez \u00e0 inclure la cr\u00e9ation du fichier suivant dans votre proc\u00e9dure de cr\u00e9ation de bo\u00eete mail :<\/p>\n<pre>mxtest:\/vmailboxes\/mxtest.mondomaine.fr\/jacques# cat courierimapsubscribed\r\nINBOX\r\nINBOX.Sent\r\nINBOX.Drafts\r\nINBOX.Trash\r\nINBOX.Junk<\/pre>\n<h3>Annexe : cr\u00e9ation d&rsquo;un alias<\/h3>\n<p>Dans la table forwardings, \u00e0 base de :<\/p>\n<pre>INSERT INTO forwardings VALUES (&apos;mon_alias@bla.fr&apos;, &apos;dest1@toto.fr&apos;, &apos;dest2@tata.fr&apos;);<\/pre>\n<p>Actif imm\u00e9diatement. Pas plus compliqu\u00e9 que \u00e7a :).<\/p>\n<h1>Partie lecture des mails, via \u00ab\u00a0courier-*\u00a0\u00bb utilisant MySQL pour l&rsquo;authentification<\/h1>\n<p>Ici, on voit cr\u00e9er les services POP, IMAP et leurs versions s\u00e9curis\u00e9es. Le tout sur fond d&rsquo;authentification des utilisateurs d\u00e9finis en base MySQL.<\/p>\n<h2>Indiquer au \u00ab\u00a0daemon\u00a0\u00bb courier d&rsquo;utiliser MySQL<\/h2>\n<p>Simplement, dans <code>\/etc\/courier\/authdaemonrc<\/code>, changer la liste des modules utilis\u00e9s pour l&rsquo;authentification :<\/p>\n<pre>#authmodulelist=\"authpam\"\r\nauthmodulelist=\"authmysql\"<\/pre>\n<p>Dans <code>\/etc\/courier\/authmysqlrc<\/code>, il faut positionner les variables suivantes :<br \/>\nMYSQL_SERVER localhost<br \/>\nMYSQL_USERNAME mail_adm<br \/>\nMYSQL_PASSWORD monpassadmin<br \/>\nMYSQL_PORT 0<br \/>\nMYSQL_DATABASE postfix<br \/>\nMYSQL_USER_TABLE users<br \/>\nMYSQL_CRYPT_PWFIELD password<br \/>\nMYSQL_UID_FIELD 5000<br \/>\nMYSQL_GID_FIELD 5000<br \/>\nMYSQL_LOGIN_FIELD email<br \/>\nMYSQL_HOME_FIELD \u00ab\u00a0\/vmailboxes\u00a0\u00bb<br \/>\nMYSQL_MAILDIR_FIELD CONCAT(SUBSTRING_INDEX(email,&apos;@&apos;,-1),&rsquo;\/&rsquo;,SUBSTRING_INDEX(email,&apos;@&apos;,1),&rsquo;\/&rsquo;)<br \/>\n#MYSQL_NAME_FIELD       name # NE PAS LAISSER CETTE VARIABLE, voir plus bas, cas d&rsquo;erreur pour moi<\/p>\n<p>Ici, bien \u00e9videmment, les valeurs indiqu\u00e9es refl\u00e8tent les noms choisis en base.<\/p>\n<h2>G\u00e9n\u00e9rer les certificats pour le POP3S et IMAPS<\/h2>\n<p>Cette partie est optionnelle, si vous ne voulez pas du POP3S et IMAPS. Dans ce cas vous pouvez aussi d\u00e9sinstaller <code>courier-*-ssl<\/code>.<\/p>\n<p>On modifie les fichiers de conf de g\u00e9n\u00e9ration des certificats des daemon POP et IMAP s\u00e9curis\u00e9s :<\/p>\n<pre>mxtest:\/etc\/courier# cat pop3d.cnf\r\n\r\nRANDFILE = \/usr\/lib\/courier\/pop3d.rand\r\n\r\n[ req ]\r\ndefault_bits = 1024\r\nencrypt_key = yes\r\ndistinguished_name = req_dn\r\nx509_extensions = cert_type\r\nprompt = no\r\n\r\n[ req_dn ]\r\nC=FR\r\nST=France\r\nL=PARIS\r\nO=Courier Mail Server\r\nOU=Automatically-generated POP3 SSL key\r\nCN=mondomaine.fr\r\nemailAddress=certif@mondomaine.fr\r\n\r\n\r\n[ cert_type ]\r\nnsCertType = server<\/pre>\n<p>Et pour, l&rsquo;IMAP :<\/p>\n<pre>\r\n\r\nmxtest:\/etc\/courier# cat imapd.cnf\r\n\r\nRANDFILE = \/usr\/lib\/courier\/imapd.rand\r\n\r\n[ req ]\r\ndefault_bits = 1024\r\nencrypt_key = yes\r\ndistinguished_name = req_dn\r\nx509_extensions = cert_type\r\nprompt = no\r\n\r\n[ req_dn ]\r\nC=FR\r\nST=France\r\nL=PARIS\r\nO=Courier Mail Server\r\nOU=Automatically-generated IMAP SSL key\r\nCN=mondomaine.fr\r\nemailAddress=certif@mondomaine.fr\r\n\r\n\r\n[ cert_type ]\r\nnsCertType = server<\/pre>\n<p>Et on g\u00e9n\u00e8re les certificats \u00e0 partir de ces mod\u00e8les. Ca ne fait que conna\u00eetre \u00e0 l&rsquo;avance certains param\u00e8tres :<\/p>\n<pre>mxtest:\/etc\/courier# mkimapdcert\r\ncp: not writing through dangling symlink `\/usr\/lib\/courier\/imapd.pem'\r\nchmod: cannot operate on dangling symlink `\/usr\/lib\/courier\/imapd.pem'\r\nchown: ne peut effectuer une d\u00e9f\u00e9rence sur `\/usr\/lib\/courier\/imapd.pem': Aucun fichier ou r\u00e9pertoire de ce type\r\nGenerating a 1024 bit RSA private key\r\n................++++++\r\n....++++++\r\nwriting new private key to '\/usr\/lib\/courier\/imapd.pem'\r\n-----\r\n1024 semi-random bytes loaded\r\nGenerating DH parameters, 512 bit long safe prime, generator 2\r\nThis is going to take a long time\r\n..............+.....................................................................................+..+.....................\r\n.........+.............................+....+...+........+...................................................................\r\n.............+..........+...........+..+...+..............................+....................+......................+......\r\n........................+.....+.+......+..........................................................+..........................\r\n.........................................................+...........+.........+.......................+.....................\r\n..+..........++*++*++*++*++*++*\r\nsubject= \/C=FR\/ST=France\/L=PARIS\/O=Courier Mail Server\/OU=Automatically-generated IMAP SSL \r\n\r\nkey\/CN=mondomaine.fr\/emailAddress=certif@mondomaine.fr\r\nnotBefore=Oct  7 15:17:54 2009 GMT\r\nnotAfter=Oct  7 15:17:54 2010 GMT\r\nSHA1 Fingerprint=9D:62:E6:CF:B7:39:80:C8:4E:F9:09:9C:61:36:14:8F:0B:EF:3C:6E\r\n<\/pre>\n<p>Et :<\/p>\n<pre>\r\nmxtest:\/etc\/courier# mkpop3dcert\r\ncp: not writing through dangling symlink `\/usr\/lib\/courier\/pop3d.pem'\r\nchmod: cannot operate on dangling symlink `\/usr\/lib\/courier\/pop3d.pem'\r\nchown: ne peut effectuer une d\u00e9f\u00e9rence sur `\/usr\/lib\/courier\/pop3d.pem': Aucun fichier ou r\u00e9pertoire de ce type\r\nGenerating a 1024 bit RSA private key\r\n..++++++\r\n..................++++++\r\nwriting new private key to '\/usr\/lib\/courier\/pop3d.pem'\r\n-----\r\n1024 semi-random bytes loaded\r\nGenerating DH parameters, 512 bit long safe prime, generator 2\r\nThis is going to take a long time\r\n...............+..........................++*++*++*++*++*++*\r\nsubject= \/C=FR\/ST=France\/L=PARIS\/O=Courier Mail Server\/OU=Automatically-generated POP3 SSL \r\n\r\nkey\/CN=mondomaine.fr\/emailAddress=certif@mondomaine.fr\r\nnotBefore=Oct  7 15:18:10 2009 GMT\r\nnotAfter=Oct  7 15:18:10 2010 GMT\r\nSHA1 Fingerprint=DD:8D:7C:0D:87:9D:19:9D:62:BE:5B:9A:B2:D8:43:80:CF:47:E2:14<\/pre>\n<h2>Red\u00e9marrer tout ce bazar<\/h2>\n<p>Ay\u00e9, tout est pr\u00eat, les certificats sont g\u00e9n\u00e9r\u00e9s, on red\u00e9marre tout ce monde :<\/p>\n<pre>\/etc\/init.d\/courier-authdaemon restart\r\n\/etc\/init.d\/courier-imap restart\r\n\/etc\/init.d\/courier-imap-ssl restart\r\n\/etc\/init.d\/courier-pop restart\r\n\/etc\/init.d\/courier-pop-ssl restart<\/pre>\n<h2>Tests pour l&rsquo;envoi, quelques erreurs analys\u00e9es<\/h2>\n<p>D\u00e9j\u00e0 , faites un telnet sur chaque port, 143, 993, 110, 995 pour voir si \u00e7a r\u00e9pond bien.<br \/>\nEnsuite, testez chaque protocole. Par exemple avec Thunderbird. Sur un poste Windows, pensez \u00e0  la version \u00ab\u00a0portable\u00a0\u00bb qui n&rsquo;interf\u00e8rera pas avec votre actuel Thunderbird. Sous Linux, vous pouvez jouer avec vos ~\/.mozilla-thunderbird (j&rsquo;ai plus le nom pr\u00e9cis en t\u00eate) pour ne pas ab\u00eemer votre conf actuelle.<\/p>\n<h2>Erreurs rencontr\u00e9es<\/h2>\n<p>Ces erreurs m&rsquo;ont permis de d\u00e9couvrir la commande authtest pour faire des tests d&rsquo;aut<\/p>\n<h3>Oubli de package<\/h3>\n<p>J&rsquo;ai commenc\u00e9 par tester l&rsquo;authentification IMAP en local (depuis un webmail, roundcube, install\u00e9 sur la m\u00eame machine). Ca ne passait pas. J&rsquo;ai test\u00e9 depuis Thunderbird, pareil (pas \u00e9tonnant), mais cette fois \u00e7a a g\u00e9n\u00e9r\u00e9 un message dans les logs, genre <code>syslog<\/code> ou <code>mail.info<\/code> je ne sais plus :<\/p>\n<pre>Oct  8 16:10:32 ns305192 authdaemond: libauthmysql.so: cannot open shared object file: No such file or directory<\/pre>\n<p>Oops, il manquait le package <code>courier-authlib-mysql<\/code>.<br \/>\nHeureusement, ce ne sera pas votre cas, c&rsquo;est bien \u00e9crit dans le <code>aptitude install<\/code> du d\u00e9but.<\/p>\n<h3>Erreur sur MYSQL_NAME_FIELD<\/h3>\n<p>Ensuite, j&rsquo;ai eu le droit \u00e0 une vraie erreur :<\/p>\n<pre>Oct  8 16:53:56 serveur imapd: authentication error: Input\/output error<\/pre>\n<p>C&rsquo;est l&rsquo;occasion de mentionner la commande <code>authtest<\/code> (faites <code>man authtest<\/code>. Ca peut aider :<\/p>\n<pre>authtest ducon@lajoie.fr monpasswd\r\nAuthentication FAILED: Input\/output error<\/pre>\n<p>Activez le debug dans <code>\/etc\/courier\/authdaemonrc<\/code> avec DEBUG_LOGIN=1, red\u00e9marrez le service et allez voir les logs. Ca m&rsquo;a permis de voir les erreurs SQL :<\/p>\n<pre>Oct  8 18:39:21 ns305192 authdaemond: mysql_query failed, reconnecting: Unknown column 'name' in 'field list'<\/pre>\n<p>En cherchant un peu, j&rsquo;ai vu qu&rsquo;il restait le champ MYSQL_NAME_FIELD dans <code>\/etc\/courier\/authdaemonrc<\/code>. Une fois modifi\u00e9, \u00e7a passe :<\/p>\n<pre>mxtest:\/etc\/courier# !auth\r\nauthtest bla@bla.fr monpassword\r\nAuthentication succeeded.\r\n\r\n     Authenticated: bla@bla.fr (uid 5000, gid 5000)\r\n    Home Directory: \/vmailboxes\r\n           Maildir: mondomaine.fr\/jacques\/\r\n             Quota: (none)\r\nEncrypted Password: OXXXXgfT0lXjI\r\nCleartext Password: monpassword\r\n           Options: (none)<\/pre>\n<p>A ce moment l\u00e0, tout marche pour la r\u00e9cup\u00e9ration, webmail aussi (puisque IMAP aussi).<\/p>\n<h1>Partie authentification des utilisateurs, pour l&rsquo;envoi<\/h1>\n<p>Pour bien comprendre, on va activer 2 modes : SASL et TLS &#8211; encore que le mode TLS reste optionnel. Vous pourriez dans ce cas d\u00e9sinstaller les paquets concern\u00e9s.<br \/>\nLe premier (SASL) pour avoir un m\u00e9canisme d&rsquo;authentification pour le SMTP \u00ab\u00a0normal\u00a0\u00bb, port 25.<br \/>\nLe deuxi\u00e8me (TLS) pour avoir un m\u00e9canisme plus s\u00e9curis\u00e9, avec certificat etc, en TLS (anciennement SMTPS, ou SMTP avec SSL). C&rsquo;est aussi sur le port 25 (pas 465), et, de ce que j&rsquo;en ai compris, \u00e7a tend \u00e0  remplacer le SMTPS, sur port 465. <a href=\"http:\/\/postfix.traduc.org\/index.php\/TLS_README.html\">C&rsquo;est expliqu\u00e9 l\u00e0 <\/a> et j&rsquo;ai peut-\u00eatre un peu abr\u00e9g\u00e9 l&rsquo;explication violemment.<\/p>\n<h2>Param\u00e9trage de toute la cha\u00eene postfix\/sasl\/pam\/mysql<\/h2>\n<p>Pour ne pas se perdre, il faut comprendre que postfix va d\u00e9l\u00e9guer l&rsquo;authentification \u00e0  une couche d&rsquo;abstraction, SASL. On va dire \u00e0  SASL de se baser sur le m\u00e9canisme PAM (Pluggable Authentication Module) et on va dire \u00e0  PAM de contr\u00f4ler les logins\/passwords dans une base MySQL, en lui d\u00e9crivant cette base. Pig\u00e9 ?<\/p>\n<h3>Dire \u00e0  SASL d&rsquo;utiliser PAM pour l&rsquo;authentification<\/h3>\n<p>SASL est chroot\u00e9 (je ne me souviens plus bien, mais c&rsquo;est le boxon, j&rsquo;ai d\u00fb en parler dans des <a href=\"https:\/\/michauko.org\/blog\/?s=sasl\">posts pr\u00e9c\u00e9dents<\/a>)<br \/>\nOn cr\u00e9e son environnement de \u00ab\u00a0chroot\u00a0\u00bb :<\/p>\n<pre>mkdir --parents \/var\/spool\/postfix\/var\/run\/saslauthd<\/pre>\n<p>Ensuite, on param\u00e8tre le daemon SASL correctement :<br \/>\nPositionner <code>START=yes<\/code> dans <code>\/etc\/default\/saslauthd<\/code><br \/>\net modifier la fin du fichier comme suite :<\/p>\n<pre>#OPTIONS=\"-c -m \/var\/run\/saslauthd\"\r\nOPTIONS=\"-c -m \/var\/spool\/postfix\/var\/run\/saslauthd -r\"<\/pre>\n<p>Le reste du fichier par d\u00e9faut doit \u00eatre bon (DESC=\u00a0\u00bbSASL Authentication Daemon\u00a0\u00bb, NAME=\u00a0\u00bbsaslauthd\u00a0\u00bb, MECHANISMS=\u00a0\u00bbpam\u00a0\u00bb, MECH_OPTIONS=\u00a0\u00bb\u00a0\u00bb, THREADS=5).<\/p>\n<p>Vous pourrez voir au passage qu&rsquo;on indique (via le param\u00e8tre MECHANISMS) \u00e0  SASL d&rsquo;utiliser PAM.<br \/>\nMaintenant, on va dire \u00e0 PAM d&rsquo;utiliser MySQL.<\/p>\n<h3>Demander \u00e0  PAM d&rsquo;utiliser MySQL en d\u00e9crivant notre structure<\/h3>\n<p>Dans <code>\/etc\/pam.d\/smtp<\/code> (\u00e0  cr\u00e9er je crois), on indique qu&rsquo;on va utiliser le module MySQL pour PAM :<\/p>\n<pre>\r\nmxtest:\/etc\/pam.d# cat smtp\r\nauth    required   pam_mysql.so user=mail_adm passwd=monpassadmin host=127.0.0.1 db=postfix table=users usercolumn=email passwdcolumn=password crypt=1\r\naccount sufficient pam_mysql.so user=mail_adm passwd=monpassadmin host=127.0.0.1 db=postfix table=users usercolumn=email passwdcolumn=password crypt=1\r\n<\/pre>\n<h3>Ensuite, dire \u00e0  postfix de faire confiance \u00e0  SASL pour l&rsquo;authentification<\/h3>\n<p>Maintenant que SASL sait faire le boulot en base de donn\u00e9es, on configure postfix pour authentifier les utilisateurs via SASL\/PAM\/MYSQL.<br \/>\nDans <code>\/etc\/postfix\/sasl\/<\/code>, s&rsquo;assurer du contenu de <code>smtpd.conf<\/code> :<\/p>\n<pre>pwcheck_method: saslauthd\r\nmech_list: plain login\r\nallow_plaintext: true\r\nauxprop_plugin: mysql\r\nsql_hostnames: 127.0.0.1\r\nsql_user: mail_adm\r\nsql_passwd: monpassadmin\r\nsql_database: postfix\r\nsql_select: select password from users where email = &apos;%u&apos;<\/pre>\n<p>Ajoutez l&rsquo;utilisateur postfix au groupe sasl :<\/p>\n<pre>adduser postfix sasl<\/pre>\n<p>Enfin, expliquer \u00e0  postfix de bien vouloir relayer les envois d&rsquo;utilisateurs authentifi\u00e9s via SASL. Ce qui donne par exemple dans <code>\/etc\/postfix\/main.cf<\/code> :<\/p>\n<pre>smtpd_sender_restrictions = permit_sasl_authenticated\r\n        reject_unauth_pipelining\r\n        permit_mynetworks\r\n        reject_unauth_destination\r\n        reject_unknown_sender_domain\r\n        reject_non_fqdn_sender\r\n        check_policy_service inet:127.0.0.1:60000<\/pre>\n<p>C&rsquo;est surtout le \u00ab\u00a0permit_sasl_authenticated\u00a0\u00bb qui nous int\u00e9resse l\u00e0.<br \/>\nVoil\u00e0, postfix sait maintenant contr\u00f4ler les exp\u00e9diteurs avec l&rsquo;aide de SASL. Ils doivent se signer et exister dans la base.<br \/>\nMaintenant on met en place le TLS, si vous voulez utiliser du vrai cryptage SSL pour l&rsquo;authentification.<\/p>\n<h2>TLS : certificat et configuration<\/h3>\n<p>Dans <code>\/etc\/postfix\/<\/code>,on cr\u00e9e les clefs de cryptage :<\/p>\n<pre>mxtest:\/etc\/postfix# openssl req -new -outform PEM -out smtpd.cert -newkey rsa:2048 -nodes -keyout smtpd.key -keyform PEM -days 3650 -x509\r\nGenerating a 2048 bit RSA private key\r\n................................................+++\r\n................................................+++\r\nwriting new private key to 'smtpd.key'\r\n-----\r\nYou are about to be asked to enter information that will be incorporated\r\ninto your certificate request.\r\nWhat you are about to enter is what is called a Distinguished Name or a DN.\r\nThere are quite a few fields but you can leave some blank\r\nFor some fields there will be a default value,\r\nIf you enter '.', the field will be left blank.\r\n-----\r\nCountry Name (2 letter code) [AU]:FR\r\nState or Province Name (full name) [Some-State]:France\r\nLocality Name (eg, city) []:PARIS\r\nOrganization Name (eg, company) [Internet Widgits Pty Ltd]:MASOCIETE\r\nOrganizational Unit Name (eg, section) []:\r\nCommon Name (eg, YOUR name) []:mondomaine.fr\r\nEmail Address []:certif@mondomaine.fr<\/pre>\n<p><strong>IMPORTANT <\/strong>: le \u00ab\u00a0Common Name\u00a0\u00bb doit correspondonre \u00e0  votre <code>\/etc\/mailname<\/code><br \/>\nProt\u00e9gez la clef priv\u00e9e : <code>chmod 640 smtpd.key<\/code><br \/>\nJ&rsquo;ai mis 10 ans, on aurait pu mettre plus ou moins, c&rsquo;est le param\u00e8tre 3650 dans la ligne de commande.<\/p>\n<p>On ajoute pour finir la conf suivante pour activer le TLS et indiquer le certificat \u00e0  utiliser. Dans <code>\/etc\/postfix\/main.cf<\/code> toujours :<\/p>\n<pre>smtpd_tls_cert_file=\/etc\/postfix\/smtpd.cert\r\nsmtpd_tls_key_file=\/etc\/postfix\/smtpd.key\r\nsmtpd_use_tls=yes\r\nsmtpd_tls_session_cache_database = btree:${data_directory}\/smtpd_scache\r\nsmtp_tls_session_cache_database = btree:${data_directory}\/smtp_scache\r\nsmtpd_sasl_auth_enable = yes\r\nbroken_sasl_auth_clients = yes # \u00e0  voir, \u00e7a peut interdire certains outlook bugg\u00e9s, je crois, de t\u00eate.\r\nsmtpd_sasl_authenticated_header = yes\r\n<\/pre>\n<h2>C&rsquo;est fini, on relance tout \u00e7a<\/h2>\n<p>Red\u00e9marrez postfix et saslauthd via les <code>\/etc\/init.d\/saslauthd restart<\/code> et <code>\/etc\/init.d\/postfix restart<\/code> qui vont bien.<\/p>\n<h2>Tests pour l&rsquo;envoi, quelques erreurs analys\u00e9es<\/h2>\n<p>Apr\u00e8s un rapide telnet sur le port 25 (quand m\u00eame), testez avec un \u00ab\u00a0ehlo mailhost\u00a0\u00bb puor voir si le TLS est activ\u00e9 :<\/p>\n<pre>250-STARTTLS<\/pre>\n<p>Ensuite, comme pour la r\u00e9ception des mails, testez avec un client mail correct, en mode SMTP normal et avec TLS.<\/p>\n<h2>Erreurs rencontr\u00e9es<\/h2>\n<h3>Fausse manip dans \/etc\/pam.d\/smtp<\/h3>\n<p>Tous les tests SMTP, avec et sans TLS \u00e9taient KO. Dans les logs, simplement \u00e7a :<\/p>\n<pre>Oct 14 13:52:39 ns305192 postfix\/smtpd[6759]: connect from bla.fr[81.Y.67.X]\r\nOct 14 13:52:41 ns305192 postfix\/smtpd[6759]: warning: SASL authentication failure: Password verification failed\r\nOct 14 13:52:41 ns305192 postfix\/smtpd[6759]: warning: bla.fr[81.Y.67.X]: SASL PLAIN authentication failed: authentication failure\r\nOct 14 13:52:41 ns305192 postfix\/smtpd[6759]: warning: bla.fr[81.Y.67.X]: SASL LOGIN authentication failed: authentication failure\r\nOct 14 13:52:43 ns305192 postfix\/smtpd[6759]: disconnect from bla.fr[81.Y.67.X]<\/pre>\n<p>Je me souviens avoir utilis\u00e9 <code>saslfinger<\/code> pour tester et debugger. Essayez-le.<br \/>\nAu final, je m&rsquo;\u00e9tais simplement tromp\u00e9 dans le mot de passe MySQL du fichier <code>\/etc\/pam.d\/smtp<\/code><\/p>\n<h1>Quotas<\/h1>\n<p>Sujet totalement optionnel. J&rsquo;ai besoin dans mon cas de pouvoir affecter des quotas par utilisateur.<br \/>\nPostfix ne g\u00e8re pas les quotas nativement, il faut appliquer un patch. Donc recompiler. Ou trouver une source, mais au niveau mise \u00e0 jour de s\u00e9curit\u00e9, vous d\u00e9pendez alors du type qui maintient le d\u00e9p\u00f4t.<br \/>\nJ&rsquo;ai pr\u00e9f\u00e9r\u00e9 appliquer moi-m\u00eame le patch.<br \/>\nLe patch est donn\u00e9 par ce projet : <a href=\"http:\/\/vda.sourceforge.net\">http:\/\/vda.sourceforge.net<\/a>. Il est disponible pour toutes les versions postfix, notamment la 2.5.5, actuellement celle de Debian\/Lenny. 32 ou 64 bits.<\/p>\n<h2>Ajout du d\u00e9p\u00f4t de sources<\/h2>\n<p>D&rsquo;abord, dans mon cas, j&rsquo;ajoute un d\u00e9p\u00f4t de sources, via la ligne suivante dans <code>\/etc\/apt\/sources.list<\/code> :<\/p>\n<pre>deb-src ftp:\/\/ftp2.fr.debian.org\/debian\/ lenny main<\/pre>\n<p>Apr\u00e8s un <code>aptitude update<\/code>, on va t\u00e9l\u00e9charger les sources et tout le bazar pour compiler.<\/p>\n<h2>R\u00e9cup\u00e9ration des sources<\/h2>\n<pre>serv:\/etc\/postfix# apt-get build-dep postfix\r\nLecture des listes de paquets... Fait\r\nConstruction de l'arbre des d\u00e9pendances\r\nLecture des informations d'\u00e9tat... Fait\r\nLes NOUVEAUX paquets suivants seront install\u00e9s :\r\n  build-essential comerr-dev debhelper dpkg-dev g++ g++-4.3 gettext hardening-wrapper html2text intltool-debian libcdb-dev libcdb1 libdb-dev libdb4.6-dev libfile-remove-perl\r\n  libkadm55 libkrb5-dev libldap2-dev libmail-box-perl libmail-sendmail-perl libmime-types-perl libmysqlclient15-dev libobject-realize-later-perl libpcre3-dev libpcrecpp0\r\n  libpq-dev libsasl2-dev libssl-dev libstdc++6-4.3-dev libuser-identity-perl lsb-release po-debconf tinycdb zlib1g-dev\r\n0 mis \u00e0 jour, 34 nouvellement install\u00e9s, 0 \u00e0 enlever et 0 non mis \u00e0 jour.\r\nIl est n\u00e9cessaire de prendre 22,7Mo dans les archives.\r\nApr\u00e8s cette op\u00e9ration, 69,1Mo d'espace disque suppl\u00e9mentaires seront utilis\u00e9s.\r\nSouhaitez-vous continuer [O\/n] ?<\/pre>\n<p>Ensuite, on r\u00e9cup\u00e8re les sources de postfix :<\/p>\n<pre>serv:\/etc\/postfix# cd \/usr\/src\r\nserv:\/usr\/src# apt-get source postfix<\/pre>\n<p>Ca download et d\u00e9compresse (et gueule car je n&rsquo;ai pas mis la clef GPG blablabla pour v\u00e9rifier la signature du paquet, tout \u00e7a).<\/p>\n<h2>R\u00e9cup\u00e9ration du patch, compilation<\/h2>\n<p>On r\u00e9cup\u00e8re le patch qui va bien pour notre version postfix et on g\u00e9n\u00e8re les .deb<\/p>\n<pre>cd \/usr\/src\r\nwget http:\/\/vda.sourceforge.net\/VDA\/postfix-2.5.5-vda-ng.patch.gz\r\ngunzip postfix-2.5.5-vda-ng.patch.gz\r\ncd postfix-2.5.5\r\npatch -p1 < ..\/postfix-2.5.5-vda-ng.patch\r\ndpkg-buildpackage<\/pre>\n<h2>Remplacement du postfix officiel<\/h2>\n<p>Une fois plac\u00e9 dans \/usr\/src, un simple <code>dpkg -i postfix_2.5.5-1.1_i386.deb postfix-mysql_2.5.5-1.1_i386.deb<\/code> suffit \u00e0 remplacer postfix et son extension mysql. Ca ne flingue m\u00eame pas la conf actuelle. Bref, nickel.<\/p>\n<h2>On ajoute le champ quota, on indique \u00e0 postfix et courierauth<\/h2>\n<p>Dans la base de donn\u00e9es, on ajoute la colonne. J'ai choisi 20 Mo par d\u00e9faut.<\/p>\n<pre>mysql> alter table users add quota bigint (20) default '20971520' after password;\r\nQuery OK, 1 row affected (0.10 sec)\r\nRecords: 1  Duplicates: 0  Warnings: 0\r\n\r\nmysql> desc users;\r\n+----------+-------------+------+-----+----------+-------+\r\n| Field    | Type        | Null | Key | Default  | Extra |\r\n+----------+-------------+------+-----+----------+-------+\r\n| email    | varchar(80) | NO   | PRI | NULL     |       |\r\n| password | varchar(20) | NO   |     | NULL     |       |\r\n| quota    | bigint(20)  | YES  |     | 20971520 |       |\r\n+----------+-------------+------+-----+----------+-------+\r\n3 rows in set (0.00 sec)<\/pre>\n<p>Le alter s'est occup\u00e9 de mettre la valeur par d\u00e9faut sur les comptes existants<\/p>\n<p>On cr\u00e9e alors la requ\u00eate qui v\u00e9rifie les quotas :<\/p>\n<pre>mxtest:~# cat \/etc\/postfix\/mysql-virtual_mailbox_limit_maps.cf\r\nuser = mail_adm\r\npassword = monpassadmin\r\ndbname = postfix\r\nquery = SELECT quota FROM users WHERE email=&apos;%s&apos;\r\nhosts = 127.0.0.1<\/pre>\n<p>Pensez \u00e0 priver l'acc\u00e8s \u00e0 ce fichier.<\/p>\n<p>Et on ajoute cette notion de limite dans notre postfix-qui-sait-g\u00e9rer-les-quotas, dans <code>\/etc\/postfix\/main.fr<\/code> :<\/p>\n<pre>virtual_mailbox_limit_maps = proxy:mysql:\/etc\/postfix\/mysql-virtual_mailbox_limit_maps.cf\r\nvirtual_mailbox_limit_override = yes\r\nvirtual_maildir_limit_message = \"The user you are trying to reach is over quota - L'utilisateur que vous cherchez a contacter a depasse son quota de mails\"\r\nvirtual_overquota_bounce = yes<\/pre>\n<p>Sans oublier d'ajouter \"<code>$virtual_mailbox_limit_maps<\/code>\" dans la variable \"<code>proxy_read_maps<\/code>\".<\/p>\n<h2>Indication des quotas \u00e0 \"courier\"<\/h2>\n<p>On pr\u00e9cise \u00e0 courier qu'il y a des quotas en cr\u00e9ant ou d\u00e9commentant la variable suivante :<\/p>\n<pre>mxtest:~# grep quota \/etc\/courier\/authmysqlrc\r\nMYSQL_QUOTA_FIELD       quota<\/pre>\n<p>On recharge le tout, on teste, on se congratule. Youpi, c'est fini.<\/p>\n<h1>Ce que je n'ai pas trait\u00e9<\/h1>\n<h2>j'ai pas jou\u00e9 avec les transports<\/h2>\n<p>Pas besoin dans mon cas.<\/p>\n<h2>Avoir un procmailrc par utilisateur ?<\/h2>\n<p>Aucune id\u00e9e, je verrai plus tard.<br \/>\nEn effet, o\u00f9 doit-on stocker le .procmailrc ??? ou alors faire un \/etc\/procmailrc g\u00e9n\u00e9ral qui \u00e9ventuellement trie par destinataire... lourd.<\/p>\n<h2>D\u00e9sactivation de protocole par utilisateur<\/h2>\n<p>Exemple, besoin de d\u00e9sactiver le webmail ou le POP pour un utilisateur ? A priori, avec les \"crit\u00e8res suppl\u00e9mentaires\" que l'on peut passer dans les fichiers .cf de description de requ\u00eates, \u00e7a doit \u00eatre jouable. Je n'ai pas cherch\u00e9 car pas encore eu besoin.<br \/>\nEvidemment, il faudra ajouter une\/des colonne dans la table, s\u00fbrement un bool\u00e9en indiquant si le protocole est accept\u00e9 pour l'utilisateur X.<\/p>\n<h2>Alerte sur les d\u00e9passements de quota<\/h2>\n<p>Pas eu encore le temps, mais il faudra y penser pour d\u00e9tecter les boulets qui ont des bo\u00eetes pleines et ne comprennent pas pourquoi ils ne re\u00e7oivent rien.<br \/>\nJe n'ai pas encore regard\u00e9 : chapitre 11 <a href=\"http:\/\/www.howtoforge.com\/virtual-users-domains-postfix-courier-mysql-squirrelmail-debian-lenny-p3\" target=\"_blank\">dans cette page<\/a>.<br \/>\nVoil\u00e0, j'esp\u00e8re que \u00e7a roulera pour votre installation et que vous aurez ainsi une belle plateforme de mails.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Introduction Hop, Apr\u00e8s ma doc d&rsquo;initiation Debian, o\u00f9 un rapide chapitre est consacr\u00e9 au montage d&rsquo;un serveur postfix, spamassassin, greylisting etc, dans une configuration simple, Apr\u00e8s cet article sur le montage complet cette fois, en &hellip;<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_crdt_document":"","_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[2,385,82],"tags":[399,175,398,396,397,35,402,40,400,401,118,395,404,403],"class_list":["post-829","post","type-post","status-publish","format-standard","hentry","category-debian","category-mails","category-pl","tag-courier-authdaemon","tag-courier-imap","tag-courier-imap-ssl","tag-courier-pop","tag-courier-pop-ssl","tag-imap","tag-imaps","tag-mysql","tag-pop3","tag-pop3s","tag-postfix","tag-postfix-mysql","tag-sasl","tag-tls"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>postfix : utilisateurs &quot;virtuels&quot; MySQL ; acc\u00e8s POP3[S], IMAP[S], SASL et TLS ; quota (bingo, j&#039;ai tout mis dans le titre) - Le blog de Michauko<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/michauko.org\/blog\/postfix-utilisateurs-virtuels-mysql-acces-pop3s-imaps-sasl-et-tls-quota-bingo-jai-tout-mis-dans-le-titre-829\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"postfix : utilisateurs &quot;virtuels&quot; MySQL ; acc\u00e8s POP3[S], IMAP[S], SASL et TLS ; quota (bingo, j&#039;ai tout mis dans le titre) - Le blog de Michauko\" \/>\n<meta property=\"og:description\" content=\"Introduction Hop, Apr\u00e8s ma doc d&rsquo;initiation Debian, o\u00f9 un rapide chapitre est consacr\u00e9 au montage d&rsquo;un serveur postfix, spamassassin, greylisting etc, dans une configuration simple, Apr\u00e8s cet article sur le montage complet cette fois, en &hellip;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/michauko.org\/blog\/postfix-utilisateurs-virtuels-mysql-acces-pop3s-imaps-sasl-et-tls-quota-bingo-jai-tout-mis-dans-le-titre-829\/\" \/>\n<meta property=\"og:site_name\" content=\"Le blog de Michauko\" \/>\n<meta property=\"article:published_time\" content=\"2009-10-20T14:48:16+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2015-11-21T09:06:52+00:00\" \/>\n<meta name=\"author\" content=\"michauko\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u00c9crit par\" \/>\n\t<meta name=\"twitter:data1\" content=\"michauko\" \/>\n\t<meta name=\"twitter:label2\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data2\" content=\"26 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/michauko.org\\\/blog\\\/postfix-utilisateurs-virtuels-mysql-acces-pop3s-imaps-sasl-et-tls-quota-bingo-jai-tout-mis-dans-le-titre-829\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/michauko.org\\\/blog\\\/postfix-utilisateurs-virtuels-mysql-acces-pop3s-imaps-sasl-et-tls-quota-bingo-jai-tout-mis-dans-le-titre-829\\\/\"},\"author\":{\"name\":\"michauko\",\"@id\":\"https:\\\/\\\/michauko.org\\\/blog\\\/#\\\/schema\\\/person\\\/0cd9f3d9ce4dccc05df81a5b27051ea9\"},\"headline\":\"postfix : utilisateurs \u00ab\u00a0virtuels\u00a0\u00bb MySQL ; acc\u00e8s POP3[S], IMAP[S], SASL et TLS ; quota (bingo, j&rsquo;ai tout mis dans le titre)\",\"datePublished\":\"2009-10-20T14:48:16+00:00\",\"dateModified\":\"2015-11-21T09:06:52+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/michauko.org\\\/blog\\\/postfix-utilisateurs-virtuels-mysql-acces-pop3s-imaps-sasl-et-tls-quota-bingo-jai-tout-mis-dans-le-titre-829\\\/\"},\"wordCount\":3560,\"commentCount\":24,\"keywords\":[\"courier-authdaemon\",\"courier-imap\",\"courier-imap-ssl\",\"courier-pop\",\"courier-pop-ssl\",\"imap\",\"IMAPS\",\"mysql\",\"POP3\",\"POP3s\",\"postfix\",\"postfix-mysql\",\"SASL\",\"TLS\"],\"articleSection\":[\"Debian\",\"mails\",\"planet-libre.org\"],\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/michauko.org\\\/blog\\\/postfix-utilisateurs-virtuels-mysql-acces-pop3s-imaps-sasl-et-tls-quota-bingo-jai-tout-mis-dans-le-titre-829\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/michauko.org\\\/blog\\\/postfix-utilisateurs-virtuels-mysql-acces-pop3s-imaps-sasl-et-tls-quota-bingo-jai-tout-mis-dans-le-titre-829\\\/\",\"url\":\"https:\\\/\\\/michauko.org\\\/blog\\\/postfix-utilisateurs-virtuels-mysql-acces-pop3s-imaps-sasl-et-tls-quota-bingo-jai-tout-mis-dans-le-titre-829\\\/\",\"name\":\"postfix : utilisateurs \\\"virtuels\\\" MySQL ; acc\u00e8s POP3[S], IMAP[S], SASL et TLS ; quota (bingo, j'ai tout mis dans le titre) - Le blog de Michauko\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/michauko.org\\\/blog\\\/#website\"},\"datePublished\":\"2009-10-20T14:48:16+00:00\",\"dateModified\":\"2015-11-21T09:06:52+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/michauko.org\\\/blog\\\/#\\\/schema\\\/person\\\/0cd9f3d9ce4dccc05df81a5b27051ea9\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/michauko.org\\\/blog\\\/postfix-utilisateurs-virtuels-mysql-acces-pop3s-imaps-sasl-et-tls-quota-bingo-jai-tout-mis-dans-le-titre-829\\\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/michauko.org\\\/blog\\\/postfix-utilisateurs-virtuels-mysql-acces-pop3s-imaps-sasl-et-tls-quota-bingo-jai-tout-mis-dans-le-titre-829\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/michauko.org\\\/blog\\\/postfix-utilisateurs-virtuels-mysql-acces-pop3s-imaps-sasl-et-tls-quota-bingo-jai-tout-mis-dans-le-titre-829\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\\\/\\\/michauko.org\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"postfix : utilisateurs \u00ab\u00a0virtuels\u00a0\u00bb MySQL ; acc\u00e8s POP3[S], IMAP[S], SASL et TLS ; quota (bingo, j&rsquo;ai tout mis dans le titre)\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/michauko.org\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/michauko.org\\\/blog\\\/\",\"name\":\"Le blog de Michauko\",\"description\":\"Si tu ne comprends pas le titre de l&#039;article, passe ton chemin\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/michauko.org\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"fr-FR\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/michauko.org\\\/blog\\\/#\\\/schema\\\/person\\\/0cd9f3d9ce4dccc05df81a5b27051ea9\",\"name\":\"michauko\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/5c3a8969c185fd0eef3893a15408f3ef1b36a6681a066b1eb32045643c30ba65?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/5c3a8969c185fd0eef3893a15408f3ef1b36a6681a066b1eb32045643c30ba65?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/5c3a8969c185fd0eef3893a15408f3ef1b36a6681a066b1eb32045643c30ba65?s=96&d=mm&r=g\",\"caption\":\"michauko\"},\"sameAs\":[\"http:\\\/\\\/michauko.org\\\/\"],\"url\":\"https:\\\/\\\/michauko.org\\\/blog\\\/author\\\/randomized2\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"postfix : utilisateurs \"virtuels\" MySQL ; acc\u00e8s POP3[S], IMAP[S], SASL et TLS ; quota (bingo, j'ai tout mis dans le titre) - Le blog de Michauko","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/michauko.org\/blog\/postfix-utilisateurs-virtuels-mysql-acces-pop3s-imaps-sasl-et-tls-quota-bingo-jai-tout-mis-dans-le-titre-829\/","og_locale":"fr_FR","og_type":"article","og_title":"postfix : utilisateurs \"virtuels\" MySQL ; acc\u00e8s POP3[S], IMAP[S], SASL et TLS ; quota (bingo, j'ai tout mis dans le titre) - Le blog de Michauko","og_description":"Introduction Hop, Apr\u00e8s ma doc d&rsquo;initiation Debian, o\u00f9 un rapide chapitre est consacr\u00e9 au montage d&rsquo;un serveur postfix, spamassassin, greylisting etc, dans une configuration simple, Apr\u00e8s cet article sur le montage complet cette fois, en &hellip;","og_url":"https:\/\/michauko.org\/blog\/postfix-utilisateurs-virtuels-mysql-acces-pop3s-imaps-sasl-et-tls-quota-bingo-jai-tout-mis-dans-le-titre-829\/","og_site_name":"Le blog de Michauko","article_published_time":"2009-10-20T14:48:16+00:00","article_modified_time":"2015-11-21T09:06:52+00:00","author":"michauko","twitter_card":"summary_large_image","twitter_misc":{"\u00c9crit par":"michauko","Dur\u00e9e de lecture estim\u00e9e":"26 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/michauko.org\/blog\/postfix-utilisateurs-virtuels-mysql-acces-pop3s-imaps-sasl-et-tls-quota-bingo-jai-tout-mis-dans-le-titre-829\/#article","isPartOf":{"@id":"https:\/\/michauko.org\/blog\/postfix-utilisateurs-virtuels-mysql-acces-pop3s-imaps-sasl-et-tls-quota-bingo-jai-tout-mis-dans-le-titre-829\/"},"author":{"name":"michauko","@id":"https:\/\/michauko.org\/blog\/#\/schema\/person\/0cd9f3d9ce4dccc05df81a5b27051ea9"},"headline":"postfix : utilisateurs \u00ab\u00a0virtuels\u00a0\u00bb MySQL ; acc\u00e8s POP3[S], IMAP[S], SASL et TLS ; quota (bingo, j&rsquo;ai tout mis dans le titre)","datePublished":"2009-10-20T14:48:16+00:00","dateModified":"2015-11-21T09:06:52+00:00","mainEntityOfPage":{"@id":"https:\/\/michauko.org\/blog\/postfix-utilisateurs-virtuels-mysql-acces-pop3s-imaps-sasl-et-tls-quota-bingo-jai-tout-mis-dans-le-titre-829\/"},"wordCount":3560,"commentCount":24,"keywords":["courier-authdaemon","courier-imap","courier-imap-ssl","courier-pop","courier-pop-ssl","imap","IMAPS","mysql","POP3","POP3s","postfix","postfix-mysql","SASL","TLS"],"articleSection":["Debian","mails","planet-libre.org"],"inLanguage":"fr-FR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/michauko.org\/blog\/postfix-utilisateurs-virtuels-mysql-acces-pop3s-imaps-sasl-et-tls-quota-bingo-jai-tout-mis-dans-le-titre-829\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/michauko.org\/blog\/postfix-utilisateurs-virtuels-mysql-acces-pop3s-imaps-sasl-et-tls-quota-bingo-jai-tout-mis-dans-le-titre-829\/","url":"https:\/\/michauko.org\/blog\/postfix-utilisateurs-virtuels-mysql-acces-pop3s-imaps-sasl-et-tls-quota-bingo-jai-tout-mis-dans-le-titre-829\/","name":"postfix : utilisateurs \"virtuels\" MySQL ; acc\u00e8s POP3[S], IMAP[S], SASL et TLS ; quota (bingo, j'ai tout mis dans le titre) - Le blog de Michauko","isPartOf":{"@id":"https:\/\/michauko.org\/blog\/#website"},"datePublished":"2009-10-20T14:48:16+00:00","dateModified":"2015-11-21T09:06:52+00:00","author":{"@id":"https:\/\/michauko.org\/blog\/#\/schema\/person\/0cd9f3d9ce4dccc05df81a5b27051ea9"},"breadcrumb":{"@id":"https:\/\/michauko.org\/blog\/postfix-utilisateurs-virtuels-mysql-acces-pop3s-imaps-sasl-et-tls-quota-bingo-jai-tout-mis-dans-le-titre-829\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/michauko.org\/blog\/postfix-utilisateurs-virtuels-mysql-acces-pop3s-imaps-sasl-et-tls-quota-bingo-jai-tout-mis-dans-le-titre-829\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/michauko.org\/blog\/postfix-utilisateurs-virtuels-mysql-acces-pop3s-imaps-sasl-et-tls-quota-bingo-jai-tout-mis-dans-le-titre-829\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/michauko.org\/blog\/"},{"@type":"ListItem","position":2,"name":"postfix : utilisateurs \u00ab\u00a0virtuels\u00a0\u00bb MySQL ; acc\u00e8s POP3[S], IMAP[S], SASL et TLS ; quota (bingo, j&rsquo;ai tout mis dans le titre)"}]},{"@type":"WebSite","@id":"https:\/\/michauko.org\/blog\/#website","url":"https:\/\/michauko.org\/blog\/","name":"Le blog de Michauko","description":"Si tu ne comprends pas le titre de l&#039;article, passe ton chemin","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/michauko.org\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"fr-FR"},{"@type":"Person","@id":"https:\/\/michauko.org\/blog\/#\/schema\/person\/0cd9f3d9ce4dccc05df81a5b27051ea9","name":"michauko","image":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/secure.gravatar.com\/avatar\/5c3a8969c185fd0eef3893a15408f3ef1b36a6681a066b1eb32045643c30ba65?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/5c3a8969c185fd0eef3893a15408f3ef1b36a6681a066b1eb32045643c30ba65?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/5c3a8969c185fd0eef3893a15408f3ef1b36a6681a066b1eb32045643c30ba65?s=96&d=mm&r=g","caption":"michauko"},"sameAs":["http:\/\/michauko.org\/"],"url":"https:\/\/michauko.org\/blog\/author\/randomized2\/"}]}},"_links":{"self":[{"href":"https:\/\/michauko.org\/blog\/wp-json\/wp\/v2\/posts\/829","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/michauko.org\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/michauko.org\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/michauko.org\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/michauko.org\/blog\/wp-json\/wp\/v2\/comments?post=829"}],"version-history":[{"count":58,"href":"https:\/\/michauko.org\/blog\/wp-json\/wp\/v2\/posts\/829\/revisions"}],"predecessor-version":[{"id":1713,"href":"https:\/\/michauko.org\/blog\/wp-json\/wp\/v2\/posts\/829\/revisions\/1713"}],"wp:attachment":[{"href":"https:\/\/michauko.org\/blog\/wp-json\/wp\/v2\/media?parent=829"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/michauko.org\/blog\/wp-json\/wp\/v2\/categories?post=829"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/michauko.org\/blog\/wp-json\/wp\/v2\/tags?post=829"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}