Bagaimana mengkonfigurasi postfix untuk mem-pipe semua email yang masuk ke skrip?


24

Dengan menggunakan postfix, saya ingin semua email masuk, ke alamat apa pun (termasuk yang tidak dipetakan ke pengguna lokal) untuk disalurkan ke skrip. Saya sudah mencoba mengkonfigurasi mailbox_commanddi /etc/postfix/main.cf:

mailbox_command = /path/to/myscript.py

Ini berfungsi baik jika pengguna adalah pengguna lokal, tetapi gagal untuk pengguna "tidak dikenal" yang tidak memiliki alias. Saya mencoba pengaturan luser_relayke pengguna lokal, tetapi ini pre-empts mailbox_command, sehingga perintah tidak bisa dijalankan. Saya mencoba pengaturan local_recipient_maps=(string kosong), tetapi pesan masih terpental (pengguna tidak dikenal).

Apakah ada doa ajaib yang bisa saya gunakan untuk membuat semua pengguna yang dikenal dan tidak dikenal pergi ke skrip juga?

Lengkap /etc/postfix/main.cfberikut - ini adalah Ubuntu 10,04 default, dengan pengecualian mailbox_commandbaris:

# 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

Setelah skrip, lalu bagaimana? Ini kedengarannya seperti yang dilakukan oleh pemindai virus dan filter spam, mungkin Anda dapat menemukan panduan untuk mengonfigurasi salah satunya dan menggunakan konfigurasinya untuk skrip Anda?
DerfK

Pesan masuk ke aplikasi web. Jadi setelah script: database, pemrosesan lainnya, hal-hal lain, tetapi bukan hal-hal surat biasa. Pertanyaan kuncinya adalah membuat pengguna yang tidak dikenal tidak terpental - ini berada di luar skenario virus / spam yang normal, tempat Anda akan memantulkan pengguna yang belum dipetakan.
user67641

@ user67641 hai apakah saya perlu menyuntikkan surat ke postfix dalam skrip saya atau dengan menambahkan beberapa baris lagi di master.cf
merveotesi

Jawaban:


32

Ok, saya baru saja bekerja - meskipun lebih haiier daripada yang saya kira. Saya menjatuhkan maildir_commandbagian itu, dan pergi bersama transport_maps. Kuncinya adalah melakukan 5 hal:

  1. Siapkan file db untuk menangani alias (dan tambahkan catch-all alias)
  2. Siapkan file db untuk memetakan 'transportasi' untuk domain yang dimaksud ke penangan khusus.
  3. Kompilasi file db ke format berkeley db yang diinginkan postfix.
  4. Atur pawang /etc/postfix/master.cfuntuk mengirim mail ke skrip.
  5. Atur /etc/postfix/main.cfuntuk menggunakan transport db untuk transport_maps, dan alias db untuk virtual_alias-maps.

(1) Buat /etc/postfix/virtual_aliasesuntuk menambahkan alias catch-all - localuserperlu pengguna lokal yang ada:

@mydomain.tld   localuser@mydomain.tld

(2) Buat /etc/postfix/transportuntuk menambahkan pemetaan transportasi. "mytransportname" dapat berupa apa pun yang Anda inginkan; digunakan di bawah ini di master.cf:

mydomain.tld    mytransportname:

(3) Selanjutnya, keduanya transportdan virtual_aliasesperlu dikompilasi ke file berkeley db:

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

(4) Tambahkan transportasi ke /etc/postfix/master.cf:

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

(5) Dalam /etc/postfix/main.cf:

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

Dan ... senang pergi! Sheesh.


1
jawaban yang sangat berguna
merveotesi

1
Peta alias virtual tidak diperlukan. Anda dapat melakukan hal yang sama dengan relay_domains(dalam hal ini file transport dapat memfilter berdasarkan alamat To: aktual).
Brilliand

Saya menemukan Anda dapat merutekan semua surat virtual ke skrip dengan virtual_transport = mailcaptcha:masuk main.cfdan mailcaptcha unix - n n - - pipe flags=FR user=vmail argv=/usr/bin/perl /usr/local/mail-captcha/verify.pl ${sender} ${recipient}masuk master.cf. Lihat postfix.org/transport.5.html dan postfix.org/VIRTUAL_README.html .
Chloe

(4) harus dalam satu baris, benarkan? Juga bukankah itu memerlukan postfix restartatau reloadatau sesuatu seperti ini? Hal terakhir: apakah ada file log untuk melihat mail yang datang ke postfix?
Basj

@ Basj, file lognya adalah /var/log/mail.log.
fiedl

4

Satu-satunya waktu saya menggunakan sesuatu seperti ini adalah untuk kotak surat pengguna tertentu. Semua yang diperlukan adalah alias nama pengguna itu ke pipa dan proses dalam alias:

pong: "| /usr/local/bin/gotit.pl"

Lalu lintas yang dikirim ini ditujukan untuk "pong@mymailserver.com" ke skrip perl yang saya tulis untuk memprosesnya.

gotit.pl (sebagai contoh, jangan pilih saya karena skill pemrograman jelekz =). Tugasnya adalah memproses email yang saya kirim ke server Exchange kami (yang dijawab secara otomatis melalui beberapa kode VB) untuk memverifikasi bahwa Exchange memproses email secara tepat waktu. Jika tidak, server email akan mengirimkan email peringatan ke pager kami dan menulis file kunci agar kami tidak terus-menerus terkena spam.

#! /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;
    }
}

Ya, dan redirect @ mydomain.tld ke pong dan semua main yang masuk untuk mydomain.tld akan disalurkan.
Zaar Hai

dan bagi kita yang menggunakan beberapa domain virtual, jangan lupa untuk mengarahkan ulang ke pong @ localhost sehingga tidak melampirkan nama domain default ke alias
therightstuff

0

Saya telah menggunakan "flat file" gaya lama Mailboxuntuk menerima semua email (dan kemudian memangkasnya setiap beberapa jam jika besar), daripada menggunakan maildir/folder modern , untuk memproses email melalui skrip. Anda dapat menjalankan logrotate di atas file juga saya kira untuk membuatnya dapat dikelola.

Dengan cara ini Anda cukup menyalin semua email ke Kotak Surat sebagai pengguna lokal.


0

Setelah banyak sakit kepala saya kumpulkan solusi ini berdasarkan pada beberapa sumber berbeda yang menghasilkan usaha yang jauh lebih sedikit, langkah-langkah kritisnya adalah mengonfigurasi virtual_alias_domainsjuga virtual_alias_mapsdan memastikan bahwa pemetaan virtual adalah untuk my-alias@localhostalih-alih adil my-alias. Dalam contoh saya alias perintah adalah untuk menyalurkan email ke titik akhir API situs web, tetapi bisa juga dengan mudah menyalurkan ke hal lain.

Berikut langkah-langkah yang harus Anda ambil:

  • Siapkan data A dan MX Anda untuk domain Anda, A record @ yang menunjuk ke IP server tempat Anda akan menerima email dan MX dengan nama host @ dan nilainya 10 mail.your-domain-name
  • sudo apt-get install postfix
  • Pilih "Situs Internet" dan masukkan nama domain Anda (memenuhi syarat)
  • sudo vi /etc/postfix/main.cf
  • Tambahkan mail. Domain-nama Anda ke daftar mydestinationnilai
  • Menambahkan
virtual_alias_domains = hash:/etc/postfix/virtual_domains
virtual_alias_maps = hash:/etc/postfix/virtual

ke akhir file

  • 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

(bidang #domain menekan peringatan)

  • 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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.