목표

목표

숨은 참조로[이메일 보호됨]사용자, 우리는 그렇습니다~ 아니다사람들이 숨은 참조 목록을 받기를 원합니다.[이메일 보호됨]"사용자".

목표

  1. 우리는 postfix를 거쳐 보내고 받은 모든 메일을 보관하고 싶습니다. 설정에는 다음이 사용됩니다.
  • 접미사,
  • Pam(Ldap에서 가져오기) 사용자를 통한 비둘기장 인증,
  • 우편함을 통해 배달됩니다.비둘기장(Dovecot)의 LMTP.
  1. 메시지 아카이브에 숨은 참조 수신자를 포함하려고 합니다.

  2. 우리는하다~ 아니다사람들이 숨은 참조 목록을 받기를 원합니다.[이메일 보호됨]"사용자".

재판

  1. Always_bcc 사용 =[이메일 보호됨] 공장. 그러나 숨은 참조 수신자(권한에 따라 헤더가 아닌 RCPT TO 봉투에 있음)는 손실됩니다.

  2. 사용: (에 따라Postfix 이메일을 보관하고 헤더의 숨은 참조 정보를 보존하기 위한 옵션은 무엇입니까?)

main.cf
smtpd_recipient_restrictions =
  check_recipient_access pcre:/etc/postfix/prepend.pcre

pcre 표현식은 다음과 같습니다.

prepend.pcre
/(.+)/          PREPEND X-Envelope-To: $1

그것은 매력처럼 작동합니다: 저장된 내 메시지에는 To:;라는 헤더가 있습니다. 참조; X-봉투-To. 어느 날 우리가 그것을 파고들어야 할 때, 숨은 참조에서도 누가 메시지를 받았는지 알 수 있습니다. (주의: X-Envelope-To에는 받는 사람과 참조 사람, 그리고 외부 도메인 수신자가 포함됩니다.)

  1. X-Envelope-To를 제거하려면 다음을 수행하십시오.
smtp_header_checks = pcre:/etc/postfix/smtp_header_checks.pcre

내용:

smtp_header_checks.pcre
/^X-Envelope-To:/               IGNORE

거기까지는 괜찮습니다.

문제

서버를 떠나지 않는 이메일에 대한 X-Envelope-To를 제거합니다. 나는 그랬다:

lmtp_header_checks = pcre:/etc/postfix/lmtp_header_checks.pcre

lmtp_header_checks.pcre
/^X-Envelope-To:/               IGNORE

하지만 이는 선택적이 아니더라도[이메일 보호됨]숨은 참조 목록에 "저장된" 헤더가 손실됩니다.

해당 헤더 검사는 라인 자체만 평가하고 수신자를 사용하여 조건을 만들 수 없기 때문에 선택적인 헤더 검사 방법을 찾을 수 없습니다(pcre의 "if"를 사용하더라도). (http://www.postfix.org/pcre_table.5.html)

사용할 수 있는 변수가 있나요? 생각은 다음과 같습니다: "[이메일 보호됨]" lmtp_header_checks.pcre의 앞에 추가된 X-Envelope-To 헤더에 다음과 같은 내용을 포함합니다.[이메일 보호됨]$LMTP_DELIVERY_RECIPIENT Delivered-To 또는 X-Delivered-To와 같지 않으면 pcre가 변수로 평가할 수 없는 별도의 헤더로 유지됩니다.

그렇지 않으면 lmtp가 일부 milter를 트리거하도록 하는 방법이 있습니까? 그리고 이를 위해 간단한 lmtp_milter 필터를 사용할 수 있습니까?

가능한 모든 문서에서 며칠 동안 추적 중입니다. 미리 감사드립니다.

답변1

바로 이거 야 ! 정말 감사합니다.

X-Envelope-To시브(sieve) 언어는 여러 헤더 에 대한 반복을 허용하지 않습니다 . 따라서 이를 외부 프로그램에 전달해야 합니다.

내가 생각해낸 내용은 다음과 같습니다.

require "fileinto";
require "imap4flags";
require ["editheader", "envelope"];
require "vnd.dovecot.filter";
if header :contains "X-Spam-Flag" "YES"
{
   fileinto "Junk";
   stop;
}
if envelope :is "to" "[email protected]" {
   filter "EnvelopeToBcc.sh";
} else {
   deleteheader "X-Envelope-To";
}
#!/bin/bash
# Store mail in a variable
# input stream
mail=`cat /dev/stdin`
# Extract headers
envelope=$(echo "$mail" | formail -x X-Envelope-To | tr -d '\015')
tos=$(echo "$mail" | formail -x To  | tr -d '\015')
copies=$(echo "$mail" | formail -x Cc  | tr -d '\015')

# Loop excluding the To: fields and concatenate in variable
bcc=""
for i in $envelope; do
        if [[ ${tos} != *"${i}"* && ${copies} != *"${i}"* ]];then
                bcc="${bcc} ${i},"
        fi
done
# Eliminate trailing comma
bcc=$(echo $bcc | sed s/,$//)
# Add Bcc header to mail 
echo "${mail}" | formail -a "Bcc: $bcc"

MUA로 아카이브를 열면 숨은 참조가 다시 빌드된 것을 볼 수 있습니다. 주의: 스크립트를 조금 더 길게 작성하면 숨은 참조 목록에 있는 사람에게 항목이 중복되는 것을 방지할 수 있습니다.

답변2

Sieve 언어를 사용하세요.

메일은 LMTP를 통해 Dovecot으로 전달되므로 간단한 Postfix 헤더 검사에서 제공하는 것보다 더 복잡한 논리 기능을 갖춘 모든 주소 지정 및 헤더 편집 기능을 사용할 수 있습니다.

아직 Pigeonhole sieve를 사용하지 않는 경우 Dovecot 플러그인으로 활성화하고 스크립트에 필요한 확장을 활성화하고 적합한 스크립트를 구성해야 할 수도 있습니다.

# step1 enable sieve (append to $mail_plugins to *add*)
protocol lmtp {
  mail_plugins = $mail_plugins sieve
}
# step2 enable sieve extensions, as required (prefix with + to *add*)
plugin {
    sieve_extensions = +editheader
}
# step3 configure the path a of a script to be executed

그런 다음 전역적으로 실행되는 스크립트에서 또는 봉투 주소를 볼 수 없는 사용자를 위해 특별히 실행되는 스크립트에서 헤더를 삭제합니다(보관 사서함으로 전달되지 않는 한).

require ["editheader", "envelope"];
if not envelope :is "to" "[email protected]" {
    deleteheader "X-Envelope-To";
}

관련 정보