var test = require("node:test"); var assert = require("node:assert/strict"); var net = require("node:net"); var smtp = require("../lib/smtp"); var accounts = require("../lib/email-accounts"); var ImapFlow = require("imapflow").ImapFlow; async function listen(t, greeting, handleLine) { var sockets = new Set(); var server = net.createServer(function (socket) { sockets.add(socket); socket.on("close", function () { sockets.delete(socket); }); socket.on("error", function () {}); socket.write(greeting + "\r\n"); var pending = ""; var state = {}; socket.on("data", function (chunk) { pending += chunk.toString(); var end; while ((end = pending.indexOf("\r\n")) >= 0) { var line = pending.slice(0, end); pending = pending.slice(end + 2); handleLine(socket, line, state); } }); }); t.after(function () { sockets.forEach(function (socket) { socket.destroy(); }); return new Promise(function (resolve) { server.close(resolve); }); }); await new Promise(function (resolve, reject) { server.once("error", reject); server.listen(0, "127.0.0.1", resolve); }); return server.address().port; } test("SMTP verification and Clay test delivery preserve recipient envelopes", { timeout: 10000 }, async function (t) { var recipients = []; var message = []; var port = await listen(t, "220 localhost SMTP", function (socket, line, state) { if (state.data) { if (line === ".") { state.data = false; socket.write("250 queued locally\r\n"); } else { message.push(line); } } else if (/^EHLO /i.test(line)) { socket.write("250-localhost\r\n250 AUTH PLAIN\r\n"); } else if (/^AUTH /i.test(line)) { socket.write("235 authenticated\r\n"); } else if (/^MAIL FROM:/i.test(line)) { socket.write("250 sender accepted\r\n"); } else if (/^RCPT TO:/i.test(line)) { recipients.push(line); socket.write("250 recipient accepted\r\n"); } else if (line === "DATA") { state.data = true; socket.write("354 send message\r\n"); } else if (line === "QUIT") { socket.end("221 bye\r\n"); } else { socket.write("500 unexpected command\r\n"); } }); var config = { host: "127.0.0.1", port: port, secure: false, user: "sender@example.test", pass: "test", from: "Clay " }; assert.deepEqual(await smtp.testConnection(config), { ok: true }); var result = await smtp.sendTestEmail(config, '"Receiver, One" , two@example.test'); assert.equal(result.ok, true); assert.ok(result.messageId); assert.deepEqual(recipients, ["RCPT TO:", "RCPT TO:"]); assert.match(message.join("\n"), /Subject: Clay SMTP Test/); assert.match(message.join("\n"), /SMTP is configured correctly/); }); test("IMAP account verification and inbox fetch decode message envelopes", { timeout: 10000 }, async function (t) { var port = await listen(t, "* OK local IMAP", function (socket, line) { var parts = line.split(" "); var tag = parts[0]; var command = parts[1].toUpperCase(); if (command === "CAPABILITY") { socket.write("* CAPABILITY IMAP4rev1\r\n" + tag + " OK capability\r\n"); } else if (command === "LOGIN") { socket.write(tag + " OK login\r\n"); } else if (command === "LIST") { socket.write('* LIST (\\HasNoChildren) "/" "INBOX"\r\n' + tag + " OK list\r\n"); } else if (command === "SELECT") { socket.write("* FLAGS (\\Seen)\r\n* 1 EXISTS\r\n* OK [UIDVALIDITY 1] stable\r\n" + tag + " OK [READ-WRITE] selected\r\n"); } else if (command === "FETCH" || (command === "UID" && parts[2] === "FETCH")) { socket.write('* 1 FETCH (UID 7 FLAGS (\\Seen) ENVELOPE ("Tue, 15 Sep 2026 12:00:00 +0000" "=?UTF-8?Q?Hello_=E2=9C=93?=" (("Sender" NIL "sender" "example.test")) NIL NIL (("Receiver" NIL "receiver" "example.test")) NIL NIL NIL ""))\r\n' + tag + " OK fetched\r\n"); } else if (command === "LOGOUT") { socket.end("* BYE local logout\r\n" + tag + " OK logout\r\n"); } else { socket.write(tag + " BAD unexpected command\r\n"); } }); var account = { email: "receiver@example.test", appPassword: "test", imap: { host: "127.0.0.1", port: port, tls: false } }; assert.deepEqual(await accounts.testImapConnection(account), { ok: true }); var client = new ImapFlow({ host: account.imap.host, port: port, secure: false, auth: { user: account.email, pass: account.appPassword }, logger: false }); t.after(function () { client.close(); }); await client.connect(); var lock = await client.getMailboxLock("INBOX"); try { var result = await client.fetchOne(7, { uid: true, envelope: true, flags: true }, { uid: true }); assert.equal(result.uid, 7); assert.equal(result.envelope.subject, "Hello ✓"); assert.equal(result.envelope.from[0].address, "sender@example.test"); assert.equal(result.envelope.to[0].address, "receiver@example.test"); assert.equal(result.envelope.messageId, ""); assert.equal(result.flags.has("\\Seen"), true); } finally { lock.release(); await client.logout(); } });