Exim 조건부 논리

Exim 조건부 논리

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

관련 정보