Sun Java System Messaging Server 6 2005Q4 관리 설명서

11장 다시 쓰기 규칙 구성

이 장에서는 imta.cnf 파일에서 다시 쓰기 규칙을 구성하는 방법에 대해 설명합니다. 10 장, MTA 서비스 및 구성 정보를 아직 읽지 않은 경우 이 장을 읽기 전에 10장을 읽어 보십시오.

이 장은 다음 내용으로 구성되어 있습니다.

Messaging Server의 주소 다시 쓰기 기능은 주소의 호스트 또는 도메인 부분을 조작 및 변경하기 위한 기본 기능입니다. Messaging Server는 별칭, 주소 역방향 데이터베이스 및 특수한 매핑 테이블과 같은 주소 조작을 위한 다른 기능을 제공합니다. 그러나 최상의 성능을 위해서는 주소 조작을 수행할 수 있을 때마다 다시 쓰기 규칙을 사용하는 것이 좋습니다.

시작하기 전에

imta.cnf 파일의 다시 쓰기 규칙을 변경하면 시작 시에 구성 데이터를 한 번만 로드하는 모든 프로그램이나 채널(예: SMTP 서버)을 imsimta restart 명령을 사용하여 다시 시작해야 합니다. 컴파일된 구성을 사용하는 경우 재컴파일을 수행한 다음 다시 시작해야 합니다.

구성 정보 컴파일과 프로그램 시작에 대한 자세한 내용은 Sun Java System Messaging Server 6 2005Q4 Administration Reference를 참조하십시오.

다시 쓰기 규칙 구조

다시 쓰기 규칙은 MTA 구성 파일 imta.cnf의 상반부에 표시됩니다. 구성 파일의 각 규칙은 하나의 행으로 나타납니다. 규칙 사이에 주석이 올 수 있지만 빈 행은 허용되지 않습니다. 다시 쓰기 규칙은 빈 행으로 끝나며 그 뒤에 채널 정의가 옵니다. 아래 예는 구성 파일의 다시 쓰기 규칙 섹션을 보여 줍니다.


! test.cnf - An example configuration file.
!
! This is only an example of a configuration file. It serves
! no useful purpose and should not be used in a real system.
!
a.com   $U@a-host
b.org   $U@b-host
c.edu   $U%c@b-daemon
d.com   $U%d@a-daemon

! Begin channel definitions

다시 쓰기 규칙은 패턴과 그 뒤에 오는 등가 문자열 또는 템플리트로 구성됩니다. 두 부분을 공백으로 구분해야 하며 각 부분 내에서는 공백이 허용되지 않습니다. 다시 쓰기 규칙의 구조는 다음과 같습니다.


pattern template

pattern

도메인 이름에서 검색할 문자열을 나타냅니다. 표 11–3에서 패턴은 a.com, b.org , c.edud.com입니다.

패턴이 주소의 도메인 부분과 일치할 경우 다시 쓰기 규칙이 주소에 적용됩니다. 패턴과 템플리트 사이를 공백으로 구분해야 합니다. 패턴 구문에 대한 자세한 내용은 다시 쓰기 규칙 패턴 및 태그를 참조하십시오.

template

다음 중 하나입니다.

UserTemplate%DomainTemplate@ChannelTag[controls]
UserTemplate@ChannelTag[controls]
UserTemplate%DomainTemplate[controls]
UserTemplate@DomainTemplate@ChannelTag[controls]
UserTemplate@DomainTemplate@SourceRoute@ChannelTag[controls]

여기서

UserTemplate는 주소의 사용자 부분이 다시 작성되는 방법을 지정합니다. 대체 시퀀스를 사용하여 원래 주소의 일부나 데이터베이스 조회의 결과를 나타낼 수 있습니다. 대체 시퀀스는 다시 작성된 주소를 생성하기 위해 자신이 나타내는 대상으로 대체됩니다. 표 11–4에서는 $U 대체 시퀀스가 사용됩니다. 자세한 내용은 템플리트 대체 및 다시 쓰기 규칙 제어 시퀀스 를 참조하십시오.

DomainTemplate는 주소의 도메인 부분이 다시 작성되는 방법을 지정합니다. UserTemplate와 마찬가지로 DomainTemplate는 대체 시퀀스를 포함할 수 있습니다.

ChannelTag는 이 메일이 전송될 채널을 나타냅니다. (모든 채널 정의는 채널 이름뿐만 아니라 채널 태그를 포함해야 합니다. 채널 태그는 일반적으로 다시 쓰기 규칙과 채널 정의에 포함되어 있습니다.)

controls를 사용하여 규칙의 적용 가능성을 제한할 수 있습니다. 일부 제어 시퀀스는 규칙의 시작 부분에 있어야 하며 다른 제어는 규칙의 끝 부분에 있어야 합니다. 제어에 대한 자세한 내용은 템플리트 대체 및 다시 쓰기 규칙 제어 시퀀스 를 참조하십시오.

템플리트 구문에 대한 자세한 내용은 다시 쓰기 규칙 템플리트를 참조하십시오.

다시 쓰기 규칙 패턴 및 태그

이 절은 다음과 같은 하위 절로 구성되어 있습니다.

대부분의 다시 쓰기 규칙 패턴은 해당 호스트와만 일치하는 특정 호스트 이름이나 전체 하위 도메인의 모든 호스트/도메인과 일치하는 하위 도메인 패턴으로 구성됩니다.

예를 들어, 다음 다시 쓰기 규칙 패턴은 지정된 호스트와만 일치하는 특정 호스트 이름을 포함합니다.

host.siroe.com

다음 다시 쓰기 규칙 패턴은 전체 하위 도메인의 모든 호스트 또는 도메인과 일치하는 하위 도메인 패턴을 포함합니다.

.siroe.com

그러나 이 패턴은 정확한 호스트 이름 siroe.com과 일치하지 않습니다. 정확한 호스트 이름 siroe.com과 일치하려면 별개의 siroe.com 패턴이 필요합니다.

MTA는 특정 호스트 이름부터 시작한 다음 특수성을 줄이기 위해 이름을 점차적으로 일반화화여 호스트/도메인 이름의 다시 쓰기를 시도합니다. 이것은 더 특수한 다시 쓰기 규칙 패턴의 사용이 더 일반적인 다시 쓰기 규칙 패턴 사용보다 선호된다는 것을 의미합니다. 예를 들어, 다음 다시 쓰기 규칙 패턴이 구성 파일에 존재한다고 가정해 봅니다.

hosta.subnet.siroe.com
.subnet.siroe.com
.siroe.com

다시 쓰기 규칙 패턴에 기초하여 jdoe@hosta.subnet.siroe.com 주소는 hosta.subnet.siroe.com 다시 쓰기 규칙 패턴과 일치하고 jdoe@hostb.subnet.siroe.com 주소는 .subnet.siroe.com 다시 쓰기 규칙 패턴과 일치 하며 jdoe@hostc.siroe.com 주소는 .siroe.com 다시 쓰기 규칙 패턴과 일치합니다.

특히 하위 도메인 다시 쓰기 규칙 패턴을 통합하는 다시 쓰기 규칙이 인터넷상의 사이트에서 일반적으로 사용됩니다. 이러한 사이트는 일반적으로 고유한 내부 호스트와 서브넷을 위한 여러 다시 쓰기 규칙을 가지며 최상위 인터넷 도메인에 대한 다시 쓰기 규칙을 internet.rules(msg_svr_base/config/internet.rules ) 파일의 구성에 포함합니다.

특정 다시 쓰기 규칙을 통해 처리되는 내부 호스트 대상이 아니라 인터넷 대상에 대한 메일이 제대로 재작성되고 보내는 TCP/IP 채널로 라우팅되도록 imta.cnf 파일이 다음을 포함하는지 확인합니다.


!    Ascension Island
 .AC                      $U%$H$D@TCP-DAEMON
. [text
.     removed for
.             brevity]
!      Zimbabwe
 .ZW                      $U%$H$D@TCP-DAEMON

      

IP 도메인 리터럴은 비슷한 계층 일치 패턴을 따르지만 왼쪽에서 오른쪽이나 아니라 오른쪽에서 왼쪽으로 일치합니다. 예를 들어, 다음 패턴은 정확하게 IP 리터럴 [1.2.3.4]와만 일치합니다.

[1.2.3.4]

다음 패턴은 1.2.3.0 서브넷의 모든 항목과 일치합니다.

[1.2.3.]

이미 설명했던 보다 일반적인 종류의 호스트 또는 하위 도메인 다시 쓰기 규칙 패턴 외의 다시 쓰기 규칙은 표 11–1에 요약되어 있으며, 다음 하위 절에서 설명하는 여러 특수한 패턴도 사용할 수 있습니다.

표 11–1 다시 쓰기 규칙의 특수한 패턴 요약

패턴 

설명/사용 

$* 

모든 주소와 일치합니다. 이 규칙은 지정된 경우 파일에서의 위치에 상관 없이 가장 먼저 시도됩니다. 

