![Exim 조건부 논리](https://rvso.com/image/747348/Exim%20%EC%A1%B0%EA%B1%B4%EB%B6%80%20%EB%85%BC%EB%A6%AC.png)
exim에서 도메인 목록을 기준으로 발신 및 수신 메일의 도메인을 확인하려고 합니다. 보내는 메일의 FROM 주소와 받는 메일의 TO/CC/BCC 주소가 로컬 도메인 목록에 없으면 메시지를 거부/삭제하고 싶습니다. 다음은 "acl_not_smpt" 섹션에 있는 내용입니다.
discard
condition = ${if and {{! match_domain{${domain:${address:$h_from:}}}{+local_domains}}\
{if or {\
{! match_domain{${domain:${address:$h_to:}}}{+local_domains}}}\
{! match_domain{${domain:${address:$h_cc:}}}{+local_domains}}}\
{! match_domain{${domain:${address:$h_bcc:}}}{+local_domains}}}\
}\
}\
}\
message = Mail discarded for spoofing
하지만 내 exim 로그에 아래 오류가 발생합니다.
"and{...}" 조건 내의 알 수 없는 조건 "if"
exim 구문이 매우 새로운데 도움을 주셔서 감사합니다.
답변1
두 번째 if
는 올바르지 않으며 실제로는 필요하지 않습니다. and
조건은 모든 부울 함수를 사용할 수 있습니다(참조.확장 조건), 반면에 $if
문자열을 반환합니다(참조:확장 아이템그리고확장 연산자). 또한 몇 가지 추가 사항이 있습니다 }
. 작업 조건은 다음과 같습니다.
condition = ${if and {\
{!match_domain{${domain:${address:$h_from:}}}{+local_domains}}\
{ or {\
{! match_domain{${domain:${address:$h_to:}}}{+local_domains}}\
{! match_domain{${domain:${address:$h_cc:}}}{+local_domains}}\
{! match_domain{${domain:${address:$h_bcc:}}}{+local_domains}}\
}}\
}}
이 조건에는 몇 가지 버그가 있습니다. 여러 수신자와 주소를 확인하지 않습니다 From:
.
또한acl_not_smtpACL은 (로컬) 사용자가 다음과 같이 exim4를 호출할 때만 실행됩니다.-bm 또는 -bS 옵션. 이는 ACL이 로컬 사용자가 보내는 메일을 보내는 것을 차단한다는 의미입니다.
이것이 당신이 원하는 일이라면 표현을 단순화할 수 있습니다:
헤더 확인은
From:
Exim의 구성을 보다 효과적으로 수행할 수 있습니다.신뢰할 수 있는 사용자.To:
,Cc:
및 를 별도로 확인하는 대신 분리된 문자열 에 모두 포함된 변수를Bcc:
사용할 수 있습니다 .$recipients
,
이 모든 것은 두 개의 ACL 스탠자로 구성됩니다.
accept
condition = ${if forall {<,${recipients}}\
{match_domain{${domain:${item}}}{+local_domains}}\
}
deny
SMTP
일반적으로 다음을 생성(또는 저장)하고 이메일(예: email.eml
)을 실행하여 문자열 확장 및 비 ACL을 디버깅할 수 있습니다 .
exim4 -d-all+acl+expand -bm -t < email.eml
루트(경고: 실제 이메일 전달을 시도합니다. 확장 실행만 확인하려면 다음을 수행합니다.
exim4 -bem email.eml