Parse header surat yang tidak terkirim (bouncing mail)

9

Apa cara terbaik untuk mem-parsing tajuk email terpental (tidak terkirim) yang dikirim kembali ke server saya dan menentukan apakah itu bouncing lunak atau keras?

Saya hanya mengirim email opt-in ke pengguna saya, tetapi kadang-kadang beberapa alamat email menjadi basi. Ketika sebuah email memantul kembali ke server saya, saya ingin mengetahui mengapa email itu memantul (lunak / keras). Kemudian saya bisa mengatasinya dengan tepat di database saya dan / atau menandai pengguna untuk memperbarui email mereka ketika login berikutnya.

Saya menggunakan Ubuntu dan Postfix. Saya telah berhasil mengimplementasikan VERP dengan alias dan alias virtual. Jadi, email yang terpental memiliki jalur pengembalian [email protected] , dan saya dapat mengirimnya ke skrip.

Sekarang saya memiliki pengaturan VERP, saya tahu kepada siapa email asli dikirim, tetapi saya perlu menguraikan header surat yang dikembalikan untuk mencari tahu apakah itu bouncing lunak atau bouncing keras.

Apa cara terbaik untuk menangani ini? Seperti yang saya pahami, tidak semua server email bermain dengan aturan yang sama, dan header dapat memiliki berbagai format. Apakah ada proyek open source yang melacak hal-hal semacam ini? Sesuatu yang sederhana yang dapat saya terapkan yang akan mengkategorikan sebagian besar bouncing dengan benar?

Saya mencoba melindungi reputasi server email saya, jadi bantuan apa pun sangat kami hargai!

Richard
sumber

Jawaban:

9

Seperti yang dijelaskan RFC3463 , kode status yang dimulai dengan 5 digunakan untuk kegagalan permanen dan 4 untuk kegagalan sementara yang persisten. Alih-alih mencoba mem-parsing beberapa pesan dengan format berbeda, Anda bisa mengandalkan log server dan mencoba sesuatu seperti ini:

grep " dsn=5." /var/log/mail.log | grep -o -P " to=<(.+?)>" | sort | uniq -c

Ini akan menemukan kesalahan permanen dari mail.log (format Postfix) dan memberikan alamat dan jumlah bouncing pada setiap alamat. Anda juga dapat menggunakan "dsn = 4." untuk mendapatkan alamat dengan kesalahan sementara.

Esa Jokinen
sumber
Terima kasih, Esa! Saya tidak menyadari bahwa postfix memiliki info itu di log surat. Apakah ini solusi yang Anda gunakan? Apakah Anda menemukan bahwa postfix mengkategorikan pantulan keras dsn = 5 dengan benar? Saya telah membaca bahwa beberapa server email tidak mematuhi RFC. Jadi saya pikir solusi yang lebih rumit mungkin diperlukan. Apa pengalaman Anda? Ini sepertinya solusi yang bagus jika kita dapat menguji postfix untuk memperbaikinya :-)
Richard
Script yang sangat berguna - terima kasih! Resep di sini untuk alternatif grep's -P flag (untuk pengguna Mac dll): unix.stackexchange.com/a/437694/275762 grep " dsn=5." /var/log/mail.log | pcregrep -o1 " to=<(.+?)>" | sort | uniq -c
Peter M.
8

Umumnya ada dua jenis bouncing

  1. Bouncing yang disebabkan oleh penolakan langsung dari server surat jarak jauh ketika postfix Anda mengirimkan email.
  2. Bouncing yang disebabkan oleh server jarak jauh (server hop berikutnya setelah postfix Anda) gagal mengirimkan pesan ke penerima akhir.

Kasus pertama sudah dicakup oleh jawaban yang sangat baik oleh Esa Jokinen di atas. Taruhan terbaik Anda adalah mengurai maillog.

Kasus kedua adalah kasus bouncing khusus. Skenario contoh:

  • Anda mengirim email dengan penerima [email protected] ke server mail.example.com .
  • Di mail.example.com, [email protected] dialihkan ke [email protected] dan harus diteruskan ke mail.example.net .
  • Suatu hari nanti mail.example.net menolak pesan Anda sehingga mail.example.com harus mengirim bouncing ke server Anda.
  • Sayangnya maillog di server Anda akan memiliki "dsn = 2" karena mail.example.com sudah menerima pesan tetapi gagal meneruskannya ke mail.example.net .

