# [postfix] Relay access denied (résolu)

## digimag

Bonjour,

Je viens de passer un week-end entier à essayer de faire fonctionner mon smtp. N'étant pas familier avec Postfix, j'ai suivi le guide.

Quelqu'un qui a compris le fonctionnement de Postfix pourrait-il expliquer quelles sont exactement les variables qui déterminent si oui ou non :

 L'envoi depuis le serveur sera autorisé au client (queued).

 Le serveur transmettra effectivement le e-mail du client après l'avoir mis dans la file d'attente.

 Le mail reçu depuis un autre serveur SMTP sera accepté stocké sur la machine.

 Le mail reçu depuis un autre serveur SMTP sera renvoyé à une autre machine (relay).

Tout ceci m'a l'air bien confus. Par exemple je sais pas si le 1 et le 4 sont équivalents : un serveur qui veut m'envoyer un message sur mon serveur se connecte et effectue les mêmes commandes que le client qui veut envoyer du courrier à une autre machine ?

Je ne veux pas vous encombrer avec tous les logs et tous les paramètres, mais par exemple en ce moment, bien que je puisse envoyer du courrier à d'autres serveurs avec SMTP AUTH PLAIN sans SSL (c'est ok car j'ai Squirrel Mail en local, et le serveur web a SSL), je ne reçois pas de messages sur ma boîte e-mail.

Par exemple, je vais m'envoyer un e-mail sur alex -Chez- lilt.li depuis mon compte gmail digimag -Chez- gmail.com :

 *syslog-ng wrote:*   

> Sep  8 18:04:36 lilt postfix/postfix-script[21665]: refreshing the Postfix mail system
> 
> Sep  8 18:04:36 lilt postfix/master[20816]: reload configuration /etc/postfix
> 
> [...]
> ...

 

Je ne comprends pas ce qui se passe. Pourriez-vous m'éclairer, quels paramètres font que le courrier est rejeté ?

En vous remerciant d'avance,

Alex.

----------

## guilc

Ca veut dire que postfix ne se considère pas comme le nœud terminal pour le domaine litl.li. Donc il considère qu'il doit relayer. Mais il n'a pas le droit de relayer. Donc mail rejeté.

Que donne "postconf mydestination virtual_mailbox_domains" ?

----------

## digimag

 *guilc wrote:*   

> Ca veut dire que postfix ne se considère pas comme le nœud terminal pour le domaine litl.li. Donc il considère qu'il doit relayer. Mais il n'a pas le droit de relayer. Donc mail rejeté.
> 
> Que donne "postconf mydestination virtual_mailbox_domains" ?

 

```
# postconf mydestination virtual_mailbox_domains

mydestination = $myhostname, localhost

virtual_mailbox_domains = $virtual_mailbox_maps

```

Pourtant le domaine lilt.li est bien présent dans mes tables MySQL. La preuve, SMTP AUTH fonctionne pour envoyer du courrier et j'arrive très bien à m'y connecter en IMAP.

```
mysql> SELECT * FROM users WHERE email="alex -Chez- lilt.li";

+----+--------------+--------+------+------+------+--------------+-----------------------------------+-------+---------+

| id | email        | clear  | name | uid  | gid  | homedir      | maildir                           | quota | postfix |

+----+--------------+--------+------+------+------+--------------+-----------------------------------+-------+---------+

|  2 | alex -Chez- lilt.li | XXXXXX | Alex | 1003 | 1006 | /home/vmail/ | /home/vmail/lilt.li/alex/Maildir/ |       | y       | 

+----+--------------+--------+------+------+------+--------------+-----------------------------------+-------+---------+

1 row in set (0.00 sec)
```

```
mysql> SELECT * FROM transport;

+----+-------------------+-------------+

| id | domain            | destination |

+----+-------------------+-------------+

|  1 | xn--phnix-csa.net | local:      | 

|  2 | lilt.li           | virtual:    | 

+----+-------------------+-------------+

2 rows in set (0.01 sec)
```

----------

## guilc

Bah dans ce cas, c'est ton virtual_mailbox_domains qui est mal configuré.

