Composents d'un serveur email
Mail Transfer Agents
Gère les connexions SMTP entrantes pour la réception des emails et les connexions SMTP sortantes pour l'envoie des emails.
Mail Delivery Agents
Déplace les emails de la file MTA vers les boites email.
IMAP et POP3 Serveurs
Gère les connexions IMAP et POP3 entrantes des clients email pour qu'ils accèdent aux boites email.
Ports
25 SMTP
- Utilisé pour envoyer et recevoir les mails, doit être ouvert en entrée et en sortie sur le serveur
- Utilisé pour la connexion et pour la transmission d'emails entre serveurs (relay)
- Doit accepter les connexions anonymes mais ne doit pas les relayer
587 SMTP
- Utilisé par les clients mail qui se connecte au serveur pour envoyer des mails
- non-chiffré, mais utilise STARTTLS
- Doit rejeter les connexions anonymes et relayer les autres
465 Secure SMTP (SSMTP)
- utilisé par les clients mail qui se connecte au serveur pour envoyer des mails
- chiffré
- Doit rejeter les connexions anonymes et relayer les autres
Autres ports d'entrée
- 110 POP3
- 995 SSL-POP (encrypted)
- 143 IMAP
- 585 Secure IMAP (IMAP4-SSL)
- 993 IMAP4 over SSL (IMAPS, encrypted)
Historiquement les ports 993, 995 et 465 sont utilisés comme connexions chiffrées pour les protocoles IMAP (143), POP (110) et SMTP (25).
Mais il a été décidé qu'avoir 2 ports pour un protocole était du gaspillage.
C'est pourquoi STARTTLS a été créé, il permet d'initier une connexion en clair, puis de basculer sur une connexion chiffrée avec TLS.
PostFix
Liens
Configuration
Outils
|
postconf -pf
postconf -nf
postconf -df
|
Bases
/etc/postfix/main.cf
|
mynetworks_style = host
relay_domains =
myhostname = nom.mon-domaine.fr
mydomain = mon-domaine.fr
myorigin = $mydomain
relayhost = smtp.free.fr:25
smtpd_error_sleep_time = 1s
smtpd_soft_error_limit = 10
smtpd_hard_error_limit = 20
|
/etc/postfix/main.cf
|
transport_maps = hash:/etc/postfix/transport
|
/etc/postfix/transport
|
mon-domaine.fr :
.mon-domaine.fr :
* smtp:smtp.free.fr:25
* smtp:[smtp.free.fr]:25
|
|
postmap /etc/postfix/transport
|
/etc/postfix/master.cf
|
smtp inet n - n - - smtpd
submission inet n - n - - smtpd
-o smtpd_tls_security_level=encrypt
-o smtpd_sasl_auth_enable=yes
-o smtpd_tls_auth_only=yes
|
/etc/postfix/main.cf
|
smtpd_sasl_auth_enable = yes
smtpd_sasl_type = dovecot
smtpd_sasl_path = /var/run/dovecot/auth-client
smtpd_sasl_local_domain = $mydomain
smtpd_sasl_security_options = noanonymous, nodictionary, noplaintext
smtpd_sasl_tls_security_options = noanonymous, nodictionary
smtpd_tls_auth_only = yes
smtpd_tls_cert_file = /etc/ssl/private/server.crt
smtpd_tls_key_file = /etc/ssl/private/server.key
smtpd_relay_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
smtpd_recipient_restrictions = $smtpd_relay_restrictions
smtpd_tls_loglevel = 1
|
Création des certificats
/etc/postfix/main.cf
|
virtual_mailbox_domains = $mydomain
virtual_mailbox_maps = hash:/etc/postfix/virtual_mailbox_maps
virtual_alias_maps = hash:/etc/postfix/virtual_alias_maps
local_recipient_maps = $virtual_mailbox_maps $virtual_alias_maps
local_transport = virtual
virtual_mailbox_base = /home/vmail
virtual_mailbox_limit = 51200000
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000
virtual_minimum_uid = 5000
|
Dossiers dans lesquels seront stockés les mails:
compte1@mon-domaine.fr → /home/vmail/ + compte1/
/etc/postfix/virtual_mailbox_maps
|
compte1@mon-domaine.fr compte1
compte2@mon-domaine.fr compte2
|
Permet de rediriger une adresse vers une autre
/etc/postfix/virtual_alias_maps
|
compte3@mon-domaine.fr compte1@mon-domaine.fr
|
|
postmap /etc/postfix/virtual_mailbox_maps
postmap /etc/postfix/virtual_alias_maps
|
Rediriger le compte mail root vers un autre compte
Dans cette configuration le fichier /etc/postfix/aliases ne fonctionne pas, il faut à la place utiliser le fichier /etc/postfix/virtual_alias_maps
/etc/postfix/aliases
|
root: compte@mon-domaine.fr
|
/etc/postfix/virtual_alias_maps
|
root@mon-domaine.fr compte@mon-domaine.fr
|
 |
