*** frozen ***. Refleks yang paling sering muncul adalah menghapus semuanya supaya queue bersih. Kadang langkah itu aman. Kadang langkah itu justru menghapus satu-satunya petunjuk bahwa ada router yang salah konfigurasi atau akun yang sedang dipakai kirim spam.
Artikel ini membahas cara membaca pesan frozen satu per satu, dari gejala sampai akar masalah, sebelum kita memutuskan mana yang boleh dibuang.
Frozen bukan sekadar email yang tertunda
- Bounce (pesan pemberitahuan gagal kirim) yang ternyata juga gagal dikirim balik ke pengirim aslinya. Ini penyebab yang paling sering.
- Router menemukan bahwa tujuan pengiriman ternyata server itu sendiri, padahal domainnya tidak terdaftar sebagai domain lokal. Opsi router
selfdi Exim secara default bernilaifreeze. - System filter atau admin yang sengaja membekukan pesan.
ignore_bounce_errors_after mengatur bounce frozen, dan timeout_frozen_after mengatur semua pesan frozen. Kalau timeout_frozen_after bernilai 0, pesan frozen biasa tidak pernah dibuang otomatis. Kondisi inilah yang membuat queue bisa menumpuk diam-diam selama berminggu-minggu. Nilai yang aktif di server kamu bisa dicek dengan exim -bP diikuti nama opsinya. Kalau server memakai control panel, cari tahu dulu apakah opsi ini diatur lewat panel, karena perubahan manual di file konfigurasi biasanya tertimpa saat panel membuat ulang config.
Hitung dulu, lalu lihat polanya
BASH
# total pesan di queue (frozen maupun tidak)
exim -bpc
# hanya ID pesan yang frozen
exiqgrep -z -i
# jumlah pesan frozen
exiqgrep -z -i | wc -l
# ringkasan pesan frozen per domain tujuan
exiqgrep -z | exiqsummexim -bp dan turunannya bisa lambat karena harus membaca setiap file di spool. Ini wajar, jadi jangan buru-buru membatalkannya.
Membaca satu pesan lewat header spool dan log
BASH
# header spool: envelope sender, penerima, flag internal, header email
exim -Mvh ID_PESAN
# message log: riwayat percobaan kirim untuk pesan ini saja
exim -Mvl ID_PESAN
# semua baris mainlog yang berkaitan dengan pesan ini
# (path umum di cPanel/RHEL; di Debian/Ubuntu biasanya /var/log/exim4/mainlog)
exigrep 'ID_PESAN' /var/log/exim_mainlog-Mvh, bagian awal berisi data envelope dan flag yang tidak terlihat di header email biasa. Beberapa yang paling berguna:
- Envelope sender. Kalau isinya
<>(kosong), pesan itu adalah bounce yang dibuat oleh server. - Baris
-frozendiikuti angka. Angka itu adalah timestamp kapan pesan dibekukan. - Baris
-auth_id, kalau ada. Ini akun yang login SMTP saat mengirim pesan. Sangat berguna untuk melacak siapa pengirim sebenarnya. - Baris
-host_address, yaitu IP asal koneksi.
Subject dan From.
Header spool menjawab pertanyaan siapa dan ke mana. Alasan pesan dibekukan biasanya ada di -Mvl atau mainlog, di baris sesaat sebelum pesan berubah status. Untuk bounce yang gagal, biasanya ada keterangan seperti Frozen (delivery error message) setelah server tujuan menolak. Untuk masalah routing, cari pesan error dari router, misalnya keterangan bahwa MX record terendah mengarah ke host lokal.
Isi body (exim -Mvb) sebaiknya dibuka hanya kalau benar-benar perlu, karena bisa berisi data pribadi pelanggan. Untuk bounce, body memang sering diperlukan karena memuat potongan pesan asli yang gagal.
Yang biasanya aman dihapus
<>, penerima berupa alamat eksternal yang tidak dikenal, dan log yang menunjukkan server tujuan menolak dengan alasan alamat tidak ada atau domain tidak bisa di-resolve. Pesan seperti ini tidak akan pernah sampai. Menyimpannya hanya memakan ruang dan inode di spool.
Meski aman dihapus, tetap tanyakan kenapa bounce itu dibuat sejak awal. Kalau penerima bounce adalah alamat acak yang jelas palsu, server mungkin menerima spam lalu memantulkannya balik ke alamat pengirim yang dipalsukan. Pola ini sering muncul dari forwarder, autoresponder, atau catch-all yang menerima dulu lalu menolak belakangan. Menghapus bounce-nya membersihkan gejala, tapi sumbernya akan terus mengisi queue kalau tidak dibereskan.
Yang menandakan masalah konfigurasi atau keamanan
<>) menuju domain yang di-host di server sendiri, dengan log yang menyebut MX mengarah ke host lokal. Biasanya domain itu MX-nya memang ke server ini, tapi Exim tidak menganggapnya sebagai domain lokal. Router lalu melihat dirinya sendiri sebagai tujuan, dan karena opsi self bernilai freeze, pesan dibekukan. Penyebab umumnya domain baru dipindah atau ditambahkan tapi belum masuk daftar domain lokal. Di server cPanel, daftar ini biasanya dikelola lewat file seperti /etc/localdomains dan /etc/remotedomains. Ubah lewat panel sebisa mungkin. Setelah diperbaiki, pesan-pesan ini sah dan sebaiknya dikirim ulang, bukan dihapus.
Pola kedua: banyak bounce frozen yang pesan aslinya berasal dari satu akun lokal. Lihat -auth_id di header spool dan potongan pesan asli di body. Kalau isinya spam dari akun yang sama, kemungkinan password akun itu bocor atau ada script di situs yang disalahgunakan. Bounce frozen di sini adalah bukti. Catat ID, auth_id, dan IP asal dulu, amankan akunnya, baru bersihkan queue. Kalau perlu eskalasi, informasi ini yang dibutuhkan tim berikutnya. Daftar lengkapnya ada di Memilih Info Apa yang Wajib Ada Sebelum Eskalasi Tiket ke Tim Engineering.
Pola ketiga: pesan frozen tanpa error pengiriman sama sekali di log. Ini biasanya dibekukan oleh system filter atau admin lain. Cek system filter yang aktif sebelum mengambil tindakan apa pun, karena mungkin memang ada aturan yang sengaja menahan pesan tertentu.
Membersihkan dengan aman lalu memverifikasi
exim -Mrm menghapus pesan secara permanen dan tidak bisa dikembalikan. Selalu tinjau daftarnya dulu tanpa -i dan tanpa pipe, pastikan isinya benar-benar bounce yang dimaksud, baru jalankan penghapusan.
BASH
# 1) tinjau dulu: bounce frozen (sender kosong)
exiqgrep -z -f '^<>$'
# 2) kalau daftar sudah benar, hapus hanya bounce frozen tersebut
exiqgrep -z -i -f '^<>$' | xargs -r exim -Mrm
# 3) untuk pesan sah setelah penyebabnya diperbaiki:
# thaw, lalu paksa coba kirim
exim -Mt ID_PESAN
exim -M ID_PESANexiqgrep bisa berbeda tergantung versi. Karena itu, langkah pertama tidak boleh dilewati. Kalau hasilnya kosong padahal kamu yakin ada bounce frozen, cek format sender di output exim -bp dan sesuaikan polanya.
Untuk pesan yang dibekukan karena masalah routing, jangan thaw dulu sebelum konfigurasinya benar. Pesan itu hanya akan dibekukan lagi. Setelah perbaikan, kirim satu pesan dengan exim -M, lalu pantau hasilnya di mainlog. Kalau sukses, baru proses sisanya.
Verifikasinya sederhana. Hitung ulang pesan frozen dengan perintah di bagian awal, cek ruang dan inode di direktori spool (lokasinya tergantung distro, biasanya di bawah /var/spool/), lalu pantau mainlog beberapa saat untuk melihat apakah muncul pesan frozen baru dengan pola yang sama. Kalau angkanya naik lagi, berarti sumbernya belum tertutup.
Praktisnya, jadikan pengecekan jumlah pesan frozen bagian dari rutinitas harian atau pasang alert sederhana kalau jumlahnya melewati ambang yang wajar untuk server kamu. Saat angkanya naik, ambil beberapa sampel, baca -Mvh dan log-nya, lalu tentukan polanya: bounce tak terkirim yang boleh dibuang, routing yang salah konfigurasi, atau akun yang disalahgunakan. Lima menit membaca sampel biasanya jauh lebih murah daripada menghapus semua bukti lalu menunggu keluhan berikutnya masuk.