Il devrait ressembler à "virtual_mailbox_domains = mysql:/etc/postfix/nom_fichier" ou quelque chose dans le genre, et le "nom_fichier" contenant le nécessaire pour faire la requête dans ta base (select domain from transport where domain='%s' :Wink: 

Et "postconf virtual_mailbox_maps" ??

----------

## digimag

```
# postconf virtual_mailbox_maps

virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual-maps.cf
```

```
# cat /etc/postfix/mysql-virtual-maps.cf 

user            = mailsql

password        = CACHÉ

dbname          = mailsql

table           = users

select_field    = maildir

where_field     = email

additional_conditions = and postfix = 'y'

hosts           = unix:/var/run/mysqld/mysqld.sock
```

Ce qui est bizarre, c'est que dans le doc le fichier mysql-transport.cf est créé mais n'est mentionné nulle part dans la conf postfix.

----------

## guilc

Ca pourrait presque marcher.

Mais le problème c'est que virtual_mailbox_domains fait une recherche sur un domaine alors que là, ta recherche porte sur une adresse mail.

L'enjeu de virtual_mailbox_domains est de retourner quelque chose (quoi on s'en tape un peu, le résultat n'est pas utilisé) lorsqu'on cherche le domaine.

Donc je te suggère ceci :

```
virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual-domains.cf
```

```
# cat /etc/postfix/mysql-virtual-domains.cf

user            = mailsql

password        = CACHÉ

dbname          = mailsql

table           = transport

select_field    = domain

where_field     = domain

hosts           = unix:/var/run/mysqld/mysqld.sock
```

Cela devrait fonctionner !

Quant à ton mysql-transport.cf, il doit sans doute servir pour la variable virtual_transport. Je ne connais pas ta conf, mais je suppose qu'il doit servir à sélectionner le transport de livraison du mail de manière dynamique  :Wink: 

----------

## digimag

guilc, merci, t'es le meilleur je t'aime !  :Very Happy: 

J'ai créé le fichier /etc/postfix/mysql-domains.cfavec 

```
user            = mailsql 

password        = CACHÉ 

dbname          = mailsql 

table           = transport 

select_field    = domain 

where_field     = domain 

hosts           = unix:/var/run/mysqld/mysqld.sock
```

Et dans /etc/postfix/main.cf j'ai rajouté :

```
virtual_mailbox_domains = mysql:/etc/postfix/mysql-domains.cf
```

Et je suis très heureux, ça fonctionne enfin.

P.S. Dans la doc il y a un passage concernant le contenu de main.cf pas très clair : *Quote:*   

> virtual_transport = virtual
> 
> (Les domaines listés par les mydestination ne doivent pas être listés
> 
> dans les paramètres virtual_mailbox_domains)
> ...

 Ne sachant pas quoi mettre, j'ai rien mis dedans, je pensais que ça devait être automatique avec MySQL. Maintenant, ça l'est.

Toute à l'heure j'ai voulu soumettre l'idée aux auteurs, Ken Nowack et Ezra Gorman, mais leurs adresses mail sont invalides.

----------

## guilc

Oui il faut bien le spécifier. La valeur par défaut n'est pas correcte dans ton cas.

Tel que suggéré dans ta doc, il faut rentrer la liste des domaines à la mano.

Tu peux aussi utiliser une liste des domaines dans un fichier (virtual_mailbox_domains = /etc/postfix/domains.cf, un domaine par ligne)

Tu peux aussi utiliser une table de hash (virtual_mailbox_domains = hash:/etc/postfix/domains.cf)

Mais c'est clair que si comme toi tu as tout dans mysql, autant l'utiliser pour ça aussi, ça évite de copier la liste des domaines à plusieurs endroits  :Wink: 

----------

## man in the hill

 *digimag wrote:*   

> Ce qui est bizarre, c'est que dans le doc le fichier mysql-transport.cf est créé mais n'est mentionné nulle part dans la conf postfix.

 

Cest vrai que la partie conf de postfix avec les tables est un peu space dans la doc ! Si tu veux utiliser la table transport, il faut rajouter:

```

transport_maps = mysql:/etc/postfix/mysql-transport.cf

virtual_transport = $transport_maps

```

Merci guilc et digimag car ce topic m'a aidé !

@ +

----------

