sendmail.cf 주요 설정 방법은 무엇인가요?
💡 요약 정리
- MaxMessageSize: 메일 발송 용량 제한 (바이트 단위)
- MaxRecipientsPerMessage: 동시 발송 가능한 수신자 수 제한
- QueueDirectory: 메일 큐 디렉토리 경로 지정
- QueueLA/RefuseLA: 시스템 로드에 따른 메일 처리 제어
- Timeout.queuereturn/queuewarn: 메일 큐 보관 및 경고 시간 설정
- Mlocal 설정: 메일 수신 용량 제한
개요
sendmail.cf는 sendmail 메일 서버의 핵심 설정 파일입니다.
파일 위치
/etc/mail/sendmail.cf
설정 수정 방법
주의: sendmail.cf는 직접 수정하지 않고 sendmail.mc 파일을 수정한 후 m4로 생성하는 것이 권장됩니다.
권장 방법:
# sendmail.mc 편집
vi /etc/mail/sendmail.mc
# sendmail.cf 생성
m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf
# sendmail 재시작
service sendmail restart
직접 수정 (권장하지 않음):
vi /etc/mail/sendmail.cf
service sendmail restart
1. 메일 발송 용량 제한
설정
# maximum message size
O MaxMessageSize=10240000
설명
- 단위: 바이트 (bytes)
- 예제 값: 10240000 (10MB)
- 기본값: 0 (제한 없음)
용량 계산
| 설정값 | 용량 |
|---|---|
| 1048576 | 1 MB |
| 10485760 | 10 MB |
| 52428800 | 50 MB |
| 104857600 | 100 MB |
예제
5MB 제한:
O MaxMessageSize=5242880
무제한 (기본값):
O MaxMessageSize=0
효과
- 설정 용량을 초과하는 메일 발송 차단
- 발신자에게 "Message is too large" 오류 반환
- 대용량 첨부 파일 발송 방지
2. 동시 발송 가능 수 제한
설정
# maximum number of recipients per SMTP envelope
O MaxRecipientsPerMessage=20
설명
- 의미: 한 번에 발송할 수 있는 최대 수신자 수
- 예제 값: 20명
- 기본값: 0 (제한 없음)
예제
10명으로 제한:
O MaxRecipientsPerMessage=10
무제한 (기본값):
O MaxRecipientsPerMessage=0
효과
- 대량 메일 발송 제한
- 스팸 메일 발송 방지
- 서버 부하 감소
발송 시나리오
100명에게 메일 발송 시 (제한=20):
- 1차: 20명에게 발송
- 2차: 20명에게 발송
- 3차: 20명에게 발송
- 4차: 20명에게 발송
- 5차: 20명에게 발송
총 5번의 발송으로 나뉘어 처리됩니다.
3. 메일 큐 디렉토리 경로
설정
# queue directory
O QueueDirectory=/var/spool/mqueue
설명
- 경로: 메일 큐가 저장되는 디렉토리
- 기본값:
/var/spool/mqueue
메일 큐란?
발송 대기 중이거나 실패한 메일이 임시로 저장되는 공간:
- 수신자 서버가 응답하지 않을 때
- 일시적인 네트워크 오류 발생 시
- 시스템 로드가 높아 발송을 지연할 때
큐 확인 명령어
# 메일 큐 목록 확인
mailq
# 또는
sendmail -bp
# 큐 디렉토리 직접 확인
ls -l /var/spool/mqueue
예제 출력
/var/spool/mqueue (3 requests)
-----Q-ID----- --Size-- -----Q-Time----- ------------Sender/Recipient-----------
tABCD123456* 1234 Nov 17 10:30 <sender@example.com>
<recipient@domain.com>
큐 삭제
# 모든 메일 큐 삭제 (주의!)
rm -f /var/spool/mqueue/*
# 특정 메일만 삭제
rm -f /var/spool/mqueue/tABCD123456*
4. 메일 큐 저장 레벨 지정
설정
# load average at which we just queue messages
O QueueLA=8
설명
- 의미: 시스템 로드 평균이 이 값 이상이면 메일을 큐에 보관
- 예제 값: 8
- 기본값: 8
로드 평균 (Load Average)
시스템 부하를 나타내는 지표:
# 현재 로드 평균 확인
uptime
# 출력 예
16:40:12 up 10 days, 3:25, 2 users, load average: 0.50, 0.75, 1.00
^^^^ ^^^^ ^^^^
1분 5분 15분
동작 방식
| 로드 평균 | 동작 |
|---|---|
| < 8.0 | 메일 즉시 발송 시도 |
| ≥ 8.0 | 메일을 큐에 보관, 나중에 발송 |
예제
로드 4 이상에서 큐 보관:
O QueueLA=4
항상 즉시 발송 (권장하지 않음):
O QueueLA=100
5. 시스템 로드에 따른 자동 중지
설정
# load average at which we refuse connections
O RefuseLA=12
설명
- 의미: 시스템 로드 평균이 이 값 이상이면 SMTP 연결 거부
- 예제 값: 12
- 기본값: 12
동작 방식
| 로드 평균 | 동작 |
|---|---|
| < 8.0 | 메일 즉시 발송 |
| 8.0 ~ 11.9 | 메일 큐에 보관 |
| ≥ 12.0 | SMTP 연결 거부 (서비스 거부) |
예제
로드 16 이상에서 연결 거부:
O RefuseLA=16
권장 설정
O QueueLA=8 # 로드 8 이상에서 큐 보관
O RefuseLA=12 # 로드 12 이상에서 연결 거부
이유:
- QueueLA < RefuseLA 로 설정
- 점진적인 부하 대응
6. 메일 큐 보관 기간
설정
# Timeout of queue return
O Timeout.queuereturn=5d
설명
- 의미: 발송 실패 메일을 큐에 보관하는 최대 기간
- 예제 값: 5d (5일)
- 기본값: 5d
시간 단위
| 단위 | 설명 | 예제 |
|---|---|---|
| s | 초 (seconds) | 3600s = 1시간 |
| m | 분 (minutes) | 60m = 1시간 |
| h | 시간 (hours) | 24h = 1일 |
| d | 일 (days) | 7d = 1주일 |
| w | 주 (weeks) | 2w = 2주 |
동작 방식
- 메일 발송 실패
- 큐에 보관하고 주기적으로 재시도
- 5일 동안 계속 실패하면 발신자에게 반송 (bounce)
예제
3일로 설정:
O Timeout.queuereturn=3d
12시간으로 설정:
O Timeout.queuereturn=12h
7. 경고 메일 발송 시간
설정
# Timeout of queue warning
O Timeout.queuewarn=4h
설명
- 의미: 발송 지연 시 발신자에게 경고 메일을 보내는 시간
- 예제 값: 4h (4시간)
- 기본값: 4h
동작 방식
- 메일 발송 실패
- 4시간 동안 계속 실패
- 발신자에게 "Delivery delayed" 경고 메일 발송
- 계속 재시도
- queuereturn 시간까지 실패 시 최종 반송
예제 경고 메일
Subject: Warning: could not send message for past 4 hours
The original message was received at Fri, 17 Nov 2025 10:00:00 +0900
from sender@example.com
----- The following addresses had transient non-fatal errors -----
<recipient@domain.com>
(transient failure during SMTP conversation)
----- Transcript of session follows -----
... while talking to mail.domain.com.:
>>> RCPT To:<recipient@domain.com>
<<< 450 4.2.1 <recipient@domain.com>: Recipient address rejected: Greylisted
예제
1시간으로 설정:
O Timeout.queuewarn=1h
경고 메일 비활성화:
O Timeout.queuewarn=0
8. 메일 수신 용량 제한
설정
##################################################
### Local and Program Mailer specification ###
##################################################
Mlocal, P=/usr/bin/procmail, F=lsDFMAw5:/|@qSPfhn9, S=10/30,
R=20/40, M=10240000, T=DNS/RFC822/X-Unix, A=procmail -Y -a $h -d $u
설명
- M=10240000: 최대 수신 용량 10MB로 제한
- 위치:
Mlocal섹션,T=DNS/RFC822/X-Unix앞에 추가
수정 전
Mlocal, P=/usr/bin/procmail, F=lsDFMAw5:/|@qSPfhn9, S=10/30,
R=20/40, T=DNS/RFC822/X-Unix, A=procmail -Y -a $h -d $u
수정 후
Mlocal, P=/usr/bin/procmail, F=lsDFMAw5:/|@qSPfhn9, S=10/30,
R=20/40, M=10240000, T=DNS/RFC822/X-Unix, A=procmail -Y -a $h -d $u
^^^^^^^^^^^
예제
50MB 제한:
M=52428800
무제한:
M=0
또는 M 파라미터를 아예 제거
9. 설정 적용 및 확인
설정 파일 백업
# 백업 생성 (타임스탬프 포함)
cp /etc/mail/sendmail.cf /etc/mail/sendmail.cf.$(date +%Y%m%d_%H%M%S)
설정 수정
vi /etc/mail/sendmail.cf
# 또는 권장 방법
vi /etc/mail/sendmail.mc
m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf
문법 검사
# sendmail 설정 테스트 모드
sendmail -d0.1 -bt < /dev/null
# 오류가 없으면 정상
서비스 재시작
# CentOS/RHEL 6 이하
service sendmail restart
# CentOS/RHEL 7 이상
systemctl restart sendmail
# 상태 확인
service sendmail status
설정 값 확인
# 현재 설정 확인
sendmail -d0.1 -bt <<EOF
=S
\$j
\$=w
EOF
# MaxMessageSize 확인
grep "MaxMessageSize" /etc/mail/sendmail.cf
# QueueDirectory 확인
grep "QueueDirectory" /etc/mail/sendmail.cf
10. 권장 설정 예
일반적인 메일 서버
# 발송 용량: 10MB
O MaxMessageSize=10485760
# 동시 발송 수신자: 50명
O MaxRecipientsPerMessage=50
# 로드 8 이상에서 큐 보관
O QueueLA=8
# 로드 12 이상에서 연결 거부
O RefuseLA=12
# 메일 큐 보관: 5일
O Timeout.queuereturn=5d
# 경고 메일: 4시간
O Timeout.queuewarn=4h
# 수신 용량: 10MB
Mlocal, ... M=10485760, ...
대용량 메일 허용 서버
# 발송 용량: 50MB
O MaxMessageSize=52428800
# 동시 발송 수신자: 100명
O MaxRecipientsPerMessage=100
# 로드 12 이상에서 큐 보관
O QueueLA=12
# 로드 16 이상에서 연결 거부
O RefuseLA=16
# 메일 큐 보관: 7일
O Timeout.queuereturn=7d
# 경고 메일: 2시간
O Timeout.queuewarn=2h
# 수신 용량: 50MB
Mlocal, ... M=52428800, ...
스팸 방지 중심 설정
# 발송 용량: 5MB
O MaxMessageSize=5242880
# 동시 발송 수신자: 10명 (스팸 방지)
O MaxRecipientsPerMessage=10
# 로드 6 이상에서 큐 보관
O QueueLA=6
# 로드 10 이상에서 연결 거부
O RefuseLA=10
# 메일 큐 보관: 3일
O Timeout.queuereturn=3d
# 경고 메일: 1시간
O Timeout.queuewarn=1h
# 수신 용량: 5MB
Mlocal, ... M=5242880, ...
11. 문제 해결
설정 변경 후 메일 발송 안 됨
원인:
- 설정 파일 문법 오류
- sendmail 재시작 안 됨
해결:
# sendmail 로그 확인
tail -f /var/log/maillog
# 설정 테스트
sendmail -d0.1 -bt < /dev/null
# 재시작
service sendmail restart
"Message is too large" 오류
원인:
- MaxMessageSize 설정 초과
해결:
# 현재 설정 확인
grep "MaxMessageSize" /etc/mail/sendmail.cf
# 필요 시 값 증가
O MaxMessageSize=20971520 # 20MB
메일 큐에 계속 쌓임
원인:
- QueueLA 값이 너무 낮음
- 수신 서버 응답 없음
해결:
# 로드 평균 확인
uptime
# QueueLA 값 조정
O QueueLA=12
# 또는 큐 강제 발송
sendmail -q
경고 메일이 너무 많이 옴
원인:
- Timeout.queuewarn 값이 너무 짧음
해결:
# 경고 시간 늘리기
O Timeout.queuewarn=12h
# 또는 비활성화
O Timeout.queuewarn=0
12. 관련 명령어
메일 큐 관리
# 메일 큐 목록
mailq
# 큐 강제 발송
sendmail -q
# 특정 메일 발송
sendmail -qItABCD123456
# 큐 전체 삭제 (주의!)
rm -f /var/spool/mqueue/*
로그 확인
# 실시간 로그
tail -f /var/log/maillog
# 특정 메일 ID 검색
grep "tABCD123456" /var/log/maillog
# 오늘 발송 실패 메일
grep "$(date +%b\ %d)" /var/log/maillog | grep "stat=Deferred"
sendmail 테스트
# SMTP 테스트
telnet localhost 25
EHLO localhost
MAIL FROM: test@example.com
RCPT TO: recipient@domain.com
DATA
Subject: Test
This is a test email.
.
QUIT
# 또는 간단히
echo "Test" | mail -s "Test Subject" recipient@domain.com
참고사항
- sendmail.cf는 직접 수정하지 않고 sendmail.mc를 수정 후 m4로 생성하는 것이 권장됩니다.
- 설정 변경 후 반드시 백업하고 sendmail을 재시작하세요.
- MaxMessageSize와 Mlocal의 M 값을 동일하게 설정하는 것이 좋습니다.
- QueueLA는 RefuseLA보다 낮은 값으로 설정하세요.
- 프로덕션 환경에서는 먼저 테스트 서버에서 검증하세요.
- 대용량 메일 허용 시 디스크 용량과 네트워크 대역폭을 고려하세요.
- 최신 환경에서는 sendmail 대신 Postfix나 Exim 사용을 권장합니다.
- 메일 큐가 계속 쌓이면 수신 서버 문제 또는 스팸 차단을 의심하세요.