Cette page est en cours de rédaction.
Apportez votre aide…

Ceci est une ancienne révision du document !



DBMail : serveur de courrier IMAP et POP

DBMail permet de stocker les courriels dans une base de données au lieu du disque, et d'y accéder en IMAP ou POP.

Il travaille en conjonction avec Postfix, l'agent de transfert de courriel (MTA) par défaut d'Ubuntu.

  • Disposer d'un Nom de Domaine Déposé auprès d'un Registrar et d'un enregistrement MX.
sudo dig domain.tld && sudo dig mx domain.tld #doit exister
  • Expérience vivement recommandée en LAMP et SSH, pour une meilleure méthodologie et débogage
  • Etablir une connexion internet sur votre serveur, ne vous pose pas de problème.
ssh toto@www.domain.tld #exemple1 ; lynx http://www.domain.tld #exemple2 
  • Cas particuliers auto-hébergement
Auto-hébergé Registrar type GANDI Paliatif Smtp Imap Pop
Cas IP fixe dynamique DNS zone MX dyndns no-ip POSTFIX DBMAIL
1 oui x GANDI oui x Envoyer ET Recevoir oui
2 OVH
3 x oui test.domain.tld ok.dyndns.org ok.dyndns.org Envoyer ET Recevoir test.domain.tld mail is handled by ok.dyndns.org.
4 x oui x x ok.dyndns.org Envoyer Uniquement ok.dyndns.org has no MX record. voir smtp_generic_maps
4 ——————–> dbmail est inutile : Recevoir sur imap.fai.fr imap.gmail.com canonical_maps relayhost /etc/aliases
5 x oui x x ok.dyndns.org mxok.dyndns.org Envoyer ET Recevoir ok.dyndns.org mail is handled by mxok.dyndns.org.
6

légende; x=non, host -t mx domain.tld

Cas 1,2,3 recommandés

Ajout à la fin de /etc/postfix/master.cf

sudo vim /etc/postfix/master.cf
dbmail-lmtp     unix    -       -       n       -       -       lmtp

Configuration de postfix

sudo dpkg-reconfigure postfix

mailname main.cf

sudo nano /etc/mailname

 domain.com
  • domain.com est le domaine en tant que domaine de messagerie
  • smtp.domain.com est le CNAME ou alias du MX, ou MX lui même.
  • le mailto: toto@domain.com est alors possible

NB: valable également pour un sous.domain.com en tant que domaine de messagerie

main.cf

sudo nano /etc/postfix/main.cf

smtpd_banner = $myhostname ESMTP $mail_name
biff = no
append_dot_mydomain = no
readme_directory = no
myhostname = smtp.domain.com
mydomain = domain.com
mydestination = smtp.domain.com, localhost.domain.com, localhost
       
# méthode virtual 
# supprimer mydestination 
# relay_domains = $mynetworks
# relay_recipient_maps = mysql:/etc/postfix/sql-virtual_mailbox_maps.cf
               
myorigin = $mydomain
relayhost =
mynetworks = 127.0.0.0/8, 192.168.1.0/24
relay_domains = $mydestination
mailbox_size_limit = 51200000
recipient_delimiter = +
inet_interfaces = all
inet_protocols = all
smtpd_recipient_restrictions =
		permit_auth_destination,
		permit_mynetworks,
		permit_sasl_authenticated,
		reject_non_fqdn_hostname,
		reject_non_fqdn_sender,
		reject_non_fqdn_recipient,
		reject_unauth_destination,
		reject_unauth_pipelining,
		reject_invalid_hostname,
		reject_rbl_client opm.blitzed.org,
		reject_rbl_client list.dsbl.org,
		reject_rbl_client bl.spamcop.net,
		reject_rbl_client sbl-xbl.spamhaus.org
		reject
virtual_transport = dbmail-lmtp:localhost:24
virtual_mailbox_domains = mysql:/etc/postfix/sql-virtual_mailbox_domains.cf
virtual_mailbox_maps = mysql:/etc/postfix/sql-virtual_mailbox_maps.cf

Création de /etc/postfix/sql-virtual_mailbox_domains.cf

sudo vim /etc/postfix/sql-virtual_mailbox_domains.cf
user     = dbmail
password = password
hosts    = 127.0.0.1
dbname   = dbmail
query    = SELECT DISTINCT 1 FROM dbmail_aliases WHERE SUBSTRING_INDEX(alias, '@', -1) = '%s';

Création de /etc/postfix/sql-virtual_mailbox_maps.cf

