Jalankan skrip pada saat menerima email


8

Saya menjalankan server surat Postfix / Dovecot untuk penggunaan pribadi. Hanya ada beberapa kotak surat yang sebenarnya, pada dasarnya adil postmaster@domain.comdan username@domain.com.

Saya sering menggunakan virtualfile untuk membuat kotak surat virtual diteruskan ke username@domain.com. Saya memiliki sejumlah akun ini untuk akun sekali pakai seperti pembelian satu kali dari toko online, game online yang ingin saya coba tanpa khawatir tentang spam yang sedang berlangsung, dll. Untuk melakukannya, saya SSH dan menjalankan perintah berikut:

sudo vim /etc/postfix/virtual
# add a line that looks like:
# # username_servicename@domain.com      username@domain.com
sudo postmap virtual
sudo service postfix restart

Saya melakukan ini dengan frekuensi yang cukup sehingga saya ingin mengotomatiskan proses sampai tingkat tertentu. Saya dianggap hanya menulis skrip shell yang mengambil kotak surat virtual dan kotak surat nyata sebagai argumen dan membuat perubahan itu sendiri, tetapi saya berharap untuk sesuatu yang lebih mudah.

Saya ingin dapat mengirim email dari username@domain.comke beberapa kotak surat lain di server dengan nama kotak surat virtual sebagai badan pesan. Masalahnya adalah sudopanggilan tetapi saya bisa membuat pengguna baru yang satu-satunya tanggung jawab untuk menangani ini yang harus mengatasinya.

Sebagian besar pertanyaannya adalah ini: bagaimana saya membuat acara yang akan dipicu oleh email? Apakah ada layanan di suatu tempat yang melakukan ini? Bisakah saya mengonfigurasi Postfix atau Dovecot untuk mendengarkan email itu dan menjalankan perintah pada acara itu?


Sudahkah Anda memeriksa tautan ini ?
kirill-a

@ Kirill-a tidak, aku tidak. Sepertinya itu bisa bertujuan untuk menyelesaikan masalah ini, dan sekarang saya akhirnya punya alasan yang bagus untuk belajar PHP
Adam Smith

Anda tidak perlu belajar PHP: cukup ganti skrip shell Anda sendiri dengan skrip PHP, dan Anda selesai.
MariusMatutiae

@MariusMatutiae jika Anda atau kirill-a ingin menulis jawaban tentang topik itu kemudian (dengan asumsi itu berhasil) Saya akan dengan senang hati memberikan hadiahnya
Adam Smith

@ kirill-a tanda terima kasih untuk komentar saya, di atas.
Adam Smith

Jawaban:


8

Prosedur yang benar untuk menjalankan skrip (saya menggunakan skrip shell) setelah menerima pesan email adalah sebagai berikut. Ini melibatkan memodifikasi file konfigurasi postfix , master.cf (yang, di Debian saya, terletak di / etc / postfix ) dengan menambahkan baris berikut:

 my_shell_script unix - n n - - pipe flags=F user=MY_USERNAME argv=/path/to/my/shell/script ${sender} ${size} ${recipient}

yang menginstruksikan postfix untuk menjalankan skrip (Anda harus membuatnya dapat dieksekusi) ketika beberapa peristiwa terjadi.

Untuk menentukan kapan harus mengeksekusi skrip, Anda lakukan sebagai berikut: misalkan Anda ingin mengeksekusi ketika username@domain.com menerima pesan. Tempatkan baris berikut

 username@domain.com FILTER my_shell_script:dummy

di dalam file /etc/postfix/address.txt ; Anda perlu membuat database yang tepat untuk postfix untuk menggunakan file ini, yang Anda selesaikan dengan

  postmap /etc/postfix/address.txt

yang menghasilkan sebagai file yang disebut /etc/postfix/address.db . Sekarang kembali ke file /etc/postfix/main.cf dan tambahkan baris berikut:

 smtpd_recipient_restrictions = check_recipient_access hash:/etc/postfix/access, permit_mynetworks, reject_unauth_destination

Sekarang restart postfix ,

  postfix reload

dan kamu harus baik untuk pergi.


2
Bukankah maksud Anda 'check_recipient_access hash: / etc / postfix / address' di sini? Anda menggunakan "akses" di mana saya pikir Anda maksudkan "alamat", berdasarkan instruksi Anda.
Lee Fuller

3
Apakah ini sama jika Anda menjalankan virtual_mailboxes untuk berbagai domain virtual? Saya telah mengikuti instruksi ini kata demi kata - dan jika saya tidak mendeklarasikan virtual_alias saya mendapatkan pantulan. Jika saya lakukan, itu mengirimkan pesan ke kotak surat tetapi tidak memicu skrip.
Lee Fuller

Saya tidak mendapatkan ini untuk bekerja. Jawaban ini berhasil: serverfault.com/questions/322657/…
jlh

Dari apa yang saya pahami, solusi ini juga memiliki masalah yang hanya akan memicu pesan yang diterima melalui SMTP. sendmaillangsung di server tidak akan memicu ini.
Philip Couling

@ PhilipCouling Lihat jawaban ini: unix.stackexchange.com/a/179407 . Anda dapat menggunakan pickupopsi ini.
Stephan

4

