들어오는 모든 전자 메일을 스크립트로 파이프하도록 postfix를 구성하는 방법은 무엇입니까?


24

postfix를 사용하여 모든 수신 메일을 모든 주소 (로컬 사용자에게 매핑되지 않은 주소 포함)에 스크립트로 파이프하고 싶습니다. 나는 구성 mailbox_command을 시도 했다 /etc/postfix/main.cf:

mailbox_command = /path/to/myscript.py

사용자가 로컬 사용자 인 경우에는 효과가 있지만 별칭이없는 "알 수없는"사용자에게는 실패합니다. luser_relay로컬 사용자로 설정 을 시도 했지만이 경우 선점 mailbox_command하므로 명령이 실행되지 않습니다. 설정 local_recipient_maps=(빈 문자열)을 시도했지만 여전히 메시지가 반송됩니다 (알 수없는 사용자).

알려 지거나 알려지지 않은 모든 사용자가 스크립트로 이동하는 데 사용할 수있는 마술적인 호출이 있습니까?

전체는 /etc/postfix/main.cf다음을 제외하고 기본 우분투 10.04입니다 mailbox_command.

# See /usr/share/postfix/main.cf.dist for a commented, more complete version


# Debian specific:  Specifying a file name will cause the first
# line of that file to be used as the name.  The Debian default
# is /etc/mailname.
#myorigin = /etc/mailname

smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu)
biff = no

# appending .domain is the MUA's job.
append_dot_mydomain = no

# Uncomment the next line to generate "delayed mail" warnings
#delay_warning_time = 4h

readme_directory = no

# TLS parameters
smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
smtpd_use_tls=yes
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache

# See /usr/share/doc/postfix/TLS_README.gz in the postfix-doc package for
# information on enabling SSL in the smtp client.

myhostname = ... snip ...
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
mydestination = sassafras, ... snip ...,localhost.localdomain, localhost
relayhost =
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all

mailbox_command = /path/to/my/script.py

스크립트가 끝나면 어떻게해야합니까? 이것은 바이러스 스캐너와 스팸 필터가하는 일처럼 들립니다. 아마도 그중 하나를 구성하고 스크립트에 구성을 사용하는 방법에 대한 가이드를 찾을 수 있습니까?
DerfK

메시지는 웹 응용 프로그램으로 이동합니다. 따라서 스크립트 다음에는 데이터베이스, 기타 처리, 기타 항목이지만 일반 메일 항목은 아닙니다. 주요 질문은 알 수없는 사용자가 반송되지 않도록하는 것입니다. 이는 일반적인 바이러스 / 스팸 시나리오 외부에서 매핑되지 않은 사용자를 반송하는 것입니다.
user67641

@ user67641 안녕하세요, 스크립트에서 postfix에 메일을 삽입하거나 master.cf에 줄을 더 추가해야합니다
merveotesi

답변:


32

좋아, 내가 생각했던 것보다 더 털이 있지만 방금 작동했습니다. 나는 그 maildir_command부분을 ​​버리고 함께 갔다 transport_maps. 핵심은 5 가지 일을하는 것입니다.

  1. 별명을 처리하도록 DB 파일을 설정하고 모든 별명을 추가하십시오.
  2. 문제의 도메인에 대한 '전송'을 특수 처리기에 매핑하도록 db 파일을 설정하십시오.
  3. DB 파일을 postfix가 원하는 berkeley db 형식으로 컴파일하십시오.
  4. /etc/postfix/master.cf메일을 스크립트로 파이프 하도록 핸들러를 설정하십시오 .
  5. /etc/postfix/main.cf대한 전송 db를 사용 transport_maps하고에 대한 별칭 db 를 사용하도록 설정하십시오 virtual_alias-maps.

(1) /etc/postfix/virtual_aliases포괄 별칭을 추가 localuser하려면 기존 로컬 사용자 여야합니다.

@mydomain.tld   localuser@mydomain.tld

(2) /etc/postfix/transport전송 매핑을 추가합니다. "mytransportname"은 원하는 것이 될 수 있습니다. 아래에서 사용됩니다 master.cf:

mydomain.tld    mytransportname:

(3) 다음으로, 모두 transportvirtual_aliases필요 버클리 DB 파일로 컴파일한다 :

$ sudo postmap /etc/postfix/virtual_aliases
$ sudo postmap /etc/postfix/transport

(4) 전송을 /etc/postfix/master.cf다음에 추가하십시오 .

mytransportname   unix  -       n       n       -       -       pipe
  flags=FR user=localuser argv=/path/to/my/script.py
  ${nexthop} ${user}

(5)에서 /etc/postfix/main.cf:

  ...
  transport_maps = hash:/etc/postfix/transport
  virtual_alias_maps = hash:/etc/postfix/virtual_aliases

그리고 ... 행복하다! esh.


1
매우 유용한 답변
merveotesi

1
가상 별명 맵은 필요하지 않습니다. 동일한 것을 수행 할 수 있습니다 relay_domains(이 경우 전송 파일은 실제 To : 주소를 기준으로 필터링 할 수 있음).
Brilliand

