15.4. 메일 전송 에이전트
Red Hat Enterprise Linux에는 기본 MDA로 Procmail
이 포함되어 있습니다. 두 애플리케이션 모두 LDA로 간주되며 MTA의 스풀 파일에서 사용자의 메일로 이메일을 이동합니다. 그러나 Procmail은 강력한 필터링 시스템을 제공합니다.
이 섹션은 Procmail에 대해서만 자세히 설명되어 있습니다. mail
명령에 대한 자세한 내용은 man 페이지(man mail
)를 참조하십시오.
procmail은 localhost의 메일 스풀 파일에 배치된 이메일을 제공하고 필터링합니다. 시스템 리소스에 대한 강력하고 견고하며 널리 사용됩니다. procmail은 이메일 클라이언트 애플리케이션에서 읽을 수 있는 이메일을 전달하는 데 중요한 역할을 할 수 있습니다.
procmail은 여러 가지 방법으로 호출될 수 있습니다. MTA가 이메일을 스풀 파일에 배치할 때마다 Procmail이 시작됩니다. 그런 다음 procmail은 MUA에 대한 이메일을 필터링하고 파일을 종료합니다. 대안적으로, MUA는 메시지가 올바른 보고로 이동되도록 메시지를 수신할 때마다 Procmail을 실행하도록 구성될 수 있다. 기본적으로 /etc/procmailrc
또는 사용자 홈 디렉토리에 있는 ~/.procmailrc
파일(또는 rc 파일라고도 함)이 MTA가 새 메시지를 수신할 때마다 Procmail을 호출합니다.
기본적으로 /etc
디렉터리에 시스템 전체 rc
파일이 없으며 사용자의 홈 디렉터리에 .procmailrc
파일이 존재하지 않습니다. 따라서 Procmail을 사용하려면 각 사용자가 특정 환경 변수 및 규칙을 사용하여 .procmailrc
파일을 구성해야 합니다.
Procmail이 이메일 메시지에 따라 작동하는지 여부는 메시지가 rc
파일의 지정된 조건 또는 레시피 와 일치하는지 여부에 따라 달라집니다. 메시지가 레시피와 일치하면 이메일이 지정된 파일에 배치되거나 삭제되거나 처리되지 않습니다.
Procmail이 시작되면 이메일 메시지를 읽고 헤더 정보에서 본문을 구분합니다. 다음으로 Procmail은 /etc/procmailrc
s/ 디렉토리에서 시스템 전체의 기본 환경 변수 및 레시피를 위해 /etc/procmail
디렉터리에서 /etc/procmailrcs/ 파일을 찾습니다. 그런 다음 procmail은 사용자의 홈 디렉터리에서 rc
s/.procmailrc
파일을 검색합니다. 많은 사용자가 홈 디렉터리의 .procmailrc
파일 내에서 참조되는 Procmail에 대한 추가 rc
파일을 생성합니다.
15.4.1. procmail 구성
Procmail 구성 파일에는 중요한 환경 변수가 포함되어 있습니다. 이러한 변수는 정렬할 메시지와 레시피와 일치하지 않는 메시지와 함께 수행할 메시지와 같은 작업을 지정합니다.
이러한 환경 변수는 일반적으로 다음 형식으로 ~/.procmailrc
파일의 시작 부분에 표시됩니다.
env-variable="value"
이 예제에서 env- Variables는
변수의 이름이고 value
는 변수를 정의합니다.
대부분의 Procmail 사용자가 사용하지 않는 환경 변수가 많이 있으며 더 중요한 환경 변수 중 다수는 이미 기본값으로 정의되어 있습니다. 대부분의 경우 다음 변수가 사용됩니다.
DEFAULT
- 레시피와 일치하지 않는 메시지가 배치되는 기본 사서함을 설정합니다.기본
DEFAULT
값은$ORGMAIL
과 동일합니다.INCLUDERC
- 확인할 메시지에 대한 더 많은 레시피가 포함된 추가rc
파일을 지정합니다. 이렇게 하면 Procmail 레시피 목록을 스팸 차단 및 이메일 목록 차단과 같은 다른 역할을 수행하는 개별 파일로 분리한 다음 사용자의~/.procmailrc
파일에서 주석 문자를 사용하거나 사용할 수 있습니다.예를 들어 사용자의
~/.procmailrc
파일의 행은 다음과 같습니다.MAILDIR=$HOME/Msgs INCLUDERC=$MAILDIR/lists.rc INCLUDERC=$MAILDIR/spam.rc
이메일 목록의 Procmail 필터링을 해제하려면 스팸 제어를 그대로 두려면 해시 기호
(#
)를 사용하여 첫 번째INCLUDERC
라인을 주석 처리합니다. 현재 디렉터리를 기준으로 경로를 사용합니다.-
LOCKSLEEP
- 특정 잠금 파일을 사용하도록 Procmail의 시도 사이에 시간(초)을 설정합니다. 기본값은 8초입니다. -
LOCKTIMEOUT
- Procmail이 잠금 파일이 오래되었다고 가정하고 삭제할 수 있다고 가정하기 전에 잠금 파일이 마지막으로 수정된 후 경과해야 하는 시간(초)을 설정합니다. 기본값은 1024초입니다. -
LOGFILE
- Procmail 정보 또는 오류 메시지가 기록되는 파일입니다. -
MAILDIR
- Procmail에 대한 현재 작업 디렉터리를 설정합니다. 설정하는 경우 다른 모든 Procmail 경로는 이 디렉터리에 상대적입니다. 기본
또는 레시피 필요한 위치에 있을 수 없는 경우 메시지를 배치할 수 없는 경우 원래의 메일 메시지 또는 다른 위치를 지정합니다.G
maIL - Specifies the original mailbox, or another place to put the messages if they cannot be placed in the default or recipe-required location.기본적으로
/var/spool/mail/$LOGNAME
값이 사용됩니다.-
SUSPEND
- 스왑 공간과 같은 필요한 리소스를 사용할 수 없는 경우 해당 Procmail이 일시 중지되는 시간(초)을 설정합니다. -
SWITCHRC
- 사용자가 추가 Procmail 레시피가 포함된 외부 파일을 지정할 수 있습니다.INCLUDERC
옵션과 마찬가지로 레시피 검사는 참조 구성 파일에서 실제로 중지되고SWITCHRC
-specified 파일의 레시피만 사용됩니다. -
VERBOSE
- Procmail을 사용하여 자세한 정보를 기록합니다. 이 옵션은 디버깅에 유용합니다.
다른 중요한 환경 변수는 쉘(예: LOGNAME
, 로그인 이름, 홈 디렉터리의 위치, 기본 쉘)과 같은 쉘에서 가져옵니다.
모든 환경 변수와 해당 기본값에 대한 포괄적인 설명은 procmailrc
매뉴얼 페이지에서 확인할 수 있습니다.
15.4.2. procmail Recipes
새로운 사용자는 종종 Procmail을 사용하는 학습의 가장 어려운 부분을 레시피 작성을 찾습니다. 이 어려움이 종종 문자열 일치에 대한 자격을 지정하는 데 사용되는 정규 표현식 을 사용하여 메시지와 일치하는 레시피에 특성이 있습니다. 그러나 정규식을 구성하는 것은 쉽지 않으며 읽을 때 이해하기가 덜 어렵습니다. 또한 정규 표현식에 관계없이 Procmail 레시피를 작성하는 방법의 일관성을 통해 예제를 쉽게 배울 수 있습니다. Procmail 레시피 예제를 보려면 15.4.2.5절. “레시피의 예” 를 참조하십시오.
procmail 레시피는 다음과 같은 형식을 취합니다.
:0 flags : lockfile-name * condition_1_special-condition-character condition_1_regular_expression * condition_2_special-condition-character condition-2_regular_expression * condition_N_special-condition-character condition-N_regular_expression special-action-character action-to-perform
Procmail 레시피의 처음 두 문자는 콜론과 0입니다. 다양한 플래그를 0 뒤에 배치하여 Procmail이 레시피를 처리하는 방법을 제어할 수 있습니다. flags
섹션 뒤의 콜론은 이 메시지에 대해 lockfile이 생성되었음을 지정합니다. lockfile이 생성되는 경우 lockfile-name
을 대체하여 이름을 지정할 수 있습니다.
레시피에는 메시지와 일치하는 여러 조건이 포함될 수 있습니다. 조건이 없는 경우 모든 메시지는 레시피와 일치합니다. 정규 표현식은 메시지 일치를 용이하게 하기 위해 일부 조건에 배치됩니다. 여러 조건을 사용하는 경우 작업을 수행하기 위해 모두 일치해야 합니다. 레시피의 첫 번째 줄에 설정된 플래그를 기반으로 조건을 확인합니다. 별표 문자(*
) 뒤에 배치된 선택적 특수 문자는 조건을 추가로 제어할 수 있습니다.
action-to-perform
인수는 메시지가 조건 중 하나와 일치할 때 수행되는 작업을 지정합니다. 레시피마다 하나의 동작만 있을 수 있습니다. 대부분의 경우 메일 메일의 이름은 여기에 해당 파일로 일치하는 메시지를 직접 지정하여 이메일을 효과적으로 정렬하는 데 사용됩니다. 작업을 지정하기 전에 특수 작업 문자를 사용할 수도 있습니다. 자세한 내용은 15.4.2.4절. “특별 조건 및 작업”를 참조하십시오.
15.4.2.1. vs 제공. 제공되지 않음 Recipes
레시피가 특정 메시지와 일치하는 경우 사용되는 작업은 전달 또는 탐색 이외의 레시피로 간주되는지 여부를 결정합니다. 전달 레시피에는 메시지를 파일에 쓰거나, 메시지를 다른 프로그램에 전송하거나, 메시지를 다른 이메일 주소로 전달하는 작업이 포함됩니다. 위임되지 않은 레시피는 중첩 블록과 같은 다른 모든 작업을 다룹니다. 중첩 블록은 레시피의 조건과 일치하는 메시지에 수행되는 중괄호 {
}
에 포함된 일련의 작업입니다. 블록 중첩은 서로 중첩될 수 있으므로 메시지에 대한 작업을 식별하고 수행하기 위한 더 큰 제어 기능을 제공합니다.
메시지가 전달 레시피와 일치하면 Procmail은 지정된 작업을 수행하고 메시지를 다른 레시피와 비교하는 것을 중지합니다. 위임되지 않은 레시피와 일치하는 메시지는 다른 레시피와 계속 비교됩니다.
15.4.2.2. 플래그
플래그는 레시피의 조건을 메시지와 비교하는 방법을 결정하는 데 필요합니다. egrep 유틸리티는 조건과 일치하도록 내부적으로 사용됩니다. 다음 플래그가 일반적으로 사용됩니다.
-
A
- 이 레시피는A
또는 플래그 없이 이전 레시피가 이 메시지와도 일치하는 경우에만 사용되도록 지정합니다. -
A - 이 레시피는
A
또는 플래그의 이전 레시피가 이 메시지와 일치하고 성공적으로 완료된 경우에만 사용되도록 지정합니다. -
B
- 메시지 본문을 구문 분석하고 일치하는 조건을 찾습니다. -
b
- 파일에 메시지 작성 또는 전달과 같은 결과 동작에서 본문을 사용합니다. 이는 기본 동작입니다. -
C
- 이메일의 이산화탄소 사본을 생성합니다. 이 기능은 필요한 작업을 메시지에서 수행할 수 있고 메시지 사본이rc
파일에서 계속 처리될 수 있으므로 레시피를 전달하는 데 유용합니다. -
D
- Egrep비교
대/소문자를 구분합니다. 기본적으로 비교 프로세스는 대/소문자를 구분하지 않습니다. -
e -
A
플래그와 유사하지만 레시피의 조건은E
다른
동작과 비교됩니다. -
E - 즉시 이전 레시피에 지정된 작업이 실패한 경우에만 메시지와 비교됩니다.
-
f
- 파이프를 필터로 사용합니다. -
H
- 메시지의 헤더를 구문 분석하고 일치하는 조건을 찾습니다. 이는 기본 동작입니다. -
h
- 결과 작업에서 헤더를 사용합니다. 이는 기본 동작입니다. -
W
- Tells Procmail 지정된 필터 또는 프로그램이 완료될 때까지 기다렸다가 필터링 된 메시지를 고려하기 전에 성공했는지 여부를 보고합니다. -
W
- "Program failure" 메시지가 억제된다는 점을 제외하고는w
와 동일합니다.
추가 플래그의 자세한 목록은 procmailrc
매뉴얼 페이지를 참조하십시오.
15.4.2.3. 로컬 잠금 파일 지정
Lockfiles는 하나 이상의 프로세스가 동시에 메시지를 변경하지 않도록 하기 위해 Procmail에 매우 유용합니다. 레시피의 첫 번째 줄에 플래그 뒤에 콜론(:
)을 배치하여 로컬 잠금 파일을 지정합니다. 그러면 대상 파일 이름과 LOCKEXT
글로벌 환경 변수에 설정된 모든 항목에 따라 로컬 잠금 파일이 생성됩니다.
또는 콜론 뒤에 이 레시피와 함께 사용할 로컬 잠금 파일의 이름을 지정합니다.
15.4.2.4. 특별 조건 및 작업
Procmail 레시피 조건 및 조치 이전에 사용된 특수 문자는 해석 방식을 변경합니다.
다음 문자는 레시피의 조건 줄 시작 부분에 별표 문자(*
) 뒤에 사용할 수 있습니다.
-
!
- 조건 줄에서 이 문자는 조건을 반전하여 조건이 메시지와 일치하지 않는 경우에만 일치됩니다. -
지정된 수
의
바이트 수를 확인합니다.Checks whether the message is under a specified number of bytes. -
메시지가 지정된 바이트 수를 초과하는
지
확인합니다.Checks if the message is over a specified number of bytes.
특수 작업을 수행하는 데 사용되는 문자는 다음과 같습니다.
-
!
- 작업 라인에서 이 문자는 Procmail에 메시지를 지정된 이메일 주소로 전달하도록 지시합니다. -
$
-rc
파일의 앞부분에 설정된 변수를 나타냅니다. 이는 종종 다양한 레시피에서 참조할 수 있는 공통 메일박스를 설정하는 데 사용됩니다. -
|
- 메시지를 처리하기 위해 지정된 프로그램을 시작합니다. -
{
및}
- 일치하는 메시지에 적용할 추가 레시피를 포함하는 데 사용되는 중첩 블록을 구성합니다.
작업 행 시작 시 특수 문자가 사용되지 않는 경우 Procmail은 작업 줄에서 메시지를 쓸 수 있는 메일박스를 지정한다고 가정합니다.
15.4.2.5. 레시피의 예
procmail은 매우 유연한 프로그램이지만, 이러한 유연성으로 인해 처음부터 Procmail 레시피를 합성하는 것은 새로운 사용자에게 어려울 수 있습니다.
Procmail 레시피 조건을 구축하는 기술을 개발하는 가장 좋은 방법은 다른 사람이 빌드한 많은 예제를 보는 것과 함께 정규 표현식에 대한 강력한 이해에서 비롯됩니다. 정규 표현식에 대한 자세한 설명은 이 섹션의 범위를 벗어납니다. Procmail 레시피 및 유용한 샘플 Procmail 레시피의 구조는 인터넷의 다양한 위치에서 찾을 수 있습니다. 정규 표현식의 적절한 사용 및 조정은 이러한 레시피 예제를 보면 파생될 수 있습니다. 또한 기본 정규 표현식 규칙에 대한 소개 정보는 grep(1)
도움말 페이지에서 확인할 수 있습니다.
다음 간단한 예제에서는 Procmail 레시피의 기본 구조를 보여주고 더 복잡한 구조를 위한 기반을 제공할 수 있습니다.
기본 레시피는 다음 예와 같이 조건을 포함하지 않을 수도 있습니다.
:0: new-mail.spool
첫 번째 줄은 로컬 잠금 파일을 만들도록 지정하지만 이름을 지정하지 않으므로 Procmail은 대상 파일 이름을 사용하고 LOCKEXT
환경 변수에 지정된 값을 추가합니다. 조건이 지정되지 않으므로 모든 메시지가 이 레시피와 일치하며 new-mail.spool
이라는 단일 스풀 파일에 MAILDIR
환경 변수에서 지정한 디렉터리에 배치됩니다. 그러면 MUA가 이 파일의 메시지를 볼 수 있습니다.
이와 같은 기본 레시피를 모든 rc
파일의 끝에 배치하여 메시지를 기본 위치로 보낼 수 있습니다.
다음 예제는 특정 이메일 주소의 메시지를 일치시켜 버립니다.
:0 * ^From: spammer@domain.com /dev/null
이 예에서는 spammer@domain.com
에서 보낸 모든 메시지는 /dev/null
장치로 보내어 삭제합니다.
영구 삭제를 위해 /dev/null
에 메시지를 보내기 전에 규칙이 의도한 대로 작동하는지 확인하십시오. 레시피에서 의도하지 않은 메시지를 실수로 포착하고 해당 메시지가 사라진 경우 규칙 문제를 해결하기가 어려워집니다.
더 나은 해결책은 레시피의 작업을 특정 메일로 가리키는 것입니다.이 작업은 때때로 false positive를 찾는 것입니다. 메시지가 실수로 일치하지 않는 경우, 사서함을 삭제하고 메시지를 /dev/null
로 보내도록 작업을 보냅니다.
다음 레시피는 특정 메일링 리스트에서 전송된 이메일을 가져와 지정된 폴더에 배치합니다.
:0: * ^(From|Cc|To).*tux-lug tuxlug
tux-lug@domain.com
메일링 리스트에서 전송된 모든 메시지는 MUA에 대해 tuxlug
mailbox에 자동으로 배치됩니다. 이 예제의 조건은 From
,Cc
또는 To
행에 메일링 목록의 이메일 주소가 있는 경우 메시지와 일치합니다.
자세한 내용과 강력한 레시피는 15.7절. “추가 리소스” 에서 제공되는 많은 Procmail 온라인 리소스를 참조하십시오.
15.4.2.6. 스팸 필터
새 이메일을 수신하면 Sendmail, Postfix 및 Fetchmail이 호출되므로 Procmail은 스팸을 경감하기 위한 강력한 도구로 사용할 수 있습니다.
이는 Procmail이 SpamAssassin과 함께 사용되는 경우 특히 그러합니다. 함께 사용하면 이 두 애플리케이션은 스팸 이메일을 신속하게 식별하고 정렬하거나 삭제할 수 있습니다.
SpamAssassin은 헤더 분석, 텍스트 분석, 블랙리스트, 스팸 추적 데이터베이스, 자체 learn Bayesian 스팸 분석을 사용하여 빠르고 정확하게 스팸을 식별하고 태그를 지정합니다.
SpamAssassin 을 사용하려면 먼저 root
로 를 실행하여 시스템에 spam assin 패키지가 설치되어 있는지 확인하십시오.
~]# yum install spamassassin
YUM을 사용하여 패키지 설치에 대한 자세한 내용은 9.2.4절. “패키지 설치” 을 참조하십시오.
로컬 사용자가 SpamAssassin을 사용하는 가장 쉬운 방법은 ~/.procmailrc
파일 맨 위에 다음 행을 배치하는 것입니다.
INCLUDERC=/etc/mail/spamassassin/spamassassin-default.rc
/etc/mail/spamassin/spamassin-default.rc
에는 들어오는 모든 이메일에 대해 SpamAssassin을 활성화하는 간단한 Procmail 규칙이 포함되어 있습니다. 이메일이 스팸으로 결정되면 헤더에 태그되고 제목은 다음 패턴 앞에 추가됩니다.
*****SPAM*****
이메일의 메시지 본문도 스팸으로 진단될 수 있는 요소에 대해 실행 중인 것으로 시작됩니다.
스팸으로 태그된 이메일의 경우 다음과 유사한 규칙을 사용할 수 있습니다.
:0 Hw * ^X-Spam-Status: Yes spam
이 규칙은 헤더에 스팸으로 태그된 모든 이메일을 스팸이라고 하는 메일 메일에 저장합니다
.
SpamAssassin은 Perl 스크립트이므로 사용 중인 서버에서 바이너리 SpamAssassin 데몬(spamd
) 및 클라이언트 애플리케이션(spamc)을 사용해야 할 수 있습니다. 그러나 이러한 방식으로 SpamAssassin을 구성하려면 호스트에 root
액세스가 필요합니다.
스팸 데몬을
시작하려면 다음 명령을 입력합니다.
~]# systemctl start spamassassin
시스템이 부팅될 때 SpamAssassin 데몬을 시작하려면 다음을 실행합니다.
systemctl enable spamassassin.service
서비스 시작 및 중지에 대한 자세한 내용은 10장. systemd를 사용하여 서비스 관리 을 참조하십시오.
Perl 스크립트 대신 SpamAssassin 클라이언트 애플리케이션을 사용하도록 Procmail을 구성하려면 ~/.procmailrc
파일 맨 위에 다음 행을 배치합니다. 시스템 전체 구성의 경우 /etc/procmailrc
에 배치합니다.
INCLUDERC=/etc/mail/spamassassin/spamassassin-spamc.rc