On peut mettre plus d'un compte dans la colonne de droite (séparés par des espaces) |
/etc/postfix/main.cf
|
recipient_bcc_maps = hash:/etc/postfix/recipient_bcc_maps
|
/etc/postfix/recipient_bcc_maps
|
user@example.com recipient@example.net
|
|
postmap /etc/postfix/recipient_bcc_maps
systemctl reload postfix
|
/etc/postfix/sender_access
|
user@domain.com REJECT
|
|
cd /etc/postfix
postmap hash:sender_access
|
/etc/postfix/main.cf
|
smtpd_recipient_restrictions = check_sender_access hash:/etc/postfix/sender_access
|
PostfixAdmin
|
sudo pacman -S postfixadmin
|
/etc/webapps/postfixadmin/config.inc.php
|
$CONF['configured'] = true;
$CONF['database_type'] = 'mysqli';
$CONF['database_host'] = 'localhost';
$CONF['database_user'] = 'postfix_user';
$CONF['database_password'] = 'mot de passe';
$CONF['database_name'] = 'postfix_db';
$CONF['setup_password'] = 'mon hash';
|
/etc/php/php.ini
|
extension=imap.so
|
Base de données
|
CREATE DATABASE `postfix_db` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
CREATE USER 'postfix_user'@'localhost' IDENTIFIED BY 'mot de passe';
GRANT ALL ON `postfix_db`.* TO `postfix_user`@`localhost`;
|
Nginx
/etc/nginx/nginx.conf
|
server {
listen 80;
server_name postfixadmin.domain.fr;
root /usr/share/webapps/postfixAdmin;
index index.php;
location ~ \.php$ {
try_files $uri =404;
fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
fastcgi_index index.php;
include /etc/nginx/fastcgi.conf;
}
}
|
Aller à l'url suivante: http://postfixadmin.domain.fr/setup.php
- Vérifier que tout est bien installé
- Créer un mot de passe pour le setup, puis entrer le hash dans le fichier de configuration ($CONF['setup_password'])
- Créer un compte administrateur
Comptes virtuels configurés dans mysql
/etc/postfix/main.cf
|
virtual_alias_maps = proxy:mysql:/etc/postfix/virtual_alias_maps.cf
virtual_mailbox_domains = proxy:mysql:/etc/postfix/virtual_domains_maps.cf
virtual_mailbox_maps = proxy:mysql:/etc/postfix/virtual_mailbox_maps.cf
local_recipient_maps = $virtual_mailbox_maps
local_transport = virtual
virtual_mailbox_base = /home/vmail
virtual_mailbox_limit = 512000000
virtual_minimum_uid = 5000
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000
|
/etc/postfix/virtual_alias_maps.cf
|
user = postfix_user
password = mot de passe
hosts = localhost
dbname = postfix_db
query = SELECT goto FROM alias WHERE address='%s' AND active = true
|
/etc/postfix/virtual_domains_maps.cf
|
user = postfix_user
password = mot de passe
hosts = localhost
dbname = postfix_db
query = SELECT domain FROM domain WHERE domain='%s' AND backupmx = false AND active = true
|
/etc/postfix/virtual_mailbox_limits.cf
|
user = postfix_user
password = mot de passe
hosts = localhost
dbname = postfix_db
query = SELECT quota FROM mailbox WHERE username='%s'
|
/etc/postfix/virtual_mailbox_maps.cf
|
user = postfix_user
password = mot de passe
hosts = localhost
dbname = postfix_db
query = SELECT maildir FROM mailbox WHERE username='%s' AND active = true
|
Test
Se connecter sur PostfixAdmin → Send Email
 |
Le port 25 doit être ouvert en sortie.
Erreur: Connection timed out
Freebox |
|
telnet localhost 25
ehlo localhost
mail from: root@localhost
rcpt to: test@gmail.com
data
Subject: Test
Test
.
quit
|
Log
/var/log/mail.log
 |
