fix(smtp): skip the reverse DNS lookup of connecting clients (#104)
smtp-server reverse resolves every connecting client before it sends the 220 greeting, unless disableReverseLookup is set. MailDev never reads the resolved hostname, and without a network the lookup does not answer, so each connection waited for smtp-server to give up on it.
This commit is contained in:
1 parent
53640c6990
commit
3f93b59a2e
3 files changed
+60
No files matched your search
@@ -0,0 +1,8 @@
|
|||||||
|
---
|
||||||
|
'@maildev/smtp': patch
|
||||||
|
'maildev': patch
|
||||||
|
---
|
||||||
|
|
||||||
|
Skip the reverse DNS lookup of connecting SMTP clients (#104). The resolved
|
||||||
|
hostname was never used, and without a network the lookup held back the
|
||||||
|
greeting on every connection until it timed out.
|
||||||
@@ -0,0 +1,49 @@
|
|||||||
|
import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest'
|
||||||
|
import dns from 'node:dns'
|
||||||
|
import { mkdtemp, rm } from 'node:fs/promises'
|
||||||
|
import { tmpdir } from 'node:os'
|
||||||
|
import { join } from 'node:path'
|
||||||
|
import nodemailer from 'nodemailer'
|
||||||
|
import { MemoryStorage } from '@maildev/core'
|
||||||
|
import { SMTPServer } from '../server.js'
|
||||||
|
|
||||||
|
describe('client reverse DNS lookup', () => {
|
||||||
|
let mailDir: string
|
||||||
|
let storage: MemoryStorage
|
||||||
|
let server: SMTPServer
|
||||||
|
|
||||||
|
beforeEach(async () => {
|
||||||
|
mailDir = await mkdtemp(join(tmpdir(), 'maildev-reverse-'))
|
||||||
|
storage = new MemoryStorage()
|
||||||
|
await storage.initialize()
|
||||||
|
server = new SMTPServer({ storage, mailDir, port: 0, host: '127.0.0.1' })
|
||||||
|
await server.start()
|
||||||
|
})
|
||||||
|
|
||||||
|
afterEach(async () => {
|
||||||
|
vi.restoreAllMocks()
|
||||||
|
await server.stop()
|
||||||
|
await rm(mailDir, { recursive: true, force: true })
|
||||||
|
})
|
||||||
|
|
||||||
|
// Without a network the lookup never answers, and smtp-server holds back the
|
||||||
|
// 220 greeting until it gives up on it (#104).
|
||||||
|
it('accepts mail without reverse resolving the connecting client', async () => {
|
||||||
|
const reverse = vi.spyOn(dns, 'reverse').mockImplementation(() => {})
|
||||||
|
|
||||||
|
const transport = nodemailer.createTransport({
|
||||||
|
host: '127.0.0.1',
|
||||||
|
port: server.getPort(),
|
||||||
|
secure: false,
|
||||||
|
})
|
||||||
|
await transport.sendMail({
|
||||||
|
from: 'a@example.com',
|
||||||
|
to: 'b@example.com',
|
||||||
|
subject: 'offline',
|
||||||
|
text: 'hello',
|
||||||
|
})
|
||||||
|
|
||||||
|
expect(await storage.getAll()).toHaveLength(1)
|
||||||
|
expect(reverse).not.toHaveBeenCalled()
|
||||||
|
})
|
||||||
|
})
|
||||||
@@ -524,6 +524,9 @@ export class SMTPServer extends EventEmitter {
|
|||||||
logger: false,
|
logger: false,
|
||||||
hideSTARTTLS: true,
|
hideSTARTTLS: true,
|
||||||
disabledCommands: ['AUTH'] as string[],
|
disabledCommands: ['AUTH'] as string[],
|
||||||
|
// The client hostname is never used, and without a network the lookup
|
||||||
|
// stalls every connection before the greeting (#104).
|
||||||
|
disableReverseLookup: true,
|
||||||
}
|
}
|
||||||
|
|
||||||
// Advertise and enforce a maximum message size. smtp-server rejects
|
// Advertise and enforce a maximum message size. smtp-server rejects
|
||||||
|
|||||||
Reference in new issue
Block a user