## fichier principal de configuration de Postfix
## commentaires de Gregory Colpart reg AT evolix DOT fr
## version 1.0 : 1ere version publique (05.04.2010)

########################
# Section : Emplacements
########################

# Repertoire ou se trouvent les commandes de postfix [OBLIGATOIRE]
#par defaut, = $program_directory
command_directory = /usr/sbin

# Repertoire ou se trouvent les demons de postfix [OBLIGATOIRE]
#par defaut, = $program_directory
daemon_directory = /usr/lib/postfix/sbin

# Variable pour indiquer les emplacements des commandes et demons de postfix
#program_directory = /usr/lib/postfix

# Repertoire contenant les fichiers de boites aux lettres
#par defaut, = /var/mail
#mail_spool_directory =

# Repertoire de la file d'attente de postfix
#par defaut, = /var/spool/postfix
#queue_directory =

# Boites aux lettres
#par defaut, =
home_mailbox = Maildir/

# Transmettre les mails a un MDA
#par defaut, =
#mailbox_command = /usr/bin/procmail

# Separateur entre noms d'utilisateur et extensions d'adresse
# mettre + pour integration avec amavis
#par defaut, =
recipient_delimiter = +

# Controle si le repertoire existe (souvent pour les systemes de fichiers montes)
#par defaut, = no
#require_home_directory =

# Commande pour transmettre le courrier a un MDA
#par defaut, =
#mailbox_command = /usr/bin/procmail

# Banniere SMTP affichee
#par default, = $myhostname ESMTP $mail_name
smtpd_banner = $myhostname ESMTP mail server

# Groupe des commandes set-gid ayant des acces en ecriture
#par defaut, = postdrop
# setgid_group = postdrop

# Produire des "biff notifications" aux utilisateurs pour
# prevenir de l'arrivee de nouveaux mails
# par default, = yes
#biff = no


####################
# Section : domaines
####################

# Indique le nom d'hote pleinement qualifie ou se trouve postfix [OBLIGATOIRE]
#par defaut, = [retour de la commande Unix hostname]
myhostname = {{ ansible_fqdn }}

# Variable indiquant le domaine dans lequel se trouve la machine
#par defaut, = [partie domain de la variable $myhostname]
#mydomain =

# Liste des noms de domaine (ou IP) consideres comme local
#par defaut, = $myhostname, localhost.$mydomain, localhost
mydestination = $myhostname localhost localhost.localdomain localhost.$mydomain

# Indique le domaine apparaissant dans le courrier envoye
#par defaut, = $myhostname
myorigin = {{ ansible_fqdn }}

# Liste de domaine fonctionnant UNIQUEMENT avec des alias virtuels
#par defaut, = $virtual_alias_maps
#virtual_alias_domains = [ domaines avec alias virtuels ]

# Liste de domaine fonctionnant avec des comptes virtuels
#par defaut, = $virtual_mailbox_maps
virtual_mailbox_domains = ldap:$config_directory/virtual_domains.cf

# Repertoire de base de l'espace de stockage
#par defaut, =
virtual_mailbox_base = /

# Ajoute $mydomain aux adresse ne compoirtant que la partie hote sans le domaine
#par defaut, = yes
#append_dot_mydomain = no

# Ajoute $myorigin aux adresses ne comportant pas de composante de domaine
#par defaut, = yes
#append_at_myorigin = no

# Liste de domaines cachant des sous-domaines internes
#par defaut, =
#masquerade_domains =

# A l'exception de certains comptes :
#par defaut, =
#masquerade_exceptions = root, admin

# Champs d'application de la reecriture des sous-domaines caches
#par defaut, = envelope_sender, header_sender, header_recipient
#masquerade_classes =

# Sites eligibles pour un vidage rapide (postqueue -s [domain.tld])
#par defaut, = $relay_domains
#fast_flush_domains =

# Interfaces sur lesquelles ecoutent postfix
#par defaut, = all
#inet_interfaces = all

# Envois seulement en IPv4
inet_protocols = ipv4

# Adresse IP externe du firewall/proxy si derriere NAT ou proxy
# evite principalement les boucles si MX secondaire et MX primaire indisponible
#par defaut, =
#proxy_interfaces = [adresse IP]

# Domaines acceptes pour faire relai (MX 2aire)
#relay_domains = [domaine a relayer]


###########################
# Section : base de donnees
###########################

# Liste des bases de donnees utilisees par l'agent de distribution locale
# Pour regenerer une base de donnees : postalias /etc/aliases (par ex)
#par defaut, = hash:/etc/aliases, nis:mail.aliases
alias_maps = hash:/etc/aliases

# Liste des bases de donnees locales 
# Pour regenerer avec newaliases
#par defaut, = hash:/etc/aliases
alias_database = hash:/etc/aliases

# Chemin vers la commande newaliases
#par defaut, = /usr/bin/newaliases
#newaliases_path =

# Base de donnes d'alias virtuels
# ne pas oublier : postmap /etc/postfix/virtual
#par defaut, = $virtual_maps
virtual_alias_maps = hash:$config_directory/virtual, ldap:$config_directory/virtual_aliases.cf