« syslog-ng » doit être installé et activé au démarrage pour que Postfix écrive dans le fichier de log, sinon l'écriture du log se fera dans le journal. |
/etc/logrotate.d/syslog-ng
|
/var/log/mail.log {
monthly
rotate 1
missingok
sharedscripts
postrotate
/bin/kill -HUP $(cat /run/syslog-ng.pid 2>/dev/null) 2>/dev/null || true
endscript
}
|
Installation
|
sudo pacman postfix
groupadd -g 5000 vmail
useradd -u 5000 -g vmail -d /home/vmail -s /bin/false vmail
mkdir /home/vmail
chown vmail:vmail /home/vmail
chmod -R 750 /home/vmail
passwd vmail
|
 |
Dovecot n’autorise que les connexions d'utilisateurs ayant un ID > 500 (ici on force l'ID de vmail à 5000)
Ce réglage peut être modifié dans /etc/dovecot/conf.d/10-mail.conf → first_valid_uid |
Dovecot
Permet de se connecter à son compte email et de récupérer ses emails.
|
sudo pacman -S dovecot
cp /etc/dovecot/dovecot.conf.sample /etc/dovecot/dovecot.conf
cp -r /usr/share/doc/dovecot/example-config/conf.d /etc/dovecot
|
/etc/dovecot/dovecot.conf
|
protocols = imap
|
Authentification
/etc/dovecot/conf.d/10-master.conf
|
service auth {
unix_listener /var/spool/postfix/private/auth {
mode = 0660
user = postfix
group = postfix
}
}
|
Stockage des emails
/etc/dovecot/conf.d/10-mail.conf
|
mail_location = maildir:/home/vmail/%u
|
SSL / TLS
/etc/dovecot/conf.d/10-ssl.conf
|
ssl = required
ssl_cert = </etc/ssl/private/server.crt
ssl_key = </etc/ssl/private/server.key
|
/etc/dovecot/conf.d/10-auth.conf
|
disable_plaintext_auth = yes
auth_mechanisms = plain
|
Stockage des mots de passes dans un fichier
 |
Utiliser une userdb static ne permet pas de lister les utilisateurs.
Error: User listing returned failure
Error: Failed to iterate through some users |
/etc/dovecot/conf.d/10-auth.conf
|
!include auth-passwdfile.conf.ext
!include auth-static.conf.ext
|
/etc/dovecot/conf.d/auth-passwdfile.conf.ext
|
passdb {
driver = passwd-file
args = /etc/dovecot/passwd
}
|
/etc/dovecot/conf.d/auth-static.conf.ext
|
userdb {
driver = static
args = uid=vmail gid=vmail home=/home/vmail/%u
}
|
/etc/dovecot/passwd
|
user1@mon-domaine.fr:{PLAIN}password
user2@mon-domaine.fr:{SSHA}vkIq9ZuTczNGgsinVJgLE/Urc5HNHCYq
|
 |