$% 

백분율 핵 규칙입니다. A%B 형식의 모든 호스트/도메인 지정과 일치합니다. 

$! 

뱅 스타일 규칙입니다. B!A 형식의 모든 호스트/도메인 지정과 일치합니다. 

[ ] 

IP 리터럴 모두 일치 규칙입니다. 모든 IP 도메인 리터럴과 일치합니다. 

모든 호스트/도메인 지정과일치합니다(예: joe@[129.165.12.11]).

이러한 특수한 패턴 외에도 Messaging Server는 또한 다시 쓰기 규칙 패턴에 표시될 수 있는 태그의 개념을 가집니다. 이러한 태그는 주소를 여러 번 다시 쓸 수 있으며 이전 다시 쓰기에 기초하여 주소와 일치할 다시 쓰기 규칙을 제어함으로써 후속 다시 쓰기를 구별해야 하는 경우에 사용됩니다. 자세한 내용은 태그된 다시 쓰기 규칙 집합을 참조하십시오.

백분율 핵과 일치시키는 규칙

MTA는 A%B 형식의 주소를 다시 쓰려는 시도가 실패할 경우 해당 주소를 A%B@localhost 형식으로 처리하기 전에 하나의 추가 규칙을 시도합니다(이러한 주소 형식에 대한 자세한 내용은 다시 쓰기 규칙 템플리트를 참조하십시오). 이 규칙은 백분율 기호를 포함하는 로컬 부분의 다시 쓰기가 다른 방법(아래 설명된 모두 일치 규칙 포함)으로 실패할 경우에만 활성화됩니다.

백분율 핵 규칙은 특수한 내부 의미를 백분율 핵 주소에 할당하는 데 유용합니다.

뱅 스타일(UUCP) 주소와 일치시키는 규칙

MTA는 B!A 형식의 주소를 다시 쓰려는 시도가 실패할 경우 해당 주소를 B!A@localhost 형식으로 처리하기 전에 하나의 추가 규칙을 시도합니다. 이 추가 규칙은 뱅 스타일 규칙입니다. 패턴은 $!이며 절대 변경되지 않습니다. 이 규칙은 느낌표를 포함하는 로컬 부분의 다시 쓰기가 다른 방법(아래 설명된 기본 규칙 포함)으로 실패할 경우에만 활성화됩니다.

뱅 스타일 규칙은 UUCP 시스템과 라우팅에 대한 포괄적인 지식을 바탕으로 UUCP 스타일 주소를 시스템으로 라우팅하도록 강제 지정하는 데 사용할 수 있습니다.

모든 주소와 일치시키는 규칙

특수 패턴 “.” (마침표)는 다른 규칙이 일치하지 않거나 호스트/도메인 지정을 채널 테이블에서 찾을 수 없을 경우 모든 호스트/도메인 지정과 일치합니다. 즉 “.”는 주소 다시 쓰기가 다른 방법으로 실패한 경우 마지막 수단으로 사용됩니다.


주 –

대체 시퀀스와 관련하여 모두 일치 규칙이 일치하고 해당 템플리트가 확장되면 $H는 전체 호스트 이름으로 확장하고 $D는 마침표 “.”로 확장됩니다. 따라서 $D는 모두 일치 규칙 템플리트에서 제한적으로 사용됩니다.


태그된 다시 쓰기 규칙 집합

다시 쓰기 프로세스가 진행되면서 다른 규칙 집합을 적용하는 것이 적합할 수 있습니다. 이렇게 하려면 다시 쓰기 규칙 태그를 사용합니다. 현재 태그는 구성 파일 또는 도메인 데이터베이스에서 패턴이 조회되기 전에 각 패턴의 앞에 놓입니다. 다시 쓰기 규칙 템플리트의 $T 대체 문자열을 사용하여 일치하는 임의의 다시 쓰기 규칙에 의해 태그가 변경될 수 있습니다(아래에 설명됨).

태그는 다소 고정적일 수 있습니다. 즉, 설정된 태그는 단일 주소에서 추출되는 모든 호스트에 계속 적용됩니다. 이것은 임의의 태그를 사용한 후에 적절한 태그 값으로 시작하는 대체 규칙을 제공할 때 신중해야 한다는 것을 의미합니다. 일반적으로 태그는 매우 전문화된 응용 프로그램에서만 사용되므로 이것은 실제로 거의 문제가 되지 않습니다. 주소 다시 쓰기가 끝나면 태그는 기본 태그(빈 문자열)로 재설정됩니다.

기본적으로 모든 태그 값은 세로 막대(|)로 끝납니다. 이 문자는 일반 주소에서 사용되지 않으므로 패턴의 나머지 부분에서 태그를 자유롭게 나타냅니다.

다시 쓰기 규칙 템플리트

다음 절에서는 다시 쓰기 규칙의 템플리트 형식에 대해 더욱 자세하게 설명합니다. 표 11–2에는 템플리트 형식이 요약되어 있습니다.

표 11–2 다시 쓰기 규칙의 템플리트 형식 요약

템플리트 

사용 

A%B 

A는 새 사용자/메일함 이름이 되고 B는 새 호스트/도메인 지정이 되며 다시 쓰기를 다시 수행합니다. 반복되는 다시 쓰기 템플리트: A%B

A@B 

A%B@B로 처리됩니다. 일반 다시 쓰기 템플리트, A%B@C 또는 A@B

A%B@C 

A는 새 사용자/메일함 이름이 되고 B는 새 호스트/도메인 지정이 되며 호스트 C와 연관된 채널로 라우팅합니다. 일반 다시 쓰기 템플리트, A%B@C 또는 A@B

A@B@C 

A@B@C@C로 처리됩니다. 지정된 경로 다시 쓰기 템플리트: A@B@C@D 또는 A@B@C

A@B@C@D 

A는 새 사용자/메일함 이름이 되고 B는 새 호스트/도메인 지정이 되며 C를 소스 경로로 삽입하고 호스트 D와 연관된 채널로 라우팅합니다. 지정된 경로 다시 쓰기 템플리트: A@B@C@D 또는 A@B@C

일반 다시 쓰기 템플리트, A%B@C 또는 A@B

The following template is the most common form of template. 주소의 사용자 부분과 주소의 도메인 부분에 규칙이 적용된 다음 새 주소를 사용하여 메일을 특정 채널(ChannelTag에 의해 표시된)로 라우팅합니다.

UserTemplate%DomainTemplate@ChannelTag[controls]

다음 형식의 템플리트는 그 적용에 있어 가장 일반적인 형식의 템플리트와 동일합니다. 그러나 이 형식의 템플리트는 DomainTemplateChannelTag가 동일한 경우에만 가능합니다.

UserTemplate@ChannelTag[controls]

반복되는 다시 쓰기 템플리트: A%B

다음 템플리트 형식은 규칙이 적용된 후에 추가 다시 쓰기가 필요한 메타 규칙에 사용됩니다. 규칙이 적용된 후 전체 다시 쓰기 프로세스가 새 결과 주소에서 반복됩니다(다른 모든 다시 쓰기 규칙 형식은 규칙이 적용된 후 프로세스를 종료합니다).

UserTemplate%DomainTemplate[controls]

예를 들어, 다음 규칙은 주소 끝에서 모든 .removable 도메인을 제거합니다.

.removable $U%$H

이러한 반복 규칙을 사용할 때는 매우 주의해야 합니다. 함부로 사용하면 "규칙 루프"가 발생하기 때문입니다. 따라서 메타 규칙은 반드시 필요한 경우에만 사용해야 합니다. imsimta test -rewrite 명령을 사용하여 메타 규칙을 테스트합니다. test -rewrite 명령에 대한 자세한 내용은 Sun Java System Messaging Server 6 2005Q4 Administration Reference를 참조하십시오.

지정된 경로 다시 쓰기 템플리트: A@B@C@D 또는 A@B@C

ChannelTag가 주소에 소스 경로로 삽입된다는 점을 제외하고 다음 템플리트 형식은 더 일반적인 UserTemplate%DomainTemplate@ChannelTag템플리트와 같은 방식으로 작동합니다(첫 번째 구분자 문자가 다르다는 점에 주의). 그런 다음 메일이 ChannelTag로 라우팅됩니다.

UserTemplate@DomainTemplate@Source-Route
    @ChannelTag[controls]

다시 작성된 주소는 @route :user@domain 이 됩니다. 또한 다음 템플리트도 유효합니다.

UserTemplate@DomainTemplate@ChannelTag[controls]

예를 들어, 다음 규칙은 jdoe@com1 주소를 @siroe.com:jdoe@com1 소스 라우팅 주소로 다시 씁니다. 채널 태그는 siroe.com이 됩니다.

com1 $U@com1@siroe.com

다시 쓰기 규칙 템플리트의 대소문자 구분