sudo vim /etc/postfix/sql-virtual_mailbox_maps.cf
user     = dbmail
password = password
hosts    = 127.0.0.1
dbname   = dbmail
query    = SELECT 1 FROM dbmail_aliases WHERE alias='%s';

Redémarrage postfix

sudo /etc/init.d/postfix restart
sudo postfix reload

Dbmail

  • prend désormais en charge imaps
  • gestion et stockage via les tables mysql ou postgresql
  • adapté à la messagerie de masse et aux méthodes virtuelles de Postfix.
  • les tables mysql ou postgresql sont également incompatibles avec celles de dbmail 2.2

sudo nano /etc/apt/sources.list

# squeeze
deb http://debian.nfgd.net/debian/ squeeze main
# sid
deb http://debian.nfgd.net/debian/ sid main
# lucid
deb http://debian.nfgd.net/debian/ lucid main
sudo apt-get update && sudo apt-get upgrade
sudo apt-get install dbmail

apt://dbmail (mysql est déjà inclus dans ce paquet) Téléchargement

Dbmail 2.2

Présent normalement dans les dépôts. apt://dbmail,dbmail-mysql.

dbmail 3.0

dbmail 2.2

la base de données

Création du schema dbmail

mysql -uroot -p
mysql> CREATE schema dbmail;
mysql>ALTER DATABASE  `dbmail` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

Récupération et décompression du modèle de table :

cp /usr/share/doc/dbmail-mysql/examples/create_tables.mysql.gz ~/
gzip --decompress ~/create_tables.mysql.gz

Création des tables

mysql -uroot -p dbmail < ~/create_tables.mysql

Création d'un utilisateur dbmail

mysql -uroot -p
GRANT ALL ON dbmail.* to dbmail@localhost identified by 'password';

dbmail

Modification des lignes suivantes dans /etc/dbmail/dbmail.conf

sudo vim /etc/dbmail/dbmail.conf
driver = mysql
authdriver = sql
host = localhost
sqlsocket = /var/run/mysqld/mysqld.sock
user = dbmail
pass = password
db = dbmail
SIEVE_NOTIFY = no

Modification de /etc/default/dbmail pour le démarrage de l'imap et lmtp

sudo vim /etc/default/dbmail
START_IMAPD=1
START_LMTPD=1
START_SIEVE=1

Redémarrage de dbmail

sudo service dbmail restart

Compte Boîte aux Lettres - Mailbox

sudo dbmail-users

  • -a ajouter un nouveau Compte
  • -w mot de passe
  • -p type_password md5, plaintext, crypt, md5-hash, md5-digest, crypt-raw, md5-hash-raw, md5-digest-raw, md5-base64, md5-base64-raw
  • -c mise à jour du compte
  • -s créer une adresse mail ou plusieurs alias -s toto@domain.tld,titi@domain.tld
  • -S supprimer une adresse mail ou plusieurs alias
  • -m quota -m 50M
  • -d supprimer un compte
  • -x toto@domain.tld -t forward@domain2.tld2 ajouter un forward
  • -x toto@domain.tld -T forward@domain2.tld2 supprimer un forward

Ajouter & Créer un nouveau compte toto@domain.tld avec son adresse mail toto@domain.tld

sudo dbmail-users -a toto@domain.ltd -w mypass -p md5 -s toto@domain.ltd
Adding INBOX for new user... ok.
[toto@domain.tld]
Done

Supprimer un compte

sudo dbmail-users -d toto@domain.tld

http://www.dbmail.org/dokuwiki/doku.php/manage_users

SASL

Dbmail utilise saslauthd comme démon d'authentification (sasl authentication server). Rimap (Requête d'authentification au près du serveur IMAP) et LDAP sont les plus intéressants pour les méthodes virtual. Pam n'est pas vraiment adapté pour la messagerie de masse et il y a toujours moyen de convertir un user unix/pam en virtual/rimap par exemple. Avec les solutions Webmail, ce sentiment est renforcé.

Convertir un utilisateur Unix/Pam en Virtual/Rimap

sudo nano /etc/postfix/sender_canonical

user_unix   user_virtual@domain.tld
user_unix@domain.tld   user_virtual@domain.tld
sudo postmap hash:/etc/postfix/sender_canonical
sudo postconf -e 'sender_canonical_maps = hash:/etc/postfix/sender_canonical'
sudo dbmail-users -a user_virtual@domain.tld -s user_virtual@domain.tld -w mot_de_passe

