
Contexto
Mi docker-compose --version
es 2.13.0
He creado un reproductor enhttps://github.com/Losmoges/postfix-dovecot-lmtp-reproducer
Mi versión de prueba tiene tres servicios acoplables en el archivo de redacción: postfix, dovecot y client. Comparten una red a través del controlador del puente.
- Postfix está configurado para reenviar correos electrónicos entrantes a Dovecot a través de la
virtual_transport = lmtp:dovecot:24
configuración en main.cf. - Dovecot está configurado para recibir conexiones a través de la configuración
service lmtp
// en la configuración de dovecot.conf.inet_listener lmtp
port = 24
- Puedo enviar un correo electrónico a través de Postfix ejecutándolo en el contenedor del cliente. Su msmtp está configurado para conectarse a través de un archivo de configuración.
echo test | msmtp [email protected]
host postfix
msmtprc
Esto produce el siguiente resultado en la cola de Postfix, que puedo inspeccionar ejecutándolo postqueue -p
en el contenedor de Postfix.
Error
-Queue ID- --Size-- ----Arrival Time---- -Sender/Recipient-------
DEC4F3DCBE 245 Fri Dec 16 19:41:17 [email protected]
(Host or domain name not found. Name service error for name=dovecot type=A: Host not found, try again)
[email protected]
Solución alterna
Cuando encuentro la dirección IP del contenedor Dovecot docker inspect
y la ingreso en la configuración de Postfix, por ejemplo como virtual_transport = lmtp:172.18.0.4:24
, todo funciona como se esperaba. En este caso, el comando postqueue -p
da Mail queue is empty
(después de enviar un correo electrónico a través de msmtp)
Preguntas
¿Por qué virtual_transport = lmtp:dovecot:24
no funciona? ¿Configuré mal algo? Cualquier forma de búsqueda de nombres, como nslookup dovecot
(después de instalar dnsutils) en el contenedor Postfix, funciona bien y devuelve la dirección IP del contenedor Dovecot. ¿Postfix realiza su propia resolución de nombres de dominio por separado? Si es así, ¿cómo puedo obligarlo a utilizar la resolución de nombre de dominio predeterminada?
Editar: Solución en respuesta
Agregué la siguiente línea al Dockerfile para la imagen de Postfix
RUN sed -i'' -e 's/^lmtp .*/lmtp unix - - n - - lmtp/g' /etc/postfix/master.cf
Respuesta1
¿Por qué virtual_transport = lmtp:dovecot:24 no funciona?
En su master.cf
, ha lmtp
configurado para ejecutarse en un chroot
entorno:
# ==========================================================================
# service type private unpriv chroot wakeup maxproc command + args
# (yes) (yes) (no) (never) (100)
lmtp unix - - n - - lmtp
El chroot
entorno no tiene acceso al contenedor /etc/resolv.conf
, por lo que no sabe cómo resolver los nombres de host. La configuración lmtp se ejecuta de forma predeterminada en un entorno chroot porque una configuración típica utiliza sockets Unix para comunicarse, por lo que la resolución del nombre de host no es un problema.
La solución más sencilla es configurarla lmtp
para que no se ejecute en chroot
el entorno:
lmtp unix - - y - - lmtp
Con este cambio el correo se entrega correctamente:
postfix_1 | Dec 16 21:47:15 8d74be7a5951 postfix/smtpd[598]: connect from unknown[172.28.0.1]
postfix_1 | Dec 16 21:47:15 8d74be7a5951 postfix/smtpd[598]: 9131638672DA: client=unknown[172.28.0.1]
postfix_1 | Dec 16 21:47:15 8d74be7a5951 postfix/qmgr[582]: 9131638672DA: from=<[email protected]>, size=434, nrcpt=1 (queue active)
postfix_1 | Dec 16 21:47:15 8d74be7a5951 postfix/smtpd[598]: disconnect from unknown[172.28.0.1] ehlo=1 mail=1 rcpt=1 data=1 quit=1 commands=5
dovecot_1 | Dec 16 21:47:15 lmtp(16): Info: Connect from 172.28.0.3
dovecot_1 | Dec 16 21:47:15 lmtp([email protected])<16><+A19J2PnnGMQAAAAqj6rOA>: Info: msgid=<20221216164715.079491@rocket>: saved mail to INBOX
postfix_1 | Dec 16 21:47:15 8d74be7a5951 postfix/lmtp[597]: 9131638672DA: to=<[email protected]>, relay=dovecot[172.28.0.2]:24, delay=0.09, delays=0.07/0/0/0.01, dsn=2.0.0, status=sent (250 2.0.0 <[email protected]> +A19J2PnnGMQAAAAqj6rOA Saved)
dovecot_1 | Dec 16 21:47:15 lmtp(16): Info: Disconnect from 172.28.0.3: Logged out (state=READY)
postfix_1 | Dec 16 21:47:15 8d74be7a5951 postfix/qmgr[582]: 9131638672DA: removed
Una alternativa sería configurar un socket Unix compartido entre los contenedores dovecot
y postfix
y usarlo para la comunicación en lugar de una conexión inet.
Una segunda alternativa sería ejecutar el contenedor lmtp en el mismo espacio de nombres de red que el contenedor postfix, en cuyo caso podría usar más fácilmente el nombre de host localhost
.