다시 쓰기 규칙의 패턴과 달리 템플리트의 대소문자는 유지됩니다. 이것은 다시 쓰기 규칙을 사용하여 대소문자를 구분하는 메일 시스템에 인터페이스를 제공할 때 필요합니다. 주소에서 추출된 자료를 대체하는 $U 및 $D와 같은 대체 시퀀스도 원래 대소문자를 유지한다는 것에 주의합니다.

대체된 자료에 특정 대소문자를 사용하도록 강제 지정하는 것이 바람직한 경우(예: UNIX 시스템에서 메일함에 소문자를 사용하도록 강제 지정하는 경우) 특수한 대체 시퀀스를 템플리트에 사용하여 대체된 자료에 원하는 대소문자를 적용할 수 있습니다. 특히, $\는 대체된 이후의 자료를 소문자로 강제하고 $^는 대문자로 강제하며 $_는 원래 대소문자를 사용하도록 지정합니다.

예를 들어, 다음 규칙을 사용하여 unix.siroe.com 주소에 대해 메일함을 소문자로 강제 지정할 수 있습니다.

unix.siroe.com    $\$U$_%unix.siroe.com

MTA가 다시 쓰기 규칙을 주소에 적용하는 방법

다음 단계는 MTA가 다시 쓰기 규칙을 특정 주소에 적용하는 방법을 설명합니다.

  1. MTA는 주소에서 첫 번째 호스트 또는 도메인 지정을 추출합니다.

    주소는 다음과 같이 둘 이상의 호스트 또는 도메인 이름을 지정할 수 있습니다.

    jdoe%hostname@siroe.com.

  2. 첫 번째 호스트 또는 도메인 이름을 식별한 후에 MTA는 다시 쓰기 규칙 패턴이 호스트 또는 도메인 이름과 일치하는 다시 쓰기 규칙을 스캔하는 검색을 수행합니다.

  3. 일치하는 다시 쓰기 규칙이 발견되면 MTA는 해당 규칙의 템플리트 부분에 따라 주소를 다시 씁니다.

  4. 마지막으로 MTA는 채널 태그를 각 채널과 연관된 호스트 이름과 비교합니다.

    일치하는 항목이 발견된 경우 MTA는 연관된 채널의 대기열에 메일을 넣고, 그렇지 않을 경우 다시 쓰기 프로세스가 실패합니다. 일치하는 채널이 로컬 채널일 경우 별칭 데이터베이스와 별칭 파일을 조회하여 주소의 일부 추가 다시 쓰기가 발생할 수 있습니다.

이러한 단계는 다음 하위 절에 더욱 자세하게 설명되어 있습니다.


주 –

기존 채널에 속하지 않은 채널 태그를 사용하면 주소가 이 규칙과 일치하는 메일이 바운스됩니다. 즉, 일치하는 메일을 라우팅할 수 없게 됩니다.


단계 1. 첫 번째 호스트 또는 도메인 지정 추출

주소 다시 쓰기 프로세스는 첫 번째 호스트나 도메인 지정을 주소에서 추출하는 것으로 시작됩니다(RRFC 822 주소 규칙에 익숙하지 않은 경우에는 다음 내용을 이해할 수 있도록 이 표준을 읽어보는 것이 좋습니다). 주소의 호스트/도메인 지정이 스캔되는 순서는 다음과 같습니다.

  1. 소스 경로의 호스트(왼쪽에서 오른쪽으로 읽음)

  2. “at” 기호(@) 오른쪽에 있는 호스트

  3. 마지막 단일 백분율 기호(%) 오른쪽에 있는 호스트

  4. 첫 번째 느낌표(!)

주소 다시 쓰기를 수행하는 채널에서 bangoverpercent 키워드가 적용될 경우(즉, 메일을 대기열에 넣으려고 시도하는 채널 자체가 bangoverpercent 채널 키워드로 표시된 경우) 마지막 두 개 항목의 순서가 바뀝니다.

표 11–3에는 몇 개의 주소와 첫 번째로 추출할 수 있는 호스트 이름의 예가 나와 있습니다.

표 11–3 추출된 주소 및 호스트 이름

주소 

첫 번째 호스트 도메인 지정 

설명 

user@a

a

“단순 형식” 도메인 이름입니다. 

user@a.b.c

a.b.c

정규화된” 도메인 이름(FQDN)입니다.

user@[0.1.2.3]

[0.1.2.3]

“도메인 리터럴”입니다. 

@a:user@b.c.d

a

단순 형식 이름, 즉 “route”를 가진 소스 라우팅 주소입니다.

@a.b.c:user@d.e.f

a.b.c

소스 라우팅 주소입니다. 경로 부분이 정규화됩니다. 

@[0.1.2.3]:user@d.e.f

[0.1.2.3]

소스 라우팅 주소입니다. 경로 부분이 도메인 리터럴입니다. 

@a,@b,@c:user@d.e.f

a

a, b, c 순서의 라우팅을 가진 소스 라우팅 주소입니다. 

@a,@[0.1.2.3]:user@b

a

경로 부분에 도메인 리터럴이 있는 소스 라우팅 주소입니다. 

user%A@B

B

이 비표준 라우팅 형식은 “백분율 핵”이라고 합니다.

user%A

A

 

user%A%B

B

 

user%%A%B

B

 

A!user

A

“뱅 스타일” 주소 지정입니다. 일반적으로 UUCP에 사용됩니다. 

A!user@B

B

 

A!user%B@C

C

 

A!user%B

B

nobangoverpercent 키워드가 활성화됩니다. 기본값입니다.

A!user%B

A

bangoverpercent 키워드가 활성화됩니다.

RFC 822는 주소에 있는 느낌표(!)와 백분율 기호(%)의 해석을 다루지 않습니다. at 기호(@)가 존재하지 않을 경우 백분율 기호는 관례상 at 기호와 동일한 방식으로 해석되며 따라서 Messaging Server MTA에 이 규칙이 적용됩니다.

반복되는 백분율 기호의 특수한 해석은 백분율 기호를 로컬 아이디의 일부로 허용하는 데 사용됩니다. 이것은 일부 외국 메일 시스템 주소를 처리하는 데 유용할 수 있습니다. 느낌표에 대한 해석은 RFC 976의 “뱅 스타일” 주소 규칙을 따르며 Messaging Server MTA에서 UUCP 주소를 사용할 수 있게 합니다.

이러한 해석의 순서는 RFC 822 또는 RFC 976에 지정되어 있지 않으므로 bangoverpercentnobangoverpercent 키워드를 사용하여 다시 쓰기를 수행하는 채널에 의해 적용되는 순서를 제어할 수 있습니다. 대부분 기본값이 "표준"이지만 경우에 따라서는 대체 설정이 유용할 수 있습니다.


주 –

주소에서는 느낌표(!) 또는 백분율 기호(%)를 사용하지 않는 것이 좋습니다.


단계 2. 다시 쓰기 규칙 스캔

첫 번째 호스트 또는 도메인 지정이 주소에서 추출된 후 MTA는 다시 쓰기 규칙을 참조하여 그 처리 방법을 결정합니다. 호스트/도메인 지정은 각 규칙의 패턴 부분(즉, 각 규칙의 왼쪽)과 비교됩니다. 이 비교는 RFC 822에 명시된 대로대소문자를 구분하지 않습니다. MTA에서는 대소문자를 구분하지 않지만 가능하면 대소문자를 유지합니다.

호스트 또는 도메인 지정이 어떠한 패턴과도 일치하지 않으면(이러한 경우를 "어떠한 규칙과도 일치하지 않음"이라고 함) 호스트 또는 도메인 지정의 첫 번째 부분, 즉 첫 번째 마침표의 앞 부분(대개 호스트 이름)이 제거되고 별표(*)로 대체된 다음, 구성 파일 다시 쓰기 규칙에서만 결과 호스트 또는 도메인 지정을 찾으려는 또 다른 시도가 수행됩니다(도메인 데이터베이스는 참조되지 않음).

이 시도가 실패하면 첫 번째 부분이 제거되고 프로세스가 반복됩니다. 또 다시 실패할 경우에는 다음 부분(일반적으로 하위 도메인)이 제거되고 다시 쓰기 프로세스가 처음에는 별표를 사용하고 그 다음에는 별표 없이 다시 시도됩니다. 별표를 포함하는 모든 검사는 구성 파일 다시 쓰기 규칙 테이블에서만 수행되며 도메인 데이터베이스는 검사되지 않습니다. 이 프로세스는 일치하는 항목이 발견되거나 전체 호스트 또는 도메인 지정이 사용될 때까지 계속됩니다. 이 절차는 가장 구체적인 도메인을 우선 일치시키고 점차 덜 구체적이면서 더 일반적인 도메인을 일치시키는 방향으로 진행됩니다.

일치 절차의 알고리즘에 대한 자세한 내용은 다음과 같습니다.

예를 들어, dan@sc.cs.siroe.edu 주소를 다시 작성한다고 가정해 봅니다. 이 경우 MTA는 다음 패턴을 주어진 순서대로 찾습니다.