virtual_transport = mailcaptcha:in main.cfmailcaptcha unix - n n - - pipe flags=FR user=vmail argv=/usr/bin/perl /usr/local/mail-captcha/verify.pl ${sender} ${recipient}in 을 사용하여 모든 가상 메일을 스크립트로 라우팅 할 수 있음을 발견 했습니다 master.cf. postfix.org/transport.5.htmlpostfix.org/VIRTUAL_README.html을 참조하십시오 .
Chloe

(4)는 한 줄에 있어야합니다. 맞습니까? 또한 그것은 필요하지 않습니다 postfix restart또는 reload같은 또는 뭔가를? 마지막으로 : postfix에 도착한 메일을 볼 수있는 로그 파일이 있습니까?
Basj

@Basj, 로그 파일은 /var/log/mail.log입니다.
fiedl

4

내가 이와 같은 것을 사용한 유일한 시간은 특정 사용자의 사서함이었습니다. 필요한 것은 해당 사용자 이름을 파이프와 별칭의 프로세스에 별칭으로 지정하는 것입니다.

탁구 : "| /usr/local/bin/gotit.pl"

이것은 "pong@mymailserver.com"으로 향하는 트래픽을 처리하기 위해 작성한 펄 스크립트로 보냈습니다.

gotit.pl (예를 들어, crappy programming skillz =를 선택하지 마십시오). Exchange 서버로 보낸 전자 메일 (일부 VB 코드를 통해 자동 응답 된 전자 메일)을 처리하여 Exchange가 전자 메일을 적시에 처리하고 있는지 확인했습니다. 그렇지 않은 경우 메일 서버는 호출자에게 경고 이메일을 발송하고 잠금 파일을 작성하여 스팸이 발생하지 않도록합니다.

#! /usr/bin/perl -w
use vars qw ( $mung $sent $tvalue $remainder $delta $fout );
$mung = time;
while (<STDIN>) {
    ($sent, $tvalue, $remainder ) = split /: /, $_, 3;
    $tvalue =~ s/(\D+)//g;
    chomp($tvalue);
    $delta = $mung-$tvalue;
    if ( $sent =~ "Sent" ) {
        $fout = "/var/spool/mailcheck/$tvalue";
        next unless ( -e $fout );
        open (TMP, "> $fout") or die "Couldn't open output file: $!\n";
        print TMP "Received in: $delta seconds.\n";
                close TMP;
        last;
    }
}

예, @ mydomain.tld를 pong으로 리디렉션하면 mydomain.tld의 모든 수신 주 파이프가 파이프됩니다.
Zaar Hai

여러 가상 도메인을 사용하여 우리의 사람들을 위해, 그것은 별칭에 기본 도메인 이름을 부착하지 않도록 탁구 @ 로컬 호스트로 리디렉션하는 것을 잊지 마세요
therightstuff

0

스크립트를 통해 메일을 처리하기 Mailbox위해 최신 maildir/폴더 를 사용하는 대신 이전 스타일의 "플랫 파일" 을 사용하여 모든 메일을받은 다음 (큰 경우 몇 시간마다 정리)했습니다 . 파일을 관리 할 수 ​​있다고 생각하면 파일에 대해 logrotate를 실행할 수 있습니다.

이렇게하면 모든 메일을 로컬 사용자로 사서함에 간단히 복사 할 수 있습니다.


0

많은 어려움을 겪고 난 후 노력이 덜 드는 몇 가지 소스를 기반 으로이 솔루션 을 구성 virtual_alias_domains했습니다 . 중요한 단계는 구성 뿐만 아니라 virtual_alias_maps가상 매핑이 my-alias@localhost단지 대신 하는 것입니다 my-alias. 내 예제에서 명령 별칭은 전자 메일을 웹 사이트 API 끝점으로 파이프하는 것이지만 다른 것으로 쉽게 파이프 될 수 있습니다.

수행해야 할 단계는 다음과 같습니다.

  • 도메인에 대한 A 및 MX 레코드를 설정합니다. A 레코드 @는 이메일을 수신 할 서버의 IP를 가리키고 호스트 이름은 @이고 값은 MX입니다. 10 mail.your-domain-name
  • sudo apt-get install postfix
  • "인터넷 사이트"를 선택하고 도메인 이름 (정규화 된)을 입력하십시오.
  • sudo vi /etc/postfix/main.cf
  • mydestination값 목록에 mail.your-domain-name 추가
  • 추가
virtual_alias_domains = hash:/etc/postfix/virtual_domains
virtual_alias_maps = hash:/etc/postfix/virtual

파일의 끝까지

  • sudo apt-get vi /etc/aliases
curl_email: "|curl --data-binary @- http://your-domain-name/email"
  • sudo newaliases
  • sudo apt-get vi /etc/postfix/virtual_domains
example.net   #domain
example.com   #domain
your-domain-name   #domain

(# 도메인 필드는 경고를 표시하지 않습니다)

  • sudo postmap /etc/postfix/virtual_domains
  • sudo apt-get vi /etc/postfix/virtual
info@your-domain-name bob@gmail.com
everyone@your-domain-name bob@gmail.com jim@gmail.com
email_processor@your-domain-name curl_email@localhost
@your-domain-name catchall@whereveryouwant.com
ted@example.net jane@outlook.com
  • sudo postmap /etc/postfix/virtual
  • sudo /etc/init.d/postfix reload
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.