Bagaimana cara saya mengatur postfix untuk menyimpan email dalam file alih-alih mengirimkannya?

9

Saya ingin menjalankan salinan pementasan server produksi di lingkungan lokal. Sistem menjalankan aplikasi PHP, yang mengirim e-mail ke pelanggan dalam berbagai skenario dan saya ingin memastikan tidak ada e-mail yang pernah dikirim dari lingkungan pementasan.

Saya dapat mengubah kode sehingga menggunakan pengirim email tiruan, tetapi saya ingin menjalankan kode yang sama persis dengan lingkungan produksi. Saya dapat menggunakan MTA yang berbeda (Postfix adalah apa yang kami gunakan dalam produksi), tetapi saya menginginkan sesuatu yang mudah diatur di bawah Debian / Ubuntu :)

Jadi, saya ingin mengatur instalasi Postfix lokal untuk menyimpan semua email dalam (satu atau lebih) file alih-alih menyampaikannya. Sebenarnya, saya tidak terlalu peduli bagaimana ini disimpan selama masih layak untuk memeriksa email yang dikirim. Bahkan opsi pengaturan yang memberi tahu postfix untuk menyimpan e-mail dalam antrian surat akan berfungsi (saya dapat membersihkan antrian ketika saya memuat ulang server pementasan dengan salinan dari produksi).

Saya tahu ini mungkin, saya hanya belum menemukan solusi online yang bagus untuk apa yang sepertinya merupakan kebutuhan umum.

Terima kasih!

GomoX
sumber

Jawaban:

12

Saya membuat transportasi baru dengan perintah pipa yang menulis email ke file.

Pada dasarnya:

  1. Buat pengguna yang akan memiliki email (atau gunakan yang sudah ada). Saya menelepon milik sayaemail
  2. mkdir /home/email/bin
  3. Tempatkan skrip berikut /home/email/bin/mail_eater(ini menggunakan PHP, tetapi Anda dapat menulis versi Anda sendiri dalam bahasa apa pun yang Anda suka, itu hanya menambahkan stdin ke file):

    #!/usr/bin/php
    <?php
    $fd = fopen("php://stdin", "r");
    $email = "";
    while (!feof($fd)) {
        $email .= fread($fd, 1024);
    }
    fclose($fd);
    $fh = fopen('/home/email/email.txt','a');
    fwrite($fh, $email."\n-------------------------------------------------------\n\n");
    fclose($fh);
    
  4. chmod a+x /home/email/bin/mail_eater
  5. touch /home/email/email.txt
  6. chmod a+r /home/email/email.txt
  7. Buat transportasi baru menggunakan file ini dengan menambahkan baris berikut di master.cf:

    file_route unix -    n    n    -    -    pipe user=email  argv=/home/email/bin/mail_eater
    
  8. Gunakan ini sebagai transportasi default di main.cf:

    default_transport = file_route
    

Ada :)

GomoX
sumber
3

Anda bisa memasukkan domain-domain itu ke $mydestinationdalam main.cf, jadi postfix akan mengirimkannya secara lokal.

Anda dapat mengatur pengguna lokal yang berbeda jika Anda mau atau Anda dapat mengatur alamat catch-all lokal untuk mengirimkan email hanya ke satu akun, lebih detail di sini: http://www.postfix.org/ADDRESS_REWRITING_README.html#luser_relay

Untuk semua domain:

mydestination = pcre:/etc/postfix/mydestinations

dan /etc/postfix/mydestinationsharus mengandung

/.*/    ACCEPT

Saya tidak dapat menguji sekarang tetapi itu harus bekerja.

Laurentiu Roescu
sumber
Saya tidak tahu seperti apa domain tujuan (berasal dari basis data pelanggan nyata). Saya akan memeriksa tautannya.
GomoX
Terima kasih atas pembaruannya, saya memposting solusi saya sendiri untuk masalah ini karena sepertinya "lebih bersih" tapi sepertinya solusi Anda juga bisa digunakan.
GomoX
Agar berfungsi sebagaimana dimaksud, ini juga memerlukan pengaturan local_recipient_maps = . Itu dijelaskan dalam tautan yang Anda berikan, tetapi saya pikir itu juga harus disebutkan dalam jawabannya.
jojman
2

coba (di main.cf):

defer_transports = smtp

Anda kemudian dapat melihat antrean postqueue -pdan menonton konten denganpostcat

Arek B.
sumber
0

Bergantung pada distribusi Anda, Anda dapat melihat "nullmailer". Ini adalah MTA relay, yang relay ke SMTP lain di jaringan Anda atau jarak jauh. Ini bisa jadi SMTP yang tidak valid, dan dalam hal itu mungkin hanya akan memasukkannya ke dalam antrian pada folder di mesin.

Pada debian dan ubuntu ini tersedia sebagai MTA pengganti untuk sistem Anda.

jishi
sumber
0

Ini disalin dan sedikit dimodifikasi dari blog saya http://blog.malowa.de/2011/04/postfix-as-spam-trap-server.html :

Anda bahkan tidak perlu mengonfigurasi Postfix untuk bertindak sebagai nullmailer. Postfix dikirimkan dengan alat yang disebut smtp-sinkyang melakukan trik. smtp-sink terutama dimaksudkan untuk bertindak sebagai alat pengujian untuk klien SMTP yang membutuhkan Server untuk bermain. Jadi, Anda dapat mengonfigurasinya untuk mencatat seluruh percakapan atau bahkan membuang setiap email yang diterima ke file. Yang terakhir diperlukan untuk nullmailer.

Tidak ada file konfigurasi untuk mengkonfigurasi smtp-sink. Semuanya dilakukan melalui opsi baris perintah.

smtp-sink -c -d "%Y%m%d%H/%M." -f . -u postfix -R /tmp/ -B "550 5.3.0 The recipient does not like your mail. Don't try again." -h spamtrap.example.com 25 1024

Mari kita melihat lebih dekat ke setiap parameter.

-u postfix
Runs the program under the user "postfix"
-R /tmp/
Sets the output directory to /tmp/. In this directory the mails will be stored. If you have a high spam volume (hundreds of Spam per minute) it is recommended to write the mails to a ramdisk
-d "%Y%m%d%H/%M."
Writes the mail to a directory of the format "YearMonthDayHour" and in this directory the files are name "Month.RandomID". Note that the dates are in UTC
-c
Write statistics about connection counts and message counts to stdout while running
-f .
Reject the mail after END-OF-DATA. But the mail will be saved. Cool, isn't it?!
-B "550 5.3.0 The recipient does not like your mail. Don't try again"
This is the rejection message after END-OF-DATA.
-h spamtrap.example.com
Announce the hostname spamtrap.example.com
25
The port to listen on. Can be prepended with an IP or host if you want to bind on a special interface.
1024
The backlog count of connections that can wait in the TCP/IP stack before they get a free slot for sending mail.

Anda dapat menemukan lebih banyak informasi di halaman manual smtp-sink, tetapi ini adalah yang penting untuk menjalankan catch-all spamtrap. Dalam konfigurasi ini, program menerima surat apa pun dengan ukuran apa pun dari pengirim apa pun ke penerima mana pun dengan IPv4 dan IPv6. Satu-satunya batasan adalah bahwa hanya ada 256 koneksi simultan yang mungkin dengan 1024 koneksi yang antri dan program ditandai percobaan. Jadi jangan gunakan smtp-sink di lingkungan produksi.

Opsi -B hanya valid di versi Postfix yang lebih baru. Di 2.7.1 tidak ada. Di 2.8.2 hadir. Di suatu tempat di antara itu diperkenalkan.

mailq
sumber