sc.cs.siroe.edu
*.cs.siroe.edu
.cs.siroe.edu
*.*.siroe.edu
.siroe.edu
*.*.*.edu
.edu
*.*.*.*
.
 

단계 3. 템플리트에 따라 주소 다시 쓰기

호스트/도메인 지정은 다시 쓰기 규칙과 일치할 경우 규칙의 템플리트 부분에 따라 다시 작성됩니다. 템플리트는 다음 세 가지 정보를 지정합니다.

  1. 주소의 새 아이디

  2. 주소의 새 호스트/도메인 지정

  3. 이 주소에 대한 메일을 보내야 하는 기존 MTA 채널을 식별하는 채널 태그

단계 4. 다시 쓰기 프로세스 완료

호스트/도메인 지정이 다시 작성된 후 다음 작업 중 하나가 수행될 수 있습니다.

다시 쓰기 규칙 실패

호스트 도메인 지정이 다시 쓰기 규칙과 일치하는 데 실패하거나 기본 규칙이 존재하지 않을 경우 MTA는 지정을 "있는 그대로" 사용합니다. 예를 들어, 원래 지정은 새 지정과 라우팅 시스템 모두가 됩니다. 주소에 유효하지 않은 호스트/도메인 지정이 있을 경우 라우팅 시스템이 임의 채널과 연관된 어떠한 시스템 이름과도 일치하지 않을 때 이점이 감지되며 메일이 바운스됩니다.

다시 쓰기 후의 구문 검사

다시 쓰기 규칙이 주소에 적용된 후 추가 구문 검사가 수행되지 않습니다. RFC 822를 따르지 않는 형식으로 주소를 변환하는 데 다시 쓰기 규칙이 사용될 수 있다는 점에서 일부러 이러한 검사가 수행되지 않는 것입니다. 그러나 이것은 또한 구성 파일의 실수로 인해 MTA에서 잘못된 또는 유효하지 않은 주소를 가진 메일이 보내질 수 있다는 것을 의미합니다.

도메인 리터럴 처리

도메인 리터럴은 다시 쓰기 프로세스 동안 특수하게 처리됩니다. 주소의 도메인 부분에 있는 도메인 리터럴이 다시 쓰기 규칙 패턴과 일치하지 않을 경우 이러한 리터럴은 마침표로 구분하고 대괄호로 묶은 문자열 그룹으로 해석됩니다. 맨 오른쪽의 문자열이 제거되며 검색이 반복됩니다. 이 작업이 수행되지 않을 경우 빈 대괄호만 남을 때까지 다음 문자열이 제거됩니다. 빈 대괄호에 대한 검색이 실패하면 전체 도메인 리터럴이 제거되고 도메인 주소의 다음 섹션(있을 경우)에서 다시 쓰기가 진행됩니다. 도메인 리터럴의 내부 처리에서 별표는 사용되지 않습니다. 전체 도메인 리터럴이 별표로 대체될 경우 별표 수는 도메인 리터럴의 요소 수에 해당합니다.

일반 도메인 또는 호스트 지정과 마찬가지로 도메인 리터럴은 또한 가장 구체적인 순서에서 가장 일반적인 순서로 시도됩니다. 해당 패턴이 일치하는 첫 번째 규칙은 호스트 또는 도메인 지정을 다시 쓰는 데 사용되는 규칙입니다. 규칙 목록에 두 개의 동일한 패턴이 있을 경우 먼저 표시된 규칙이 사용됩니다.

예를 들어, dan@[128.6.3.40] 주소를 다시 작성한다고 가정해 봅니다. 다시 쓰기 프로세스는 [128.6.3.40], [128.6.3.], [128.6.], [128.], [], [*.*.*.*]를 차례로 찾은 다음 마지막으로 모두 일치 규칙 “.”를 찾습니다.

템플리트 대체 및 다시 쓰기 규칙 제어 시퀀스

대체는 문자열을 다시 작성된 주소(사용된 특정 대체 시퀀스에 의해 결정되는 값)에 삽입하여 아이디나 주소를 다시 쓰는 데 사용됩니다. 이 절은 다음과 같은 하위 절로 구성되어 있습니다.

예를 들어, 다음 템플리트에서 $U는 대체 시퀀스입니다. 이 대체 시퀀스는 템플리트의 출력에서 다시 쓰는 주소의 username 부분을 대체시킵니다. 따라서 이 템플리트로 jdoe@mailhost.siroe.com이 다시 작성된 경우 $U가 원래 주소의 username 부분인 jdoe로 대체되어 결과 출력은 jdoe@siroe.com이 됩니다.

$U@siroe.com

제어 시퀀스는 특정 다시 쓰기 규칙의 적용 가능성에 추가 조건을 부과합니다. 다시 쓰기 규칙의 패턴 부분이 검사되는 호스트 또는 도메인 지정과 일치해야 할 뿐만 아니라 다시 쓰는 주소의 다른 측면에서 제어 시퀀스에 의해 설정된 조건을 충족해야 합니다. 예를 들어, 다시 쓰는 주소는 $E 제어 시퀀스가 있을 경우 봉투 주소여야 하며 $F 제어 시퀀스가 있을 경우 정방향 지정 주소여야 합니다. 다음 다시 쓰기 규칙은user@siroe.com 형식의 (다시 쓰기) 봉투의 To: 주소에만 적용됩니다.

siroe.com $U@mail.siroe.com$E$F

도메인 또는 호스트 지정이 다시 쓰기 규칙의 패턴 부분과 일치하지만 규칙 템플리트의 제어 시퀀스가 부과한 모든 조건을 충족하지 않을 경우 다시 쓰기 규칙은 실패하고 다른 적용 가능한 규칙을 찾기 위해 다시 쓰기 프로세스가 계속됩니다.

표 11–4에는 템플리트 대체와 제어 시퀀스가 요약되어 있습니다.

표 11–4 다시 쓰기 규칙 템플리트 대체 및 제어 시퀀스 요약

대체 시퀀스 

대체 대상 

$D

일치한 도메인 지정 부분 

$H

호스트/도메인 지정의 일치하지 않는 부분(패턴에 있는 점의 왼쪽) 

$L

도메인 리터럴의 일치하지 않는 부분(패턴 리터럴에 있는 점의 오른쪽) 

$U

원래 주소의 아이디 

$nA 

위치 0에서 시작하여 현재 주소의 n번째 왼쪽 문자를 삽입합니다. n을 생략하면 전체 주소가 삽입됩니다. 

$nX 

0에서 시작하여 메일 호스트의 n번째 왼쪽 구성 요소를 삽입합니다. n을 생략하면 전체 메일 호스트가 삽입됩니다. 

$0U 

원래 주소에서 모든 하위 주소를 뺀 로컬 부분(아이디) 

$1U 

원래 주소의 로컬 부분(아이디)에 있는 하위 주소(있을 경우) 

$$

리터럴 달러 기호($) 삽입

$%

리터럴 백분율 기호(%) 삽입

$@

리터럴 at 기호(@) 삽입

$\

모두 소문자로 적용 

$^

모두 대문자로 적용 

$_

원래 대소문자 사용 

$=

대체된 후속 문자가 LDAP 검색 필터에 삽입하기 적합하게 인용되도록 합니다. 

$W

임의의 고유 문자열로 대체 

