본문으로 건너뛰기

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 (제한 없음)

용량 계산

설정값용량
10485761 MB
1048576010 MB
5242880050 MB
104857600100 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. 1차: 20명에게 발송
  2. 2차: 20명에게 발송
  3. 3차: 20명에게 발송
  4. 4차: 20명에게 발송
  5. 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.0SMTP 연결 거부 (서비스 거부)

예제

로드 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주

동작 방식

  1. 메일 발송 실패
  2. 큐에 보관하고 주기적으로 재시도
  3. 5일 동안 계속 실패하면 발신자에게 반송 (bounce)

예제

3일로 설정:

O Timeout.queuereturn=3d

12시간으로 설정:

O Timeout.queuereturn=12h

7. 경고 메일 발송 시간

설정

# Timeout of queue warning
O Timeout.queuewarn=4h

설명

  • 의미: 발송 지연 시 발신자에게 경고 메일을 보내는 시간
  • 예제 값: 4h (4시간)
  • 기본값: 4h

동작 방식

  1. 메일 발송 실패
  2. 4시간 동안 계속 실패
  3. 발신자에게 "Delivery delayed" 경고 메일 발송
  4. 계속 재시도
  5. 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 대신 PostfixExim 사용을 권장합니다.
  • 메일 큐가 계속 쌓이면 수신 서버 문제 또는 스팸 차단을 의심하세요.