# Base de donners des boites virtuelles
# ne pas oublier : postmap /etc/postfix/vmailbox
#par defaut, = 
virtual_mailbox_maps = ldap:$config_directory/virtual_mailboxes.cf

virtual_uid_maps = static:5000
virtual_gid_maps = static:5000
virtual_transport = dovecot
dovecot_destination_recipient_limit = 1

# Reecriture des adresses
#par defaut, =
#canonical_maps = hash:/etc/postfix/canonical

# Reecriture des adresses a l'arrivee (ecrase $canonical_maps)
#par defaut, =
#recipient_canonical_maps = hash:/etc/postfix/canonical

# Reecriture des adresses au depart
#par defaut, =
#sender_canonical_maps = hash:/etc/postfix/canonical

# Adresses changees
#relocated_maps = hash:/etc/postfix/relocated

# Boite pour receptionner tous les utilisateurs inconnus
#luser_relay = spam

# Liste de base de donnees contenant les adresses locales permettant de rejeter les messages aux utilisateurs inconnus
# (sera nulle pour recuperer les courriels vers les utilisateurs inconnus)
#par defaut, = proxy:unix:passwd.byname $alias_maps
#local_recipient_maps =

# MAILING-LIST nommee xx
# dans le fichier /etc/aliases :
# xx: user1@domain1 user2@domain2 etc.
# owner-xx: admin@domain
# Utiliser ou non l'alias xx-owner comme adresse d'enveloppe d'expedition
#par defaut, = yes
#owner_request_special = 

# Utiliser l'adresse relle de l'admin au lieu de xx-owner
#par defaut, = no
#expand_owner_alias =


###########################################
# Section : parametres de la file d'attente
###########################################

# Lorsqu'un message n'a pas ete delivre, Postfix adjoint une marque indiquant le moment ou la prochaine tentaive pourra avoir lieu

# Delai au-dela duquel les messages non delivres seront renvoyes a l'expediteur
#par defaut, = 5d
#maximal_queue_lifetime = 

# Delai au-dela duquel les *bounces* non delivres ne seront plus envoyes
#par defaut, = 5d
bounce_queue_lifetime = 1d

# Intervalle de temps ou postfix examinera la file 
# Il examine notamment la file deferred pour voir si de NOUVEAUX messages sont arrives
# Il faut aussi que la marque indique qu'ils soient prets
#par defaut, = 1000s
#queue_run_delay = 

# A chaque echec, le delai de la prochaine distribution double, avec les restrictions suivantes :
# Delai minimal
#par defaut, = 1000s
#minimal_backoff_time = 
# Delai maximal
#par defaut, = 4000s
#maximal_backoff_time =

# Si maxproc est vide (master.cf), nombre maximal est :
#par defaut, = 100
#default_process_limit = 

# Nombre maximal de destinataires stockes en memoire par qmgr pour un transport particulier
#par defaut, = 10000
#default_recipient_limit =

# Nombre limitant de messages envoyes simultanement INITIALEMENT pour une destination particuliere
# (forcement majoree par maxproc du master.cf ou $default_process_limit)
#par defaut, = 5
#initial_destination_concurrency =

# Une fois ces messages distribues, si il reste des messages dans la file d'attente pour cette destination
# particuliere, postfix augmente le nombre de tentative tant qu'il ne detecte pas de probleme avec
# la destination, avec la limite suivante :
#par defaut, = 20
#default_destination_concurrency_limit = 

# Cette limite peut etre differente selon le type de transport utilise :
#par defaut, = $default_destination_concurrency_limit
#lmtp_destination_concurrency_limit = 
#par defaut, = 2
#local_destination_concurrency_limit = 
#par defaut, = $default_destination_concurrency_limit
#relay_destination_concurrency_limit = 
#par defaut, = $default_destination_concurrency_limit
#smtp_destination_concurrency_limit = 
#par defaut, = $default_destination_concurrency_limit
#virtual_destination_concurrency_limit = 

# On peut aussi limiter le nombre maximum de destinataire pour un meme message
# Si le nombre de destinataire depasse la limite, postfix divise en groupe d'adresses plus petites et envoie des copies distinctes du message
#par defaut, =  10000
#default_destination_recipient_limit =
#par defaut, = $default_destination_recipient_limit
#lmtp_destination_recipient_limit = 
#par defaut, = 1
#local_destination_recipient_limit = 
#par defaut, = 20000
#qmgr_message_recipient_limit = 
#par defaut, = $default_destination_recipient_limit
#relay_destination_recipient_limit = 
#par defaut, = $default_destination_recipient_limit
#smtp_destination_recipient_limit = 
#par defaut, = 1000
#smtpd_recipient_limit = 
#par defaut, = $default_destination_recipient_limit
#virtual_destination_recipient_limit =

# Nombre maximum de destinataires pour un transport lorsque priorite superieure de transport
#par defaut, = 1000
#default_extra_recipient_limit = 

slow_destination_rate_delay = 0
slow_destination_concurrency_limit = 1
slow_destination_recipient_limit = 25
slow_destination_concurrency_failed_cohort_limit = 100