$]...[

LDAP 검색 URL 조회 

$(text)

일반 데이터베이스 대체(조회에 실패할 경우 규칙이 실패함) 

${...}

지정된 매핑을 제공된 문자열에 적용 

$[...] 

사용자 제공 루틴 호출(결과로 대체) 

$&n

일치하지 않는(와일드카드로 표시된) 호스트의 n번째부분(0부터 시작하여 왼쪽에서 오른쪽으로 계산)

$!n

일치하지 않는(와일드카드로 표시된) 호스트의 n번째부분(0부터 시작하여 오른쪽에서 왼쪽으로 계산)

$*n

일치하는 패턴의 n번째 부분(0부터 시작하여 왼쪽에서 오른쪽으로 계산)

$#n

일치하는 패턴의 n번째 부분(0부터 시작하여 오른쪽에서 왼쪽으로 계산)

$nD

일치한 도메인 지정 부분(0부터 시작하는 n번째 맨 왼쪽 부분부터 대체) 

$nH

일치하지 않는 호스트/도메인 지정 부분(0부터 시작하는 n번째 맨 왼쪽 부분부터 대체) 

제어 시퀀스 

다시 쓰기 규칙에 미치는 영향 

$1M 

채널이 내부 재처리 채널일 경우에만 적용됩니다. 

$1N 

채널이 내부 재처리 채널이 아닐 경우에만 적용됩니다. 

$1~ 

보류 중인 모든 채널 일치 검사를 수행합니다. 검사가 실패할 경우 현재 다시 쓰기 규칙 템플리트의 처리가 성공적으로 종료합니다. 

$A 

호스트가 at 기호의 오른쪽에 있을 경우 적용됩니다. 

$B 

헤더/본문 주소에만 적용됩니다. 

$C channel

channel로 보낼 경우 실패합니다.

$E 

봉투 주소에만 적용됩니다. 

$F 

정방향 지정(예: To:) 주소에만 적용됩니다. 

$M channel

channel이 주소를 다시 쓰는 경우에만 적용됩니다.

$N channel

channel이 주소를 다시 쓰는 경우 실패합니다.

$P 

호스트가 백분율 기호의 오른쪽에 있을 경우 적용됩니다. 

$Q channel

channel로 보낼 경우 적용됩니다.

$R 

역방향 지정(예: From:) 주소에만 적용됩니다. 

$S 

호스트가 소스 경로에서 온 경우 적용됩니다. 

$Tnewtag

다시 쓰기 규칙 태그를 newtag로 설정합니다. 

$Vhost

호스트 이름이 LDAP 디렉토리(DC 트리에 있거나 가상 도메인으로 존재)에 정의되지 않은 경우 실패합니다. LDAP 검색의 시간이 초과되면 호스트 이름 다음의 문자 바로 뒤부터 시작하는 다시 쓰기 패턴의 나머지 부분은 MTA 옵션 문자열 DOMAIN_FAILURE로 대체됩니다.

$X 

호스트가 느낌표의 왼쪽에 있을 경우 적용됩니다. 

$Zhost

호스트 이름이 LDAP 디렉토리(DC 트리에 있거나 가상 도메인으로 존재)에 정의된 경우 실패합니다. LDAP 검색의 시간이 초과되면 호스트 이름 다음의 문자 바로 뒤부터 시작하는 다시 쓰기 패턴의 나머지 부분은 MTA 옵션 문자열 DOMAIN_FAILURE로 대체됩니다.

$?errmsg

다시 쓰기가 실패할 경우 기본 오류 메시지 대신에 errmsg를 반환합니다. 오류 메시지는 US ASCII여야 합니다.

$number?errmsg

다시 쓰기가 실패할 경우 기본 오류 메시지 대신에 errmsg를 반환하고 SMTP 확장 오류 코드를 a.b.c로 설정합니다.

  • anumber/ 1000000(첫 번째 자리 값)

  • b는 (number/1000) 나머지 1000(두 번째에서 네 번째 자리의 값)

  • cnumber 나머지 1000(마지막 세 개 자리의 값)

    다음 예는 오류 코드를 3.45.89로 설정합니다.

    $3045089?the snark is a boojum

아이디 및 하위 주소 대체: $U, $0U, $1U

템플리트의 모든 $U는 원래 주소의 아이디(RFC 822 "로컬 부분")로 대체됩니다. a.“b” 형식의 아이디가 “a.b”로 대체된다는 것에 주의합니다. 이는 RFC2822에서 RFC 822에 명시된 전자의 형식을 반대하고 있으며 앞으로 후자의 형식이 필수 형식이 될 것으로 예상되기 때문입니다.

템플리트의 모든 $0U는 하위 주소 및 하위 주소 표시 문자(+)를 빼고 원래 주소의 아이디로 대체됩니다. 템플리트의 모든 $1U는 원래 주소의 하위 주소 및 하위 주소 표시 문자(있을 경우)로 대체됩니다. 따라서 $0U 및 $1U가 아이디의 보완적 부분이며 $0U$1U는 $U와 동일하다는 것에 주의합니다.

호스트/도메인 및 IP 리터럴 대체: $D, $H, $nD, $nH, $L

모든 $H는 규칙에 의해 일치되지 않은 호스트/도메인 지정 부분으로 대체됩니다. 모든 $D는 다시 쓰기 규칙에 의해 일치된 호스트/도메인 지정 부분으로 대체됩니다. $nH 및 $nD 문자는 0부터 계산되는 n번째 맨 왼쪽 부분에서 일반 $H 또는 $D 부분을 대체합니다. 즉, $nH 및 $nD는 각각 $H 또는 $D 대체의 맨 왼쪽에서 1부터 계산되는 n개의 부분을 생략합니다. 특히, $0H는 $H와 동일하며 $0D는 $D와 동일합니다.

예를 들어, jdoe@host.siroe.com 주소가 다음 다시 쓰기 규칙과 일치한다고 가정해 봅니다.

host.siroe.com    $U%$1D@TCP-DAEMON

결과 주소는 TCP-DAEMON을 보내는 채널로 사용하는 jdoe@siroe.com입니다. 여기에서 $D는 일치한 전체 도메인 host.siroe.com으로 대체될 것이지만 $1D는 첫 번째 항목(siroe)으로부터 일치하는 부분으로 대체되므로 siroe.com으로 대체됩니다.

$L은 다시 쓰기 규칙에 의해 일치되지 않은 도메인 리터럴 부분을 대체합니다.

리터럴 문자 대체: $$, $%, $@

$, % 및 @ 문자는 일반적으로 다시 쓰기 규칙 템플리트에서 메타 문자입니다. 이러한 문자의 리터럴 삽입을 수행하려면 달러 문자 $를 사용하여 해당 문자를 인용합니다. 즉, $$는 단일 달러 기호 $로 확장되고 $%는 단일 백분율 %(이 경우 백분율은 템플리트 필드 구분자로 해석되지 않음)로 확장되며 $@은 단일 at 기호 @(마찬가지로 필드 구분자로 해석되지 않음)으로 확장됩니다.

LDAP 쿼리 URL 대체: $]...[

$]ldap-url[ 형식의 대체는 LDAP 쿼리 URL로 해석되며 LDAP 쿼리 결과가 대체됩니다. 표준 LDAP URL은 호스트와 포트가 생략된 채로 사용됩니다. 호스트와 포트는 대신 msg.conf 파일(local.ldaphostlocal.ldapport 속성)에서 지정됩니다.

즉, LDAP URL은 다음과 같이 지정해야 하며 여기에서 대괄호 문자 [ ]는 URL의 선택적 부분을 나타냅니다.

ldap:///dn[?attributes[?scope?filter]]

dn은 필수 항목으로서 검색 기준을 지정하는 고유 이름입니다. URL의 선택적 속성, 범위 및 필터 부분은 반환할 정보를 더욱 구체화합니다. 다시 쓰기 규칙의 경우 반환 지정을 위한 속성은 mailRoutingSystem 속성(또는 이와 유사한 속성)이 될 수 있습니다. 범위는 base(기본값), one 또는 sub가 될 수 있으며 필터는 mailDomain 값이 다시 쓰는 도메인과 일치하는 객체의 반환을 요청하는 것이 될 수 있습니다.

LDAP 디렉토리 스키마가 mailRoutingSystemmailDomain 속성을 포함할 경우 주어진 주소를 라우팅할 시스템을 결정하기 위한 다시 쓰기 규칙은 다음과 같이 나타날 수 있습니다. 여기에서 LDAP URL 대체 시퀀스 $D는 현재 도메인 이름을 생성된 LDAP 쿼리로 대체하는 데 사용됩니다.


.siroe.com \
  $U%$H$D@$]ldap:///o=siroe.com?mailRoutingSystem?sub? \
  (mailDomain=$D)

         

백슬래시 문자는 쉽게 알아볼 수 있도록 하나의 논리적 다시 쓰기 규칙 행을 계속해서 두 번째 물리적 행으로 이어주는 데 사용됩니다. 표 11–5에는 LDAP URL 대체 시퀀스가 나열되어 있습니다.

표 11–5 LDAP URL 대체 시퀀스

대체 시퀀스 

설명 

$$

리터럴 $ 문자 

$~ account

사용자 계정의 홈 디렉토리 

$A

주소 

$D

도메인 이름 

$H

호스트 이름(정규화된 도메인 이름의 첫 번째 부분) 

$L

~ 또는 _와 같은 특수한 선행 문자를 뺀 아이디 

$S

하위 주소 

$U

아이디 

MTA는 이제 다시 쓰기 규칙 및 매핑에서 수행된 조회에서 URL 결과를 캐시합니다. 이 새 URL 결과 캐시는 두 개의 새로운 MTA 옵션, 즉 URL_RESULT_CACHE_SIZE(기본값은 10000개 항목) 및 URL_RESULT_CACHE_TIMEOUT(기본값은 600초)에 의해 제어됩니다.

일반 데이터베이스 대체: $(...)

$(텍스트) 형식의 대체는 특수하게 처리됩니다. 텍스트 부분은 특수한 일반 데이터베이스에 액세스하기 위한 키로 사용됩니다. 이 데이터베이스는 /imta/config/imta_tailor 파일의 IMTA_GENERAL_DATABASE 옵션으로 지정하는 파일(일반적으로 /imta/db/generaldb.db)로 구성됩니다.