user_virtual@domain.tld sert de récipient.

/etc/default/saslauthd

  • avec RIMAP
START=yes
NAME="saslauthd"
MECHANISMS="rimap"
MECH_OPTIONS="localhost"
THREADS=5
OPTIONS="-r -c -m /var/spool/postfix/var/run/saslauthd"
  • Service
sudo service saslauthd restart|reload

postfix sasl

main.cf

à titre d'information

broken_sasl_auth_clients = yes
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous
smtpd_recipient_restrictions = permit_auth_destination,	permit_mynetworks,	permit_sasl_authenticated,	....,	reject_non_fqdn_hostname,	reject_non_fqdn_sender,	reject_non_fqdn_recipient,	reject_unauth_destination,	reject
smtpd_sasl_auth_enable = yes
smtpd_sasl_authenticated_header = no
smtpd_sasl_local_domain = domain.tld
smtpd_sasl_path = smtpd
smtpd_sasl_security_options = noanonymous
smtpd_sasl_type = cyrus
smtp_sasl_password_maps

Sert principalement à s'authentifier auprès d'un relais serveur smtp dans le but de s'en servir comme transporteur. ( voir relayhost, transport_maps )

sudo nano /etc/postfix/sasl_passwd

[11.22.22.44]:587 compte@fai.fr:mot_de_passe
smtp.gmail.com:587 compte@gmail.com:mot_de-passe
sudo postmap hash:/etc/postfix/sasl_passwd
sudo postconf -e 'smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd'

master.cf

la même chose pour smtp,submisson,smtps

submission      inet    n    -    n    -    -    smtpd
	....
	-o smtpd_sasl_auth_enable=yes
	-o smtpd_client_restrictions=permit_sasl_authenticated,reject
         ...

Mise en place du CRAM-MD5

P'tit rappel;

  1. authentification en clair : PLAIN, LOGIN (rétro-compatibilité)
  2. authentification cryptée : CRAM-MD5, DIGEST-MD5 (peu utilisé)
  • le mech_list n'a aucun rapport avec le type de stockage des mots de passe.
  • cram-md5 a un stockage plaintext Source""But remember, that this will work only with 'plain' passwords in database.""
sudo dbmail-users -c toto@domain.tld -p plaintext -w password
  • /etc/postfix/smtpd.conf peut être obtenu par lien symbolique
sudo ln -s /usr/lib/sasl2/smtpd.conf /etc/postfix/smtpd.conf
sudo ln -s /usr/lib64/sasl2/smtpd.conf /etc/postfix/smtpd.conf
pwcheck_method: saslauthd
mech_list: cram-md5 login 
auxprop_plugin: sql
sql_engine: mysql
sql_hostnames: 127.0.0.1
sql_user: dbmail
sql_passwd: pass
sql_database: dbmail
sql_verbose: yes
sql_select: SELECT passwd FROM dbmail_users WHERE userid = '%u'

Options for Cyrus SASL

  • /etc/dbmail/dbmail.conf à modifier

AUTH=LOGIN AUTH=CRAM-MD5

...
# Provide a CAPABILITY to override the default
#
# capability 		= IMAP4 IMAP4rev1 AUTH=LOGIN ACL RIGHTS=texk NAMESPACE CHILDREN SORT QUOTA THREAD=ORDEREDSUBJECT UNSELECT IDLE
...
  • postfix main.cf
smtp_sasl_mechanism_filter = cram-md5 login

test avec roundcube

18:49:46 www roundcube: [77EB] C: A0001 ID ("name" "Roundcube Webmail" "version" "0.7.1" "php" "5.3.2-1ubuntu4.14" "os" "Linux" "command" "/roundube/?_task=mail&_action=moveto")
18:49:46 www roundcube: [77EB] S: * ID ("name" "dbmail" "version" "3.0.1" "os" "Linux" "os-version" "2.6.32-41-generic")
18:49:46 www roundcube: [77EB] S: A0001 OK ID completed
18:49:46 www roundcube: [77EB] C: A0002 AUTHENTICATE CRAM-MD5
18:49:46 www roundcube: [77EB] S: + MTM0MzA2MjE4Ni4xOTIzMy4yNkAobm9uZSk=
18:49:46 www roundcube: [77EB] C: ZXJyb3JAbS50aXRvdS5pbmZvIDczZmQwYmY4NWNiZjQ3YTM3YjliYzNhMWYwOTA5Nzcy
18:49:46 www roundcube: [77EB] S: A0002 OK [CAPABILITY IMAP4rev1 ACL RIGHTS=texk NAMESPACE CHILDREN SORT QUOTA THREAD=ORDEREDSUBJECT UNSELECT IDLE 
STARTTLS ID] User toto@domain.tld authenticated