Di sini contoh email tipe kedua memantul. Ada aturan penerusan server email Yahoo [email protected] -> [email protected] . Sayangnya mail server dari example.net menolak pesan :(

From MAILER-DAEMON  Thu Mar  5 05:07:26 2015
Return-Path: <>
X-Original-To: [email protected]
Delivered-To: [email protected]
Received: from nm21-vm7.bullet.mail.gq1.yahoo.com (nm21-vm7.bullet.mail.gq1.yahoo.com [98.136.217.54])
        (using TLSv1 with cipher ECDHE-RSA-AES128-SHA (128/128 bits))
        (No client certificate requested)
        by mx.example.org (Postfix) with ESMTPS id D6365565FC
        for <[email protected]>; Thu,  5 Mar 2015 05:07:25 +0700 (WIT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=bounce; t=1425506842; bh=zk/tWZNl6c36dmlPDmakM9ekK8cHVJANXMmSdsbkcWc=; h=From:To:Date:Subject:From:Subject; b=Im95h1qTg6qN3yUI7vF1fXtJ0SbUnzv8rUPwLbpNwxGPN2p8wfosXJzQgJ3nzr4L4ZQ50P2d9E9U4jEUNtnyi7nlFd5kKbtiVuda4H56h1PFnt+7wSpgHcd5Irs/lLODumb6ZZSEpCOWttcB9+JLaDfEUUPjGcbR+xww4XeH5Eo=
From: [email protected]
To: [email protected]
Date: Wed, 04 Mar 2015 22:07:22 -0000
Subject: Failure Notice
X-Yahoo-Newman-Property: bmbounce

Sorry, we were unable to deliver your message to the following address.

<[email protected]>:
Remote host said:
550 5.1.1 User unknown
 [RCPT_TO]

Untuk kasus ini, satu-satunya metode Anda adalah mengurai pesan bouncing. Sayangnya tidak ada format bouncing standar, jadi Anda harus mengurai tubuh dan menentukan penolakan yang disebabkan.

Daftar periksa fitur parsing postfix bouncing Anda:

  1. Periksa apakah alamat VERP valid. Anda tidak ingin mem-parsing pesan yang tidak valid.
  2. Pisahkan tubuh, tentukan apakah itu penolakan lunak atau keras.

Untuk fitur kedua, Anda dapat google beberapa pesan penolakan umum. Contohnya adalah bouncing-regex-list.xml oleh Jakub Liska ini .


Esa Jokinen membuat poin bagus dalam komentar di bawah tentang dua tipe bouncing ini. Jika sasaran Anda adalah menjaga reputasi server, maka menangani jenis bouncing pertama sudah cukup. Bouncing kedua adalah tentang membersihkan daftar Anda. Jadi email yang mati harus dihapus sehingga membebaskan beberapa sumber daya di server Anda.

Beberapa pengelola milis seperti PHPlist dan Mailman juga menangani masalah bouncing ini dengan mem-parsing badan email karena mereka tidak memiliki sumber daya untuk mem-parsing maillog.

masegaloeh
sumber
1
Solusi ini berguna dan lebih menyeluruh jika perlu untuk menangani juga surat secara otomatis diteruskan ke alamat lain. Namun, jika tujuannya adalah untuk melindungi reputasi server surat, penanganan penolakan langsung harus memadai. Administrator penerusan MTA harus menghapus ke depan usang dan daftar mail (untuk melindungi reputasi mereka dan untuk menghindari lalu lintas yang tidak perlu). Setelah itu kita kembali ke kasing satu. OP harus menggunakan solusi ini jika jumlah bouncing sekunder signifikan. Yang pernah membutuhkan sedikit usaha.
Esa Jokinen
@masegaloeh, terima kasih atas informasinya! Aku bahkan tidak menganggap situasi penerusan itu sebagai suatu kemungkinan! Untuk saat ini saya lebih mementingkan perlindungan rep server email saya, tetapi jika bouncing meningkat ini mungkin sangat berguna.
Richard