애플리케이션(JavaMail / Camel mail 컴포넌트) 이 메일을 보낼 때 554 5.7.1 ... Client host rejected: Access denied 가 SMTPTransport.rcptTo() 스택트레이스와 함께 떨어졌다. 이것이 네트워크 문제인지 서버 정책인지 판단하고 메일 담당자에게 무엇을 요청해야 하는지 정리한다.
TCP 연결과 SMTP 세션은 정상적으로 맺어졌고 서버가 애플리케이션 레벨에서 거부한 것이다. 554 는 SMTP 응답 코드이므로 소켓 연결·핸드셰이크·EHLO 까지 성공했다는 뜻이고, 방화벽이나 라우팅 문제였다면 ConnectException 이나 SocketTimeoutException 이 났을 것이다. 스택트레이스가 rcptTo() 에서 났으므로 MAIL FROM 까지 지나고 RCPT TO 단계에서 거절당했다. JavaMail 이 붙이는 Invalid Addresses 는 주소 형식 오류가 아니라 RCPT TO 실패를 무조건 감싸는 문구다.
Recipient address rejected 가 아니라 Client host rejected 라는 점이 핵심이다. Postfix 의 smtpd_client_restrictions(또는 relay 정책) 에 걸린 것으로, 수신자 주소 문제가 아니라 보내는 쪽 서버가 릴레이 권한이 없다는 뜻이다. Postfix 는 기본값 smtpd_delay_reject = yes 라서 클라이언트 단계 거부를 RCPT TO 시점까지 미뤄 통보하므로 rcptTo 에서 터진 것처럼 보인다.
흔한 원인은 순서대로 다음과 같다.
mynetworks / 릴레이 허용 목록에 없음 — 서버 증설·이전·IP 변경 후 가장 흔하다.reject_unknown_client_hostname 정책.애플리케이션 서버에서 직접 세션을 열어 같은 554 가 나오면 코드 문제가 아니라 메일 게이트웨이 정책 문제다.
telnet <mail-gateway> 25
EHLO myapp.internal
MAIL FROM:<sender@example.com>
RCPT TO:<recipient@example.com>
메일 담당자에게 문의할 때는 "메일이 안 간다" 가 아니라 거부 주체가 그쪽 서버라는 점, 발생 시각, 출발지 IP(NAT 를 거치면 메일 서버가 보는 IP), 원문 응답 코드 네 가지를 적어 보내면 /var/log/maillog 에서 어떤 restriction 에 걸렸는지 바로 확인할 수 있다. 원인을 릴레이 허용 문제로 특정했다면 출발지 IP 의 릴레이 허용 등록을 요청하고, 판단을 넘길 때는 로그 확인부터 부탁한다.