이 데이터베이스는 imsimta crdb 유틸리티를 사용하여 생성합니다. 데이터베이스에서 "text-string"이 발견될 경우 데이터베이스의 해당 템플리트가 대체됩니다. "text-string"이 데이터베이스의 항목과 일치하지 않을 경우 다시 쓰기 프로세스는 실패합니다(다시 쓰기 규칙이 처음에 일치하지 않은 것과 같음). 대체에 성공할 경우 추가 대체를 위해 데이터베이스에서 추출된 템플리트가 다시 스캔됩니다. 그러나 참조가 무한대로 반복되는 것을 방지하기 위해 추출된 템플리트의 추가 $(텍스트) 대체는 금지됩니다.

예를 들어, jdoe@siroe.siroenet 주소가 다음 다시 쓰기 규칙과 일치한다고 가정해 봅니다.

.SIROENET $($H)

이 경우 텍스트 문자열 siroe가 일반 데이터베이스에서 조회되고 조회 결과(있을 경우)가 다시 쓰기 규칙의 템플리트에 사용됩니다. siroe를 조회한 결과가 $u%eng.siroe.com@siroenet이라고 가정해 봅니다. 그러면 템플리트 출력은 jdoe@eng.siroe.com(즉, 아이디 = jdoe, 호스트/도메인 지정 = eng.siroe.com)이 되고 라우팅 시스템은 siroenet이 됩니다.

일반 데이터베이스(존재할 경우)는 제대로 작동하려면 세계 공용이어야 합니다.

지정된 매핑 적용: ${...}

.SIROENET $($H) ${mapping,argument} 형식의 대체는 MTA 매핑 파일에서 매핑을 찾아 적용하는 데 사용됩니다. mapping 필드는 사용할 매핑 테이블의 이름을 지정하며 argument는 매핑에 전달할 문자열을 지정합니다. 매핑은 존재해야 하며 성공적일 경우 해당 출력에 $Y 플래그를 설정해야 합니다. 매핑이 존재하지 않거나 $Y를 설정하지 않을 경우 다시 쓰기가 실패합니다. 성공적일 경우 매핑 결과가 현재 위치에서 템플리트에 병합되고 다시 확장됩니다.

이 기법을 통해 MTA 다시 쓰기 프로세스는 복잡한 여러 방법으로 확장될 수 있습니다. 예를 들어, 주소의 아이디 부분을 선택적으로 분석 및 수정할 수 있습니다(일반적으로 MTA 다시 쓰기 프로세스에서 불가능한 기능임).

사용자 제공 루틴 대체: $[...]

$[image,routine,argument] 형식의 대체는 사용자 제공 루틴을 검색 및 호출하는 데 사용됩니다. UNIX의 런타임에서 MTA는 dlopendlsym을 사용하여 공유 라이브러리 이미지에서 지정된 루틴을 동적으로 로드 및 호출합니다. 그런 다음 루틴은 다음 인수 목록과 함께 함수로 호출됩니다.

status := routine (argument, arglength, result, reslength)

argumentresult는 252바이트 길이의 문자열 버퍼입니다. UNIX에서 argumentresult는 문자열에 대한 포인터로 전달됩니다(예: C에서는 char*로 전달됨). arglengthreslength는 참조에 의해 전달되는 서명된 정수(Long)입니다. 입력 시에 argument는 다시 쓰기 규칙 템플리트의 인수 문자열을 포함하며 arglength는 해당 문자열의 길이를 포함합니다. 반환 시에 결과 문자열은 result에 포함되고 그 길이는 reslength에 포함되어야 합니다. 그런 다음 해당 결과 문자열은 다시 쓰기 규칙 템플리트의 "$[image,routine,argument]"를 대체합니다. 루틴은 다시 쓰기 규칙이 실패할 경우 0을 반환하고 성공할 경우 -1을 반환합니다.

이 기법을 통해 다시 쓰기 프로세스는 모든 종류의 복잡한 방법으로 확장될 수 있습니다. 예를 들어, 일부 유형의 이름 서비스에 대한 호출을 수행하고 그 결과를 사용하여 주소를 일정한 방식으로 변경할 수 있습니다. 호스트siroe.com에 대한 정방향 지정 주소(예: To: 주소)에 대해 다음 다시 쓰기 규칙을 사용하여 디렉토리 서비스 조회를 수행할 수 있습니다. 방향 및 위치 특정 다시 쓰기 규칙: $B, $E, $F, $R에 설명된 $F는 정방향 지정 주소에 대해서만 이 규칙이 사용되도록 합니다.

siroe.com $F$[LOOKUP_IMAGE,LOOKUP,$U]

정방향 지정 주소 jdoe@siroe.com은 이 다시 쓰기 규칙과 일치할 경우 LOOKUP_IMAGE(UNIX의 공유 라이브러리)가 메모리에 로드된 다음 LOOKUP 루틴이 인수 매개 변수로 jdoe와 함께 호출되게 합니다. 그런 다음 LOOKUP 루틴은 결과 매개 변수에서 다른 주소, 즉 John.Doe%eng.siroe.com과 다시 쓰기 규칙이 성공했음을 나타내는 값 -1을 반환할 수 있습니다. 결과 문자열의 백분율 기호( 반복되는 다시 쓰기 템플리트: A%B 참조)는 John.Doe@eng.siroe.com을 다시 쓸 주소로 사용하여 다시 쓰기 프로세스가 다시 시작되게 합니다.

UNIX 시스템에서 사이트 제공 공유 라이브러리 이미지는 세계 공용이어야 합니다.

단일 필드 대체: $&, $!, $*, $#

단일 필드 대체는 다시 쓰는 호스트/도메인 지정에서 단일 하위 도메인 부분을 추출합니다. 표 11–6에는 사용 가능한 단일 필드 대체가 나와 있습니다.

표 11–6 단일 필드 대체

제어 시퀀스 

사용 

$&n 

호스트 지정에서 n번째 요소(n=0,1,2,..,9)를 대체합니다(일정한 와일드카드와 일치하지 않았거나 일치한 부분). 요소는 점으로 구분되며 왼쪽의 첫 번째 요소가 요소 0입니다. 요청한 요소가 없으면 다시 쓰기가 실패합니다. 

$!n 

호스트 지정에서 n번째 요소(n=0,1,2,..,9)를 대체합니다(일정한 와일드카드와 일치하지 않았거나 일치한 부분). 요소는 점으로 구분되며 오른쪽의 첫 번째 요소가 요소 0입니다. 요청한 요소가 없으면 다시 쓰기가 실패합니다. 

$*n 

도메인 지정에서 n번째 요소(n=0,1,2,..,9)를 대체합니다(패턴의 명시적 텍스트와 일치하지 않은 부분). 요소는 점으로 구분되며 왼쪽의 첫 번째 요소가 요소 0입니다. 요청한 요소가 없으면 다시 쓰기가 실패합니다. 

$#n 

도메인 지정에서 n번째 요소(n=0,1,2,..,9)를 대체합니다(패턴의 명시적 텍스트와 일치하지 않은 부분). 요소는 점으로 구분되며 오른쪽의 첫 번째 요소가 요소 0입니다. 요청한 요소가 없으면 다시 쓰기가 실패합니다. 

jdoe@eng.siroe.com 주소가 다음 다시 쓰기 규칙과 일치한다고 가정해 봅니다.

*.SIROE.COM     $U%$&0.siroe.com@mailhub.siroe.com

이 경우 템플리트의 결과는 jdoe@eng.siroe.com이 되며 mailhub.siroe.com이 라우팅 시스템으로 사용됩니다.

고유 문자열 대체

$W 제어 시퀀스를 사용할 때마다 대문자 및 숫자로 구성된 반복되지 않는 고유한 텍스트 문자열이 삽입됩니다. 반복되지 않는 주소 정보를 생성해야 할 경우에 $W가 유용합니다.

소스 채널 특정 다시 쓰기 규칙: $M, $N

특정 소스 채널에 대해서만 작동하는 다시 쓰기 규칙을 지정할 수 있습니다. 이것은 단순 형식의 이름이 다음과 같이 두 개의 의미를 가질 경우에 유용합니다.

  1. 특정 채널에 도착하는 메일에 나타날 경우

  2. 다른 채널에 도착하는 메일에 나타날 경우

소스 채널 특정 다시 쓰기는 사용 중인 채널 프로그램과 rulesnorules 채널 키워드와 연관됩니다. 다시 쓰기를 수행 중인 MTA 구성 요소와 연관된 채널에서 norules가 지정된 경우 채널 특정 다시 쓰기 검사가 수행되지 않습니다. 이러한 채널에 rules가 지정된 경우에는 채널 특정 규칙 검사가 적용됩니다. rules 키워드가 기본값입니다.

소스 채널 특정 다시 쓰기는 주어진 주소와 일치하는 채널과 연관되지 않으며 다시 쓰기를 수행하는 MTA 구성 요소와 이 구성 요소의 채널 테이블 항목에만 의존합니다.