Saya dapat melihat dua solusi yang jelas.

Jika Anda menggunakan procmail sebagai MDA di server Anda, atau bersedia mengonversi untuk menggunakannya, maka Anda dapat menjalankan skrip sewenang-wenang pada email sembarang melalui |tindakan resep (pipa) procmail . Mudah-mudahan itu tidak akan dimulai sebagai root, tetapi harus mudah untuk membuat skrip yang melakukan sihir yang diperlukan dan yang dapat dipanggil tanpa password sebagai root oleh pengguna yang relevan. Output dari skrip bahkan dapat diumpankan kembali ke email yang sama dan email kemudian dikirimkan dengan membuat resep sebagai tindakan filter.

Alternatif (yang seharusnya tidak membutuhkan perawatan langsung) adalah membuat satu kotak surat dan mengkonfigurasi Postfix$recipient_delimiter menjadi sesuatu yang biasanya tidak digunakan untuk tujuan itu; misalnya, .atau -. Perhatikan bahwa recipient_delimeter adalah pengaturan di seluruh server. Katakanlah Anda mengatur kotak surat dummy@example.comdan mengatur $recipient_delimeter = .. Ini kemudian akan memungkinkan dummy.<anything>@example.comyang akan dikirimkan ke kotak surat lokal yang sesuai dengan dummy@example.com. Untuk menonaktifkan salah satunya, tambahkandummy.<whatever>@example.comke tabel penerima yang sesuai dengan tindakan tolak. Kelemahannya adalah kotak surat ini akan menampung semua awalan untuk awalan, jadi Anda ingin membuat awalan tersebut sulit tersandung oleh serangan kamus atau kecelakaan. Sisi baiknya adalah dalam kasus normal (pengirim menghormati keinginan Anda dan tidak menjual kembali alamat email Anda) pendekatan ini tidak memerlukan pemeliharaan, dan Anda selalu dapat mengubah awalan nanti dan secara eksplisit daftar kombinasi yang ingin Anda terus terima email untuk .


Saya tidak terikat dengan Postfix untuk alasan apa pun selain dari apa yang saya miliki saat ini. Saya lebih suka mencari solusi yang akan bekerja dengan MDA / MTA saya saat ini. Adapun pembatas: Saya hampir tidak percaya bahwa pengirim akan menghormati keinginan saya dan tidak menjual kembali alamat email saya, atau saya akan memberi mereka alamat permanen :)
Adam Smith

@AdamSmith Perbedaannya adalah, dengan sesuatu seperti alternatif kedua saya, Anda dapat menonaktifkan alamat yang Anda berikan pada entitas tertentu tanpa menyebabkan masalah di tempat lain, dan alamat tersebut terlihat masuk akal bahkan untuk membuat pengukur otomatis yang bodoh. Sedangkan untuk menjaga MDA / MTA, procmail dapat digunakan sebagai pengganti untuk MDA Postfix; tidak perlu mengganti Postfix sebagai MTA Anda.
CVn

procmail tidak lagi dipertahankan: lihat lwn.net/Articles/416901 , sebuah artikel dengan judul: Laporan kematian procmail tidak terlalu dilebih-lebihkan. Lebih baik mainkan dengan aman, dan ikuti saran @ kirill-a.
MariusMatutiae

procmail masih banyak digunakan, dan (IMHO) tetap menjadi solusi terbaik untuk pemfilteran ad hoc. Catatan MariusMatutiae tentang kematiannya secara efektif hanya berlaku untuk pengembangannya. Saya tidak bisa memikirkan bug procmail yang pernah saya alami, dan saya telah melakukan hal-hal konyol seperti menerapkan milis lengkap di dalamnya. Mungkin belum menerima pengembangan lebih lanjut karena satu-satunya arah untuk mengambilnya akan berada di luar ruang lingkupnya (misalnya anti-spam, lebih baik dilayani oleh SpamAssassin atau misalnya milter-greylist ).
Adam Katz

Dan Anda mengatakan ini kepada saya karena ....?
MariusMatutiae

2

Jika tautan turun, berikut ringkasannya.

Pertama, buka master.cfdan daftarkan skrip Anda "myhook" dengan menambahkan baris berikut:

myhook unix - n n - - pipe flags=F user=www-data argv=/path/to/script.sh ${sender} ${size} ${recipient}

Juga, edit baris smtp untuk memberi tahu Postfix untuk menjalankan filter untuk semua surat yang datang melalui pengiriman SMTP:

smtp inet n - - - - smtpd -o content_filter=myhook:dummy

Harap perhatikan bahwa jika Anda mengirim email menggunakan perintah "sendmail", filter tidak akan terpicu. Dalam hal ini, tambahkan opsi setelah metode pengiriman "pickup":

pickup fifo n - - 60 1 pickup -o content_filter=myhook:dummy

Mulai ulang postfix: postfix reload

Jadikan skrip Anda dapat dibaca dan dieksekusi oleh siapa saja: chmod +rx script.sh

Perhatikan bahwa skrip selalu dipicu untuk semua surat yang masuk. Untuk menentukan alamat yang tepat, lihat jawaban @MariusMatutiae.


yang membuat saya "kesalahan transport surat tidak dikenal" ...
user1133275
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.