Nodemailer: Semak Penerima Email Sebenar
Alamat email yang lulus validation boleh ditafsir semula oleh mailer. Uji penerima dalam SMTP envelope tanpa menghantar mesej kepada pelanggan.

Alamat email yang lulus semakan aplikasi belum tentu menjadi alamat yang dipilih untuk penghantaran. Masalah boleh timbul semasa data berpindah tangan: validator membaca satu string, kemudian mailer membaca semula string yang sama dengan tafsiran berbeza.
Tiga advisory Nodemailer menunjukkan bagaimana perkara itu boleh berlaku. Isunya ialah parsing alamat. Advisory itu bukan bukti bahawa semua aplikasi yang menggunakan library berkenaan telah membocorkan email. Bagi pasukan yang menghantar notifikasi pelanggan, jemputan atau email pemulihan akaun, soalan yang patut diuji lebih khusus: adakah penerima yang dipilih mailer sama dengan penerima yang diluluskan aplikasi?
Alamat yang terpapar belum menjawab soalan routing
SMTP memisahkan maklumat routing daripada kandungan mesej. RFC 5321 menerangkan envelope dan kandungan sebagai dua bahagian berbeza dalam objek email. Jadi, semakan pada medan To: yang pengguna nampak belum cukup untuk membuktikan mailbox mana yang akan menerima mesej itu.
Menurut dokumentasi envelope Nodemailer, library itu biasanya membina senarai penghantaran daripada medan seperti to, cc dan bcc. Senarai penerima yang terhasil boleh dilihat pada info.envelope.to. Bahagian inilah yang berguna untuk menguji keputusan routing aplikasi.
Bayangkan pasukan SaaS Malaysia yang menghantar jemputan akaun kepada pelanggan. Ujian “email sudah masuk queue” cuma mengesahkan job bergerak ke langkah seterusnya. Ujian “envelope mengandungi tepat mailbox yang kami luluskan” pula memeriksa keputusan keselamatan. Kedua-duanya mungkin diperlukan, tetapi masing-masing menjawab soalan berbeza.
Tiga punca parsing, sempadan patch yang sama
Ketiga-tiga advisory menyenaraikan versi terjejas dari 3.0.0 hingga 10.1.3, dengan pembaikan pada 10.1.4. Mekanismenya berbeza:
- Comment bersarang: parser menamatkan comment terlalu awal, lalu teks dalam comment luar boleh dibaca sebagai alamat.
- Tanda semikolon dalam group: delimiter dalam quoted text atau comment boleh menutup group sebelum waktunya, kemudian baki teks dibaca sebagai penerima.
- Quoted local part: penutup angle bracket dalam local part dalam tanda petikan boleh mengubah domain yang dipilih parser.
Impak yang dilaporkan bergantung pada bentuk alamat yang aplikasi terima dan hantar kepada mailer. Form yang hanya membenarkan format mailbox terhad mempunyai pendedahan berbeza daripada fungsi import senarai alamat lengkap. Jangan anggap nombor versi sahaja sudah membuktikan kebocoran. Jejaki laluan input yang berkaitan, kemudian uji.
Langkah pertama masih mengemas kini dependency. Kalau perlu berpindah major version, anggap itu perubahan keserasian yang mesti disemak. Jangan terus gunakan forced audit fix dan berharap semuanya berjalan. Metadata pakej 10.2.1 menetapkan Node.js 20 atau lebih baharu; runtime yang lebih lama juga memerlukan keputusan migrasi yang jelas. Semak status sokongan runtime secara berasingan. Minimum engine version sesuatu pakej bukan polisi deployment.
Uji envelope tanpa menghantar email
Audit ringkas di bawah menguji bentuk comment bersarang dan group comment, bersama satu kawalan yang menggunakan address object. Ia sengaja tidak mendakwa meliputi setiap grammar mailbox atau ketiga-tiga mekanisme advisory.
Contoh itu menggunakan Stream transport, yang membina mesej secara lokal tanpa menghantarnya ke server SMTP. Semua alamat ialah fixture. Tiada akaun SMTP atau data pelanggan yang perlu disediakan.
Dalam direktori ujian kosong, pasang versi yang hendak diuji, simpan skrip di bawah sebagai envelope-audit.cjs, kemudian jalankan:
npm init -y
npm install [email protected]
node envelope-audit.cjs
const nodemailer = require('nodemailer'); // eslint-disable-line @typescript-eslint/no-require-imports -- CommonJS example
const transport = nodemailer.createTransport({
streamTransport: true,
buffer: true,
});
const cases = [
['nested comment',
'Reader (a(b) <[email protected]>) <[email protected]>',
'[email protected]'],
['group comment',
'Team: (a; <[email protected]>) <[email protected]>;',
'[email protected]'],
['structured recipient',
{ name: 'Reader', address: '[email protected]' },
'[email protected]'],
];
async function main() {
for (const [label, recipient, expected] of cases) {
const info = await transport.sendMail({
from: '[email protected]',
to: recipient,
subject: 'Local envelope test',
text: 'This message stays in memory.',
});
const actual = info.envelope.to;
const pass = actual.length === 1 && actual[0] === expected;
console.log(label, pass ? 'PASS' : 'FAIL', JSON.stringify(actual));
if (!pass) process.exitCode = 1;
}
}
main().catch(() => {
console.error('Envelope generation failed');
process.exitCode = 1;
});
Dalam ujian lokal kami menggunakan Nodemailer 10.2.1, ketiga-tiga check lulus. Apabila skrip yang sama dijalankan dengan 10.0.15, dua kes berasaskan comment gagal, manakala kawalan address object lulus. Versi lama memilih [email protected] bagi kedua-dua kes yang gagal. Itu hasil ujian fixture yang boleh diulang, bukan ukuran trafik pelanggan sebenar.
Assertion membandingkan keseluruhan senarai penerima, termasuk saiznya. Semakan yang cuma mencari kewujudan domain dibenarkan dalam senarai boleh terlepas destinasi tambahan. Skrip juga mengembalikan exit status gagal jika ada check yang gagal. Jadi, ia boleh menghentikan job CI tanpa bergantung pada seseorang untuk membaca amaran dalam log.
Tentukan dahulu format yang produk perlukan
Untuk form email akaun yang ringkas, cadangan saya ialah menyokong input yang produk itu benar-benar perlukan: satu mailbox, dengan display name disimpan secara berasingan. Medan berlabel “Email anda” tidak semestinya perlu menerima semua ciri formatted address list. Tolak bentuk yang tidak disokong dengan mesej jelas, bukannya cuba meneka maksud pengguna secara senyap.
Apabila display name diperlukan, Nodemailer menyediakan address object dengan medan name dan address yang berasingan. Sempadan antara kedua-duanya lebih jelas berbanding mencantumkan nama dan mailbox menjadi satu string bebas. Pendekatan itu tetap tidak menggantikan patch dependency atau validation pada nilai alamat.
Fungsi bulk import pula perlukan polisi sendiri. Putuskan dahulu sama ada produk membenarkan banyak mailbox, group dan formatted name sebelum memilih cara parsing. Bezakan data yang diterima daripada pengguna dengan identiti penerima canonical yang diluluskan aplikasi. Keupayaan parser membaca sesuatu string bukan kebenaran untuk menghantar mesej kepada setiap alamat yang ditemuinya.
Kalau aplikasi menetapkan envelope sendiri, semak laluan itu secara berasingan. Header yang betul tidak dapat membetulkan senarai penghantaran yang dibina di tempat lain. Berhati-hati juga apabila helper pembinaan mesej dikongsi antara email akaun dan bulk mail. Had bilangan penerima bagi kedua-dua fungsi mungkin berbeza.
Jadikan ujian itu sebahagian daripada release
Simpan fixture ini bersama ujian penerima biasa aplikasi. Masukkan juga nama dan bentuk alamat normal yang produk janjikan kepada pengguna. Jangan bergantung pada contoh hostile daripada advisory sahaja. Jika tidak, patch boleh kelihatan selamat hanya kerana ia menolak semua bentuk yang pengguna sebenarnya perlukan.
Semak dependency pada runtime yang sudah di-deploy, di samping lockfile dalam pull request. Manifest yang berubah belum membuktikan worker yang lama berjalan sudah memuatkan kod baharu. Pengajarannya sama seperti dalam panduan patch PHP2Shell kami: sahkan komponen yang benar-benar menjalankan workload itu.
Hadkan juga maklumat dalam telemetry rutin. Ujian boleh merekodkan ID kes, bilangan penerima yang dijangka dan keputusan lulus atau gagal. Log production tidak memerlukan kandungan mesej, pautan reset atau senarai penuh alamat pelanggan untuk menunjukkan bahawa invariant dipatuhi. Gunakan mailbox sintetik apabila menghasilkan semula kegagalan di luar service yang terjejas.
Akhir sekali, pisahkan kesimpulan mengikut apa yang benar-benar diuji. Keputusan lokal yang lulus menunjukkan tingkah laku input ini dalam konfigurasi ini. Ia tidak membuktikan penghantaran berjaya, DNS betul, reka bentuk pemulihan akaun selamat atau tiada bug email lain. Nilainya tetap jelas: satu release gate yang memastikan mailer tidak menukar secara senyap identiti penerima yang aplikasi sudah luluskan.
Sumber
penulis
Editor & Operator
MrDodgerX (MrDodgerX) is an enterprise geospatial systems engineer in Malaysia and the editor behind hejes.my. He runs the briefing pipeline, curates and edits every draft, verifies each factual claim against primary sources, and presses the publish button — nothing ships without his review. He writes about AI, security and Malaysia's tech scene from a builder's perspective. Professional profile and code: the links below.
sumber
disahkan fakta · 24 OKT 2026
Butiran sumber dan tarikh semakan
- Nested-comment parsing advisoryGitHub Advisory Database · diakses 24 OKT 2026
- Group-delimiter parsing advisoryGitHub Advisory Database · diakses 24 OKT 2026
- Quoted-local-part parsing advisoryGitHub Advisory Database · diakses 24 OKT 2026
- SMTP envelopeNodemailer · diakses 24 OKT 2026
- Address objectsNodemailer · diakses 24 OKT 2026
- Stream transportNodemailer · diakses 24 OKT 2026
- SMTP mail objects: RFC 5321RFC Editor · diakses 24 OKT 2026
- Nodemailer 10.2.1 package metadatanpm Registry / Nodemailer · diakses 24 OKT 2026
berkaitan

PHP2Shell: NACSA Desak Tampal PHP Segera
NACSA mahu PHP terdedah ke internet ditampal segera. Ini cara mengesahkan versi yang benar-benar melayani laman anda, dan mengapa jalan pintas itu perangkap.

China-Linked Threat Actors Gabungkan Serangan Automatik dan Manual untuk Mencuri Data Sensitif
CISA dan rakan kongsi memberi amaran aktor berkaitan China menggabungkan pengimbasan automatik, botnet dan eksploitasi manual untuk mencuri data sensitif.

Google Melancarkan Gemini 4 Argon Untuk Pertahanan Siber Yang Dipercayai
Google melancarkan Gemini 4 Argon melalui Fairwind Program kepada pasukan pertahanan siber yang dipercayai, termasuk varian tanpa guardrail siber.
sertai suapan
satu ilmu seminggu. tiada spam.
ringkasan mingguan. berhenti bila-bila masa.