채널 특정 다시 쓰기 검사는 규칙의 템플리트 부분에 있는 $N 또는 $M 제어 시퀀스의 존재에 의해 트리거됩니다. $N 또는 $M 뒤에서부터 at 기호(@), 백분율 기호(%) 또는 후속 $N, $M, $Q, $C, $T 또는 $?의 앞 부분에 있는 문자는 채널 이름으로 해석됩니다.

예를 들어, $Mchannel의 경우 channel이 현재 다시 쓰기를 수행 중이 아니면 규칙이 실패하고 $Nchannel의 경우 channel 이 다시 쓰기를 수행 중이면 규칙이 실패합니다. 여러 $M$N 절을 지정할 수 있습니다. 여러 $M 절 중 하나가 일치하면 규칙이 성공하며 여러 $N 절 중 하나가 일치하면 규칙이 실패합니다.

대상 채널 특정 다시 쓰기 규칙: $C, $Q

메일을 대기열에 넣는 채널에 의존하여 다시 쓰기 규칙이 적용될 수 있습니다. 이것은 일부 호스트에 대한 두 개의 이름, 즉 특정 호스트 그룹에 알려진 이름과 다른 호스트 그룹에 알려진 이름이 존재할 경우에 유용합니다. 다른 채널을 사용하여 메일을 각 그룹에 보내면 주소를 다시 작성하여 각 그룹에 알려진 이름으로 호스트를 참조할 수 있습니다.

대상 채널 특정 다시 쓰기는 메일을 대기열에서 빼고 처리하는 채널과 해당 채널의 rulesnorules 채널 키워드와 연관됩니다. 대상 채널에 norules가 지정된 경우 채널 특정 다시 쓰기 검사가 수행되지 않습니다. 대상 채널에 rules가 지정된 경우 채널 특정 규칙 검사가 적용됩니다. rules 키워드가 기본값입니다.

대상 채널 특정 다시 쓰기는 주어진 주소와 일치하는 채널과 연관되지 않습니다. 대상 채널 특정 다시 쓰기는 메일의 envelope To: 주소에만 의존합니다. 메일을 대기열에 넣을 때 대상 채널을 결정하기 위해 메일의 envolope To: 주소가 우선적으로 다시 작성됩니다. envelope To: 주소를 다시 쓰는 동안 $C$Q 제어 시퀀스는 무시됩니다. envelope To: 주소가 다시 작성되고 대상 채널이 결정되면 메일과 연관된 다른 주소가 다시 작성될 때 $C$Q 제어 시퀀스가 적용됩니다.

대상 채널 특정 다시 쓰기 검사는 규칙의 템플리트 부분에 있는 $C 또는 $Q 제어 시퀀스의 존재에 의해 트리거됩니다. $C 또는 $Q 뒤에서부터 at 기호(@), 백분율 기호( %) 또는 후속 $N, $M, $C, $Q, $T 또는 $?의 앞 부분에 있는 문자는 채널 이름으로 해석됩니다.

예를 들어, $Qchannel의 경우 channel이 대상이 아니면 규칙이 실패하고 $Cchannel의 경우 channel이 대상이면 규칙이 실패합니다. 여러 $Q$C 절을 지정할 수 있습니다. 여러 $Q 절 중 하나가 일치하면 규칙이 성공하며 여러 $C 절 중 하나가 일치하면 규칙이 실패합니다.

방향 및 위치 특정 다시 쓰기 규칙: $B, $E, $F, $R

경우에 따라 봉투 주소 또는 헤더 주소에만 적용되는 다시 쓰기 규칙을 지정해야 합니다. 제어 시퀀스 $E는 다시 쓰는 주소가 봉투 주소가 아닐 경우 다시 쓰기가 실패하도록 지정하며 $B는 다시 쓰는 주소가 메일 헤더나 본문에서 오지 않은 경우 다시 쓰기가 실패하도록 지정합니다. 이러한 시퀀스는 다시 쓰기에 다른 영향을 미치지 않으며 다시 쓰기 규칙 템플리트의 임의 위치에 나타날 수 있습니다.

주소를 또한 방향별로 범주화할 수 있습니다. 정방향 지정 주소는 To:, Cc:, Resent-to: 또는 대상을 나타내는 다른 헤더 또는 봉투 행에서 시작되는 주소입니다. 역방향 지정 주소는 소스를 나타내는 From:, Sender: 또는 Resent-From:과 같은 주소입니다. 제어 시퀀스 $F는 주소가 정방향 지정일 경우에 다시 쓰기를 적용하도록 지정하며 $R은 주소가 역방향 지정일 경우에 다시 쓰기를 적용하도록 지정합니다.

호스트 위치별 다시 쓰기: $A, $P, $S, $X

경우에 따라 주소에서 호스트 이름이 나타나는 위치가 중요한 다시 쓰기가 필요할 수 있습니다. 호스트 이름은 다음과 같이 주소의 여러 다른 컨텍스트에 나타날 수 있습니다.

정상적인 경우라면 호스트 이름은 표시 위치에 상관 없이 동일하게 처리되어야 합니다. 일부 상황에서는 특수한 처리가 필요할 수 있습니다.

주소에서의 호스트 위치에 기초한 일치를 제어하기 위해 네 개의 제어 시퀀스가 사용됩니다.

호스트가 지정된 위치와 다른 위치에 있을 경우 규칙은 실패합니다. 이러한 시퀀스는 하나의 다시 쓰기 규칙에서 결합될 수 있습니다. 예를 들어, $S$A가 지정된 경우 규칙은 소스 경로나 at 기호의 오른쪽에 지정된 호스트와 일치합니다. 이러한 시퀀스를 전혀 지정하지 않는 것은 시퀀스를 모두 지정되는 것과 같습니다. 즉, 위치에 상관 없이 규칙이 일치할 수 있습니다.

현재 태그 값 변경: $T

$T 제어 시퀀스는 현재 다시 쓰기 규칙 태그를 변경하는 데 사용됩니다. 구성 파일과 도메인 데이터베이스에서 다시 쓰기 규칙 패턴이 조회되기 전에 다시 쓰기 규칙 태그가 모든 다시 쓰기 규칙 패턴의 앞에 놓입니다. $T의 뒤에서부터 at 기호, 백분율 기호, $N, $M, $Q, $C, $T 또는 $?의 앞 부분에 있는 텍스트는 새 태그로 간주됩니다.

태그는 특정 구성 요소가 발견되었을 때 주소의 전체 특성이 변경되는 특수한 주소 지정 형식을 처리하는 데 유용합니다. 예를 들어, 소스 경로에서 발견될 경우 특정 호스트 이름 internet을 주소에서 제거해야 하며 TCP-DAEMON 채널에 대해 결과 주소를 강제로 일치시켜야 한다고 가정해 봅니다.

이것은 다음과 같은 규칙으로 구현할 수 있습니다(localhost가 로컬 호스트의 공식 이름이라고 가정함).

internet               $S$U@localhost$Tmtcp-force|

mtcp-force|.           $U%$H@TCP-DAEMON

첫 번째 규칙은 특정 호스트 이름 internet과 일치합니다(소스 경로에 표시될 경우). 이 규칙은 internet을 로컬 채널에 대해 강제로 일치시켜 주소에서 제거되도록 합니다. 그런 다음 다시 쓰기 태그가 설정됩니다. 다시 쓰기가 진행되지만 태그로 인해 일반 규칙은 일치하지 않습니다. 마지막으로 태그와 함께 기본 규칙이 시도되고 이 집합의 두 번째 규칙이 적용되어 다른 조건에 상관 없이 TCP-DAEMON 채널에 대해 주소를 강제로 일치시킵니다.

다시 쓰기와 관련된 오류 메시지 처리: $?

MTA는 다시 쓰기 및 채널 일치가 실패할 경우 기본 오류 메시지를 제공합니다. 특별한 상황에서는 이러한 메시지를 변경하는 기능이 유용할 수 있습니다. 예를 들어, 누군가가 이더넷 라우터 상자에 메일을 보내려고 시도할 경우 일반적인 "illegal host/domain specified"라는 메시지보다 "our routers cannot accept mail"이라는 메시지가 더 정확하게 의미를 전달합니다.

특수한 제어 시퀀스를 사용하여 규칙이 실패할 경우 인쇄할 오류 메시지를 변경할 수 있습니다. $? 시퀀스는 오류 메시지를 지정하는 데 사용됩니다. $?의 뒤에서부터 at 기호(@), 백분율 기호(%), $N, $M, $Q, $C, $T 또는 $?의 앞 부분에 있는 텍스트는 다시 쓰기의 결과가 임의의 채널과 일치하는 데 실패할 경우 인쇄될 오류 메시지의 텍스트로 간주됩니다. 오류 메시지의 설정은 “고정적”이며 다시 쓰기 프로세스 동안 계속 적용됩니다.

$?를 포함하는 규칙은 다른 규칙과 마찬가지로 작동합니다. $?만 포함하는 특수한 규칙의 경우 다른 방식으로 처리됩니다. 즉, 주소의 메일함 또는 호스트 부분을 변경하지 않고 다시 쓰기 프로세스가 종료하며 호스트는 채널 테이블에서 있는 그대로 조회됩니다. 이 조회는 실패할 것이며 이에 따라 오류 메시지가 결과로 반환됩니다.