Les interfaces graphiques à base de LAMP ou équivalent, pas obligatoires pour manager son dbmail.

  1. Simple-dbmail-admin nouveau projet 06/2012

Ces boîtes sont appelés boîtes aux lettres partagées - Elles sont décrites dans la table dbmail_subscription. Les droits d'accès appropriés sont décrits dans la table dbmail_acl.

vérification et récupérer le user_idnr

select user_idnr as reference,  userid as login, passwd as password from dbmail_users; 

+-----------+--------------------------------+------------------------------------+
| reference | login                          | password                           |
+-----------+--------------------------------+------------------------------------+
|         1 | __@!internal_delivery_user!@__ |                                    |
|         2 | anyone                         |                                    |
|         3 | __public__                     |                                    |
....

sudo dbmail-users -l __public__ | awk -F: '{print$3}'       
3

dbmail-acl.sh

Téléchargement Ce script permet de créer plus facilement les boîtes aux lettres partagées.

mkdir ~/dbmail ; cd ~/dbmail
wget http://linux.bononline.nl/linux/dbmail/src/dbmail-acl.sh
sudo cp /etc/dbmail/dbmail.conf .
sudo chown votre_user:votre_user ./dbmail.conf 
sudo chmod +x dbmail-acl.sh 

Renseigner la partie

DBMAIL[_dbmail_mysqldatabase]="dbmail"
DBMAIL[_dbmail_mysqluser]="dbmail"
DBMAIL[_dbmail_mysqlpassword]="gdhgybvudo"
DBMAIL[_dbmail_mysqlhost]="localhost"
DBMAIL[_dbmail_conffile]="/home/votre_user/dbmail/dbmail.conf"
DBMAIL[_dbmail_driver]="mysql"

modifier pour dbmail 3.x à proximité de function get_all_acls()

$MYSQL_CLIENT -N -e "SELECT lookup_flag, read_flag, seen_flag, write_flag, insert_flag, post_flag, create_flag, delete_flag, deleted_flag, expunge_flag, administer_flag FROM dbmail_acl WHERE mailbox_id = $mailbox_idnr and user_id = $user_idnr;"

et acl_add()

 $MYSQL_CLIENT -e "INSERT INTO dbmail_acl values ($user_idnr, $mailbox_idnr, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1);"

Mailbox

Au besoin, si dbmail-acl.sh ne crée pas les mailboxes.

  • création manuelle mailbox anyone
insert INTO dbmail_mailboxes (owner_idnr, name, seen_flag, answered_flag, deleted_flag, flagged_flag, recent_flag, draft_flag, no_inferiors, no_select, permission, seq ) VALUES ( '2', 'INBOX', '0', '0', '0', '0', '0', '0', '0', '0', '2', '0' );
  • création manuelle mailbox public
insert INTO dbmail_mailboxes (owner_idnr, name, seen_flag, answered_flag, deleted_flag, flagged_flag, recent_flag, draft_flag, no_inferiors, no_select, permission, seq ) VALUES ( '3', 'INBOX', '0', '0', '0', '0', '0', '0', '0', '0', '2', '0' );

#Users

en supposant que vous ayez 3 comptes distincts;

sudo dbmail-users -a t1@domain.tld -s t1@domain.tld -w t1
sudo dbmail-users -a t2@domain.tld -s t2@domain.tld -w t2
sudo dbmail-users -a t3@domain.tld -s t3@domain.tld -w t3

t1@mdomain.tld partage sa mailbox avec t2@domain.tld et t3@domain.tld

sudo bash ~/dbmail/dbmail-acl.sh add t2@domain.tld t1@mdomain.tld 
Taking default mailbox INBOX
Adding (full) acl rights for 26 to 60.
Adding subscription of 26 to 60.
sudo bash ~/dbmail/dbmail-acl.sh add t3@domain.tld t1@domain.tld 
Taking default mailbox INBOX
Adding (full) acl rights for 27 to 60.
Adding subscription of 27 to 60.
 

Messagerie de t2@domain.tld

La messagerie t1@domain.tld est partagée et incluse dans celle de t2@domain.tld.

#Public

en supposant que vous ayez 1 compte distinct;