« user3 » fait référence à « user3@localhost » |
|
doveadm pw -p password
doveadm pw -s ssha -p password
doveadm pw -s SHA512-CRYPT -p password
doveadm pw -s BLF-CRYPT -p password
|
Stockage des mots de passes dans un mysql
|
cp /usr/share/doc/dovecot/example-config/dovecot-sql.conf.ext /etc/dovecot/dovecot-sql.conf.ext
chmod 600 /etc/dovecot/dovecot-sql.conf.ext
|
/etc/dovecot/dovecot-sql.conf.ext
|
driver = mysql
connect = host=localhost dbname=postfix_db user=postfix_user password=motdepasse
default_pass_scheme = MD5
user_query = SELECT '/home/vmail/%u' as home, \
'maildir:/home/vmail/%u' as mail, \
5000 AS uid, \
5000 AS gid, \
concat('dirsize:storage=', quota) AS quota \
FROM mailbox \
WHERE username = '%u' AND active = '1'
password_query = SELECT username as user, \
password, \
'/home/vmail/%u' as userdb_home, \
'maildir:/home/vmail/%u' as userdb_mail, \
5000 as userdb_uid, \
5000 as userdb_gid \
FROM mailbox \
WHERE username = '%u' AND active = '1'
|
/etc/dovecot/conf.d/10-logging.conf
|
log_path = /var/log/dovecot.log
info_log_path = /var/log/dovecot-info.log
debug_log_path = /var/log/dovecot-debug.log
auth_verbose = yes
|
/etc/logrotate.d/dovecot
|
/var/log/dovecot*.log {
monthly
rotate 1
missingok
notifempty
compress
delaycompress
sharedscripts
postrotate
doveadm log reopen
endscript
}
|
|
DOVEADM="/usr/bin/doveadm";
$DOVEADM expunge -A mailbox Trash savedbefore 15d
$DOVEADM expunge -A mailbox Junk savedbefore 15d
users="user1@domain.fr user2@domain.fr"
for user in $users
do
$DOVEADM expunge -u $user mailbox Trash savedbefore 15d
$DOVEADM expunge -u $user mailbox Junk savedbefore 15d
done
|
crontab
|
0 5 * * 0 /path/to/my/script_dovecot_expunge.sh
|
Liens
Erreurs
|
doveadm mount add /path/folder ignore
doveadm mount add '/path/*' ignore
|
|
pacman -S roundcubemail php-intl
chown -R http:http /usr/share/webapps/roundcubemail/temp /usr/share/webapps/roundcubemail/logs
|
/etc/nginx/nginx.conf
|
server {
listen 80;
server_name roundcube.domain;
root /usr/share/webapps/roundcubemail;
index index.php;
location ~ ^/config|temp|logs/ {
deny all;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
fastcgi_index index.php;
include /etc/nginx/fastcgi.conf;
include uwsgi_params;
uwsgi_modifier1 14;
uwsgi_pass unix:/run/uwsgi/roundcubemail.sock;
}
}
|
/etc/php/php.ini
|
open_basedir = /tmp/:/usr/share/webapps/roundcubemail/:/etc/webapps/roundcubemail/:/var/log/roundcubemail/:/var/cache/roundcubemail/
extension=exif.so
extension=iconv.so
extension=intl.so
extension=pdo_mysql.so
|
Aller à l'url http://roundcube.domain/installer pour générer le fichier /etc/webapps/roundcubemail/config/config.inc.php
Base de données Roundcube
|
CREATE DATABASE `roundcube_db` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
GRANT ALL PRIVILEGES ON roundcube_db.* TO 'roundcube_user'@'localhost' IDENTIFIED BY 'password';
|
|
mysql -u root -p roundcubemail < /usr/share/webapps/roundcubemail/SQL/mysql.initial.sql
|
Fin de l'installation
Supprimer le dossier /usr/share/webapps/roundcubemail/installer
Ou modifier la configuration pour interdire l'utilisation de l'installeur.
/etc/webapps/roundcubemail/config/config.inc.php
|
$config['enable_installer'] = false;
|
Logs
- /var/log/roundcubemail/errors
- /var/log/roundcubemail/sendmail
- /var/log/roundcubemail/smtp
/etc/logrotate.d/roundcube
|
/var/log/roundcubemail/errors /var/log/roundcubemail/sendmail {
monthly
rotate 1
missingok
notifempty
compress
delaycompress
create 640 http http
}
|
/etc/webapps/roundcubemail/config/config.inc.php
|
$config['smtp_debug'] = true;
|
/etc/webapps/roundcubemail/config/config.inc.php
|
$config['plugins'] = array('custom_from');
|
 |
Copier les plugins dans /usr/share/webapps/roundcubemail/plugins |
Après l'installation, une page demandant la mise à jour de la base de données s'affiche.
Ensuite se connecter avec le compte qui deviendra l'administrateur des plugins → Settings:
une page demandant la création d'un fichier *.myrc s'affiche. La création de se fichier autorise le compte connecté à devenir l'administrateur des plugins.
 |