# Types d'incidents a rapporter
# resource : message non delivre pour probleme de ressource
# software : message non delivre pour probleme de logiciels 
# policy   : envoie le transcription smtp d'un message rejete par restrictions
# protocol : envoie toute transcription smtp erronee
# delay    : envoie les entetes de messages differes
# bounce   : envoie les entetes de tous les message renvoyes
# 2bounce  : envoie les entetes de tous les messages renvoyes non delivres
#par defaut, = resource, software
#notify_classes = resource, software

# A qui les reporter ?
#Pour delay
#par defaut, = postmaster
delay_notice_recipient = delay
#Pour policy, protocol, resource, software
#par defaut, = postmaster
error_notice_recipient = error
#Pour bounce
#par defaut, = postmaster
bounce_notice_recipient = bounce
#Pour 2bounce
#par defaut, = postmaster
2bounce_notice_recipient = bounce


########################
# Section : restrictions
########################

# Restrictions au depart de la conversation 
#par defaut, = 
smtpd_client_restrictions =
    permit_mynetworks,
    permit_sasl_authenticated,
    cidr:$config_directory/spamd.cidr,

# Restrictions au niveau de la commande HELO/EHLO
#par defaut, = 
smtpd_helo_restrictions =
    reject_invalid_hostname

# Restrictions au niveau de la commande MAIL FROM
#par defaut, = 
smtpd_sender_restrictions =
    permit_mynetworks,
    check_sender_access hash:$config_directory/sa-blacklist.access

# Restrictions au niveau de la commande MAIL FROM
#par defaut, = permit_mynetworks, reject_unauth_destination
smtpd_recipient_restrictions =
    permit_mynetworks,
    permit_sasl_authenticated,
    reject_unauth_destination,
    check_policy_service unix:private/policyd-spf,
    check_client_access hash:$config_directory/client.access_local,
    check_client_access hash:$config_directory/client.access,
    check_sender_access hash:$config_directory/sender.access_local,
    check_sender_access hash:$config_directory/sender.access,
    check_recipient_access hash:$config_directory/recipient.access_local,
    check_recipient_access hash:$config_directory/recipient.access,
    reject_unlisted_recipient,
    reject_unknown_sender_domain,
    reject_non_fqdn_sender,
    reject_unauth_pipelining,

policyd-spf_time_limit = 3600

header_checks =
    regexp:$config_directory/header_kill_local,
    regexp:$config_directory/header_kill

transport_maps = hash:$config_directory/transport

# Attendre la commande 'RCPT TO' avant d'evaluer les restrictions ?
# (peut poser pb avec certains clients et permet d'avoir renseignements suppl)
#par defaut, = yes
#smtpd_delay_reject = 

# Definition des plages IP appartenant a mynetworks
#par defaut, toutes les plages d'adresses IPv4 (et IPv6) des interfaces
mynetworks = 127.0.0.0/8,[::1]/128,10.0.0.0/16

# Exiger la commande HELO/EHLO
#par defaut, = no
smtpd_helo_required = yes

# Exiger syntaxe conforme dans les commandes MAIL FROM ou RCPT TO
#par defaut, = no
strict_rfc821_envelopes = yes

# Rejeter le courrier provenant d'une adresse inexistante ?
#par defaut, = no
#smtpd_reject_unlisted_sender =

# Rejeter le courrier a destination d'une adresse inexistante ?
#par defaut, = yes
#smtpd_reject_unlisted_recipient =

smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination

#######################
# Section : Chiffrement
#######################

smtpd_tls_security_level = may
smtpd_tls_mandatory_protocols=!SSLv2,!SSLv3
smtpd_tls_protocols=!SSLv2,!SSLv3
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtpd_tls_loglevel = 1
smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key

smtp_tls_security_level = may
smtp_tls_mandatory_protocols=!SSLv2,!SSLv3
smtp_tls_protocols=!SSLv2,!SSLv3
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
smtp_tls_loglevel = 1

# SASL
smtpd_sasl_auth_enable = yes
broken_sasl_auth_clients = yes
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth-client

# Amavis
content_filter = smtp-amavis:[127.0.0.1]:10024
smtp-amavis_destination_concurrency_failed_cohort_limit = 0
smtp-amavis_destination_concurrency_negative_feedback = 0
smtp-amavis_destination_concurrency_limit = 2

# OpenDKIM
smtpd_milters = inet:[127.0.0.1]:8891
non_smtpd_milters = inet:[127.0.0.1]:8891

{% if postfix_slow_transport_include == True %}
# Slow transports configuration
minimal_backoff_time = 15m
maximal_backoff_time = 6h
maximal_queue_lifetime = 4d
queue_run_delay = 100s
bounce_queue_lifetime = 1d
initial_destination_concurrency = 5
default_destination_concurrency_limit = 20
slow_destination_rate_delay = 0
slow_destination_concurrency_limit = 1
slow_destination_concurrency_failed_cohort_limit = 100
slow_destination_recipient_limit = 25
transport_maps = hash:$config_directory/transport
{% endif %}