sudo dbmail-users -a entreprise@domain.tld -s entreprise@domain.tld -w entreprise
sudo bash ~/dbmail/dbmail-acl.sh add entreprise@domain.tld __public__ 
Taking default mailbox INBOX
Adding (full) acl rights for 28 to 51.
Adding subscription of 28 to 51.

ajouter une adresse mail 'project@domain.tld' pour #Public

insert into dbmail_aliases ( alias, deliver_to, client_idnr ) value ( 'project@domain.tld', '3', '0' )

#Anyone

sudo dbmail-users -a open@domain.tld -s open@domain.tld -w open
sudo bash ~/dbmail/dbmail-acl.sh add open@domain.tld anyone

ajouter une adresse mail 'anyone@domain.tld'

insert into dbmail_aliases ( alias, deliver_to, client_idnr ) value ( 'anyone@domain.tld', '2', '0' )

Ajouter les Recipients

C'est l'équivalence de virtual-aliases pour d'autres serveurs imap. Il n'y a pas besoin également de rajouter des aliases dans /etc/aliases. Les récipients des listes se trouvent dans la table dbmail_aliases

sudo nano dbmail-add-list

#!/bin/bash
#14/07/2012
# sudo bash dbmail-addl-list <list_name>
#DOMAINNAME est le domaine de messagerie

if [ "x$1" == "x" ]; then
echo "No maillist specified"
echo "Usage: dbmail-add-list <list_name>"
exit 1
fi

DOMAINNAME="@list.domain.tld"
#DOMAINNAME="@domain.tld" si vous n'avez pas beaucoup de listes.

MAILLIST=$1

echo "dbmail-users -x $MAILLIST$DOMAINNAME -t \"|/usr/lib/mailman/mail/mailman post $MAILLIST\""
dbmail-users -x $MAILLIST$DOMAINNAME -t "|/usr/lib/mailman/mail/mailman post $MAILLIST"

for i in admin bounces confirm join leave owner request subscribe unsubscribe;
do
echo "dbmail-users -x $MAILLIST-$i$DOMAINNAME -t \"|/usr/lib/mailman/mail/mailman $i $MAILLIST\""
dbmail-users -x $MAILLIST-$i$DOMAINNAME -t "|/usr/lib/mailman/mail/mailman $i $MAILLIST"
done 

exemple pour la liste "pub"

  • Création
    sudo newlist pub
  • Ajouter les Récipients

sudo bash /home/…/dbmail-add-list pub

dbmail-users -x pub@list.domain.tld -t "|/usr/lib/mailman/mail/mailman post pub"
[|/usr/lib/mailman/mail/mailman post pub]
Done
dbmail-users -x pub-admin@list.domain.tld -t "|/usr/lib/mailman/mail/mailman admin pub"
[|/usr/lib/mailman/mail/mailman admin pub]
Done
...
.......
dbmail-users -x pub-subscribe@list.domain.tld -t "|/usr/lib/mailman/mail/mailman subscribe pub"
[|/usr/lib/mailman/mail/mailman subscribe pub]
Done
dbmail-users -x pub-unsubscribe@list.domain.tld -t "|/usr/lib/mailman/mail/mailman unsubscribe pub"
[|/usr/lib/mailman/mail/mailman unsubscribe pub]
Done
  • Lister les listes
sudo list_lists 
  2 listes correspondantes trouvées 
     Mailman 
      Pub 
  • Supprimer une liste
sudo rmlist pub 

Annexe mailman

  • master.cf
mailman unix  -       n       n       -       -       pipe
      flags=FR user=list:list 
      argv=/var/lib/mailman/bin/postfix-to-mailman.py ${nexthop} ${user}
  • transport_maps
list.domain.tld	   mailman:
  • check permissions
sudo check_perms;  sudo check_perms -f  # pour fixer les problèmes
  • Problème éventuel de Redirection entre la web_page_url de la liste et et du hostname (GUI MAILMAN & Apache)
sudo withlist -l -a -r fix_url 

source

Pare-feu

Ne pas oublier d'ouvrir les ports du pare-feu

Exemple avec shorewall :

sudo vim /etc/shorewall/rules
IMAP/ACCEPT          net             $FW
SMTP/ACCEPT          net             $FW

redémarrage du pare-feu

sudo /etc/init.d/shorewall restart

Contributeurs : Flavea. Titouan

  • dbmail.1344460792.txt.gz
  • Dernière modification: Le 08/08/2012, 23:19
  • par titouan