외부 SRS 데몬(Debian 패키지 srs)을 사용하여 exim 4를 설정하는 데 어려움을 겪고 있습니다. srsd가 실행 중이며 주소를 앞뒤로 잘 변환하고 있습니다. exim에 내장된 srs 코드는 Debian에서 활성화되어 있지 않기 때문에 사용할 수 없습니다(직접 컴파일할 수는 있지만 옵션은 아닙니다).
내가 문제가 있는 것은 전달된 메일에 SRS 태그를 추가하는 exim 내의 srs_forward 라우터입니다. 다음과 같은 리디렉션 라우터가 있습니다. 이 라우터는 다른 mx에 대해 릴레이되지 않는 로컬이 아닌 발신자와 로컬이 아닌 수신자의 오류가 아닌 메시지에 대해서만 실행되어야 합니다. 적어도 srs가 그러한 메시지에 적용된다는 것을 이해합니다. 이것이 틀렸다면 정정해 주십시오. 다음 코드가 있습니다.
srs_forward:
debug_print = "R: srs_forward for $local_part@$domain"
driver = redirect
senders = ! :
condition = ${if ! match_domain{$sender_address_domain}{+local_domains}}
domains = ! +local_domains : ! +relay_to_domains
address_data = ${readsocket{/tmp/srsd}\
{FORWARD $sender_address_local_part@$sender_address_domain $domain\n}\
{5s}{\n}{:defer: SRS daemon failure}}
errors_to = ${quote_local_part:${local_part:$address_data}}@${domain:$address_data}
data = ${quote_local_part:$local_part}@$domain
headers_add = X-SRS: Sender address rewritten from $sender_address to ${quote_local_part:${local_part:$address_data}}@$$
repeat_use = false
allow_defer
no_verify
테스트할 수 있고 작동하는 것: 반환 경로가 올바르게 생성됩니다(address_data 및 error_to가 있는 줄과 to-address(데이터로 시작하는 줄)).
전제 조건이 확실하지 않습니다.
senders = ! :
이 줄은 오류 메시지로 인해 라우터가 실행되는 것을 방지해야 합니다.
condition = ${if ! match_domain{$sender_address_domain}{+local_domains}}
이 줄은 라우터가 로컬 발신자의 메시지에 대해 실행되는 것을 방지해야 합니다.
domains = ! +local_domains : ! +relay_to_domains
이 줄은 라우터가 로컬 수신자에게 보내는 메시지나 릴레이된 메시지에 대해 실행되는 것을 방지해야 합니다.
누군가 명확히 해줄 수 있습니까?
(저는수동시작점으로 삼았지만 성공하지는 못했습니다.)
답변1
테스트를 제대로 하지 않으셨습니다. SRS 데몬에 전달한 정보가 올바르지 않습니다.
FORWARD $sender_address_local_part@$sender_address_domain $domain\n
이는 원하는 작업을 수행하지 않습니다. $domain에는 보내는 도메인이 아닌 받는 사람 도메인이 포함되어 있습니다. 메시지가 전달된 도메인에 대한 반환 경로를 다시 작성하려는 의도는 존중되지만 다음과 같이 작동하지 않습니다. 메시지가 SRS 라우터에 도달합니다.~ 후에전달이 이미 완료되었으므로 $domain에는 더 이상 메시지가 전송된 도메인이 포함되지 않습니다. $primary_hostname 또는 $original_domain을 사용해야 합니다. 따라서 이 줄은 다음과 같아야 합니다.
address_data = ${readsocket{/tmp/srsd}\
{FORWARD $sender_address_local_part@$sender_address_domain $original_domain\n}\
{5s}{\n}{:defer: SRS daemon failure}}
귀하의 전제 조건과 관련된 것은 괜찮습니다. "보내는 사람"과 "조건" 줄을 함께 사용할 수 있습니다.
senders = ! : ! *@+local_domains
도메인 목록 local_domains에 실제로 모든 로컬 도메인이 포함되어 있는지 확인하기만 하면 됩니다(적어도 현재 라우팅된 메시지 $original_domain 및 $sender_address_domain에 대해서는 포함되어야 함).
코드가 실행 중인 경우 구성을 문서화하고 여기에 몇 가지 힌트를 제공하십시오. 몇 가지 사항을 더 준비해야 합니다. 수신 SRS 태그가 지정된 반송 메시지를 확인하기 위한 ACL, 그레이리스팅을 위해 SRS 태그가 지정된 메일의 태그 해제, 반송 태그 해제, 발신 메시지에 BATV와 같은 다른 태그를 추가하지 않도록 하기, SRS 태그가 지정된 메시지를 허용하는 문제 해결 케이스가 깨졌거나 SRS 태그가 지정된 발신자 주소를 포함하지 않도록 반송 오류 메시지 텍스트를 다시 작성하거나 태그가 지정되지 않은 반송을 거부하는 등의 작업을 수행할 수 있습니다. 따라서 좋은 튜토리얼을 부탁드립니다. 감사합니다!