
문맥
내 docker-compose --version
버전은 2.13.0입니다.
나는 다음에서 재생산을 만들었습니다.https://github.com/Losmoges/postfix-dovecot-lmtp-reproducer
내 평가판에는 작성 파일에 postfix, dovecot 및 client라는 세 가지 도커 서비스가 있습니다. 그들은 브리지 드라이버를 통해 네트워크를 공유합니다.
virtual_transport = lmtp:dovecot:24
Postfix는 main.cf 구성의 설정을 통해 들어오는 이메일을 dovecot으로 전달하도록 구성됩니다 .- Dovecot은 dovecot.conf 구성의
service lmtp
// 설정inet_listener lmtp
을 통해 연결을 수신하도록 구성됩니다 .port = 24
- 클라이언트 컨테이너에서 실행하여 Postfix를 통해 이메일을 보낼 수 있습니다 . 해당 msmtp는 구성 파일을 통해 연결하도록 구성됩니다 .
echo test | msmtp [email protected]
host postfix
msmtprc
postqueue -p
그러면 Postfix 컨테이너에서 실행하여 검사할 수 있는 Postfix 대기열에 다음과 같은 결과가 나타납니다 .
오류
-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]
해결 방법
Dovecot 컨테이너의 IP 주소를 찾아 docker inspect
Postfix 구성에 입력하면(예: virtual_transport = lmtp:172.18.0.4:24
) 모든 것이 예상대로 작동합니다. 이 경우 명령은 postqueue -p
다음과 같습니다 Mail queue is empty
(msmtp를 통해 이메일을 보낸 후).
질문
왜 virtual_transport = lmtp:dovecot:24
작동하지 않습니까? 내가 뭔가 잘못 구성했나요? Postfix 컨테이너에서 (dnsutils 설치 후) 와 같은 모든 형태의 이름 조회는 nslookup dovecot
잘 작동하며 Dovecot 컨테이너의 IP 주소를 반환합니다. Postfix는 자체적으로 별도의 도메인 이름 확인을 수행합니까? 그렇다면 기본 도메인 이름 확인을 사용하도록 하려면 어떻게 해야 합니까?
편집 : 답변의 솔루션
Postfix 이미지의 Dockerfile에 다음 줄을 추가했습니다.
RUN sed -i'' -e 's/^lmtp .*/lmtp unix - - n - - lmtp/g' /etc/postfix/master.cf
답변1
virtual_transport = lmtp:dovecot:24가 작동하지 않는 이유는 무엇입니까?
에서는 다음 환경 에서 실행되도록 구성 master.cf
했습니다 .lmtp
chroot
# ==========================================================================
# service type private unpriv chroot wakeup maxproc command + args
# (yes) (yes) (no) (never) (100)
lmtp unix - - n - - lmtp
환경 chroot
은 컨테이너의 에 대한 액세스 권한이 없으므로 /etc/resolv.conf
호스트 이름을 확인하는 방법을 모릅니다. lmtp 구성은 기본적으로 chroot 환경에서 실행됩니다. 일반적인 구성에서는 Unix 소켓을 사용하여 통신하므로 호스트 이름 확인은 문제가 되지 않습니다.
가장 간단한 수정은 환경 lmtp
에서 실행되지 않도록 구성하는 것입니다 chroot
.
lmtp unix - - y - - lmtp
이 변경으로 인해 메일이 올바르게 배달됩니다.
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
한 가지 대안은 컨테이너 dovecot
와 postfix
컨테이너 사이에 공유 Unix 소켓을 구성하고 이를 inet 연결 대신 통신에 사용하는 것입니다.
두 번째 대안은 postfix 컨테이너와 동일한 네트워크 네임스페이스에서 lmtp 컨테이너를 실행하는 것입니다. 이 경우 호스트 이름을 더 간단하게 사용할 수 있습니다 localhost
.