예를 들어, MTA 구성 파일의 최종 다시 쓰기 규칙이 다음과 같다고 가정해 봅니다.

. $?Unrecognized address; contact postmaster@siroe.com

이 예에서 실패할 수 있는 인식되지 않은 호스트 또는 도메인 지정은 실패하는 과정에서 오류 메시지 Unrecognized address; contact postmaster@siroe.com을 생성합니다.

많은 수의 다시 쓰기 규칙 처리

MTA는 항상 imta.cnf 파일에서 모든 다시 쓰기 규칙을 읽어 해시 테이블의 메모리에 저장합니다. 컴파일된 구성을 사용하면 정보가 필요할 때마다 구성 파일을 읽는 것과 관련된 오버헤드가 사라집니다. 해시 테이블은 여전히 모든 다시 쓰기 규칙을 메모리에 저장하는 데 사용됩니다. 이 방법은 다시 쓰기 규칙 수가 적거나 보통인 경우에 적합합니다. 그러나 일부 사이트에는 10,000개 이상의 다시 쓰기 규칙이 필요할 수 있으며 이로 인해 과도한 양의 메모리가 소비될 수 있습니다.

MTA는 보조 색인 데이터 파일에 많은 수의 다시 쓰기 규칙을 저장하기 위한 선택적 기능을 제공하여 이 문제를 해결합니다. 일반 구성 파일을 읽을 때마다 MTA는 도메인 데이터베이스의 존재를 확인합니다. 도메인 데이터베이스가 존재할 경우 구성 파일에서 발견된 규칙에서 시도된 일치가 실패할 때마다 이 데이터베이스가 열리고 참조됩니다. 구성 파일에서 특정 규칙이 발견되지 않을 경우에만 도메인 데이터베이스가 검사되므로 규칙을 항상 구성 파일에 추가하여 데이터베이스에서 이를 무시할 수 있습니다. 기본적으로 도메인 데이터베이스는 호스트 도메인과 연관된 다시 쓰기 규칙을 저장하는 데 사용됩니다. IMTA_DOMAIN_DATABASE 속성은 imta_tailor 파일에 저장됩니다. 데이터베이스의 기본 위치는 msg_svr_base/data/db/domaindb.db입니다.


주 –

이 필드를 수동으로 편집해서는 안 됩니다.


다시 쓰기 규칙 테스트

imsimta test -rewrite 명령을 사용하여 다시 쓰기 규칙을 테스트할 수 있습니다. -noimage 한정자를 사용하면 새 구성을 다시 컴파일하기 전에 구성 파일의 변경 사항을 테스트할 수 있습니다.

이 유틸리티를 -debug 한정자와 함께 사용하여 몇 개의 주소를 다시 쓰는 것이 유용할 수 있습니다. 이 작업은 주소를 다시 쓰는 방법을 단계별로 보여 줍니다. 예를 들어, 다음 명령을 실행합니다.

% imsimta test -rewrite -debug joe@siroe.com

imsimta test -rewrite 유틸리티에 대한 자세한 내용은 Sun Java System Messaging Server 6 2005Q4 Administration Reference를 참조하십시오.

다시 쓰기 규칙 예

다음 예는 샘플 다시 쓰기 규칙과 샘플 주소가 이러한 규칙에 의해 다시 작성되는 방법을 보여 줍니다.

다음 예에 나온 다시 쓰기 규칙이 시스템 SC.CS.SIROE.EDU에 대한 구성 파일에 포함되었다고 가정해 봅니다.


sc                     $U@sc.cs.siroe.edu
sc1                    $U@sc1.cs.siroe.edu
sc2                    $U@sc2.cs.siroe.edu
*                      $U%$&0.cs.siroe.edu
*.cs                   $U%$&0.cs.siroe.edu
*.cs.siroe             $U%$&0.cs.siroe.edu
*.cs.siroe.edu         $U%$&0.cs.siroe.edu@ds.adm.siroe.edu
sc.cs.siroe.edu        $U@$D
sc1.cs.siroe.edu       $U@$D
sc2.cs.siroe.edu       $U@$D
sd.cs.siroe.edu        $U@sd.cs.siroe.edu
.siroe.edu             $U%$H.siroe.edu@cds.adm.siroe.edu
.edu                   $U@$H$D@gate.adm.siroe.edu
[]                     $U@[$L]@gate.adm.siroe.edu

표 11–7은 몇 가지 샘플 주소와 다시 쓰기 규칙에 따라 이러한 주소가 다시 작성 및 라우팅되는 방법을 보여 줍니다.

표 11–7 샘플 주소 및 다시 쓰기

초기 주소 

다시 작성된 주소 

라우팅 대상 

user@sc 

user@sc.cs.siroe.edu 

sc.cs.siroe.edu 

user@sc1 

user@sc1.cs.siroe.edu 

sc1.cs.siroe.edu 

user@sc2 

user@sc2.cs.siroe.edu 

sc2.cs.siroe.edu 

user@sc.cs 

user@sc.cs.siroe.edu 

sc.cs.siroe.edu 

user@sc1.cs 

user@sc1.cs.siroe.edu 

sc1.cs.siroe.edu 

user@sc2.cs 

user@sc2.cs.siroe.edu 

sc2.cs.siroe.edu 

user@sc.cs.siroe 

user@sc.cs.siroe.edu 

sc.cs.siroe.edu 

user@sc1.cs.siroe 

user@sc1.cs.siroe.edu 

sc1.cs.siroe.edu 

user@sc2.cs.siroe 

user@sc2.cs.siroe.edu 

sc2.cs.siroe.edu 

user@sc.cs.siroe.edu 

user@sc.cs.siroe.edu 

sc.cs.siroe.edu 

user@sc1.cs.siroe.edu 

user@sc1.cs.siroe.edu 

sc1.cs.siroe.edu 

user@sc2.cs.siroe.edu 

user@sc2.cs.siroe.edu 

sc2.cs.siroe.edu 

user@sd.cs.siroe.edu 

user@sd.cs.siroe.edu 

sd.cs.siroe.edu 

user@aa.cs.siroe.edu 

user@aa.cs.siroe.edu 

ds.adm.siroe.edu 

user@a.eng.siroe.edu 

user@a.eng.siroe.edu 

cds.adm.siroe.edu 

user@a.cs.sesta.edu 

user@a.cs.sesta.edu 

gate.adm.siroe.edu—루트 삽입됨 

user@b.cs.sesta.edu 

user@b.cs.sesta.edu 

gate.adm.siroe.edu—루트 삽입됨 

user@[1.2.3.4] 

user@[1.2.3.4] 

gate.adm.siroe.edu—루트 삽입됨 

기본적으로, 이러한 다시 쓰기 규칙의 내용을 살펴보면 우선호스트 이름이 단순 형식 이름(sc, sc1 또는 sc2) 중 하나이거나 전체 이름(sc.cs.siroe.edu 등) 중 하나일 경우 이를 전체 이름으로 확장하고 대상으로 라우팅합니다. 한 부분으로 된 단순 형식 이름에 cs.cmu.edu를 추가하고 다시 시도합니다. 뒤에 .cs가 오는 한 부분을 뒤에 .cs.siroe.edu가 오는 한 부분으로 변환하고 다시 시도합니다. 또한 .cs.siroe를 .cs.siroe.edu로 변환하고 다시 시도합니다.

이름이 sd.cs.siroe.edu(직접 연결되는 일부 시스템)인 경우 이를 다시 작성하고 자체에서 라우팅합니다. 호스트 이름이 .cs.siroe.edu 하위 도메인에 있는 것이면 이를 ds.cs.siroe.edu(.cs.siroe.edu 하위 도메인의 게이트웨이)로 라우팅합니다. 호스트 이름이 .siroe.edu 하위 도메인에 있는 것이면 이를 cds.adm.siroe.edu(.siroe.edu 하위 도메인의 게이트웨이)로 라우팅합니다. 호스트 이름이 .edu 최상위 도메인 있는 것이면 이를 gate.adm.siroe.edu(메일을 적절한 대상으로 라우팅할 수 있음)로 라우팅합니다. 도메인 리터럴이 사용될 경우 이를 또한 gate.adm.siroe.edu로 보냅니다.

앞의 예와 마찬가지로 대부분의 다시 쓰기 규칙 적용은 주소의 아이디 또는 메일함 부분을 변경하지 않습니다. 주소의 아이디 부분을 변경하는 기능은 RFC 822를 따르지 않는 전자 메일 프로그램(즉, 호스트/도메인 지정의 일부로 주소의 아이디 부분을 채워야 하는 전자 메일 프로그램)과 인터페이스하기 위해 MTA를 사용할 때 사용됩니다. 이 기능을 사용할 때는 매우 주의해야 합니다.