Les plugins ajoutés avec le plugin manager ne doivent pas être ajoutés dans le fichier « config.inc.php » |
- Supprimer le fichier « /usr/share/webapps/roundcubemail/*.myrc »
- DROP table ‘plugin_manager’
- Remove entry ‘myrc_plugin_manager’ from ‘system’ table
Nécessite l'installation des plugins
- jscolor
- http_auth
- timepicker
Désinstaller calendar (myrc)
- Supprimer la table « events », « events_cache », « events_caldav » et « reminders »
- Supprimer l'entrée « myrc_calendar » de la table « system »
tasklist (kolab)
|
cd /usr/share/webapps/roundcubemail/bin
./updatedb.sh --package=tasklist-database --version=x.x.x --dir=../plugins/tasklist/drivers/database/SQL
|
 |
Impossible de réordonner les taches. |
|
cd /usr/share/webapps/roundcubemail/bin
./updatedb.sh --package=calendar-database --version=x.x.x --dir=../plugins/calendar/drivers/database/SQL
|
Permet de répondre avec le bon expéditeur (From) lorsque l'email à été redirigé depuis un alias.
Permet aussi de modifier l'expéditeur.
DomainKeys Identified Mail permet de certifier qu'un email a bien été envoyer depuis son domaine.
Les emails sont signés avec une clé privée. Le serveur destinataire récupère la clé public via le DNS et vérifie la correspondance.
Tests
- Créer un domaine et un compte email dans PostfixAdmin.
- Se loguer avec ce compte dans Roundcube puis essayer de s'envoyer un email.
 |
Consulter le journal système pour savoir ce qu'il se passe: journalctl -f |
Erreurs
maildir access problem for UID/GID=5000/5000
maildir access problem for UID/GID=5000/5000:
create maildir file /xxx/vmail/xxx@xxx.xx/tmp/xxx.xxx.xxx:
Permission denied
L'utilisateur technique (vmail) ne correspond pas aux id (5000) définis dans le fichier de configuration de postfix /etc/postfix/main.cf
pam_unix(dovecot:auth): check pass; user unknown
/etc/dovecot/conf.d/10-auth.conf
|
!include auth-sql.conf.ext
|
Roundcube se déconnecte après chaque action et se reconnecte à chaque nouvelle action.
Pour éviter se comportement et garder la connexion ouverte il faut utiliser imap proxy
Roundcube: Erreur SMTP (250) : échec lors de l'authentification
/var/log/roundcubemail/errors
|
ERROR: SMTP server does not support authentication ()
SMTP Error: Authentication failure: SMTP server does not support authentication (Code: ) in /usr/share/webapps/roundcubemail/program/lib/Roundcube/rcube.php on line 1648
|
/etc/webapps/roundcubemail/config/config.inc.php
|
$config['smtp_pass'] = '%p';
|
Roudcube: 504 Gateway timeout
Augmenter le délai d'attente
/etc/nginx/nginx.conf
|
location ~ \.php$ {
try_files $uri =404;
include uwsgi_params;
uwsgi_modifier1 14;
uwsgi_pass unix:/run/uwsgi/roundcubemail.sock;
uwsgi_read_timeout 120s;
uwsgi_send_timeout 120s;
}
|
NOQUEUE: reject: RCPT from domain.fr: 554 5.7.1 <user@externalmail.fr>: Relay access denied
NOQUEUE: reject: RCPT from domain.fr: 554 5.7.1 <user@externalmail.fr>: Relay access denied;
from=<user@domain.fr> to=<user@externalmail.fr> proto=ESMTP helo=<nextcloud.domain.fr>
Problèmes avec Gmail
Our system has detected that this message likely unsolicited mail
Message d'erreur provenant de Gmail lors de l'envoie d'un email vers une adresse Gmail.
host gmail-smtp-in.l.google.com[173.194.67.26] said:
Our system has detected that this message is likely unsolicited mail.
To reduce the amount of spam sent to Gmail, this message has been blocked.
- Créer un champs SPF.
- Configurer le reverse DNS (sur la Freebox)
Message d'erreur provenant de Gmail lors de l'envoie d'un email vers une adresse Gmail.
The IP you're using to send mail is not authorized to send email directly to our servers.
Please use the SMTP relay at your service provider instead.
Faire passer les emails envoyés par le relais SMTP du FAI, qui lui est autoriser à envoyer des emails à Gmail.
/etc/postfix/main.cf
|
relayhost = smtp.free.fr:25
|
Message d'erreur provenant du header d'un email reçu par Gmail.
Received-SPF: softfail
(google.com: domain of transitioning compte@mon-domaine.fr does not designate x.x.x.x as permitted sender)
client-ip=x.x.x.x;
L'IP x.x.x.x ne correspond pas au champs SPF définit dans le DNS.
Ceci peut être causé par l'utilisation d'un relais SMTP alors que la configuration du champs SPF n'a pas été remise à jour.
« y.y.y.y » représente l'IP du serveur
« 212.27.42.0/24 » représente les IPs des serveurs SMTP de free
.mon-domaine.fr SPF v=spf1 a mx ip4:y.y.y.y ip4:212.27.42.0/24 ip6:2a01:e0c:1:1599::0/112 ~all
 |
Configurer aussi les IPv6 au besoin |
Received-SPF: permerror
Message d'erreur provenant du header d'un email reçu par Gmail.
Received-SPF: permerror
(google.com: permanent error in processing during lookup of compte@mon-domaine.fr)
client-ip=x:x:x:x::x;
Le champs SPF contient une erreur, par exemple l'include n'est pas valide.