fix(smtp): reject the relay when the outgoing server cannot be reached
SMTPConnection only calls the connect() callback once the handshake succeeds; a refused or timed out connection is emitted as an 'error' event, which was only logged. relay() then never settled, so its finally block (which now releases the email stream) never ran, auto-relay held the incoming SMTP transaction open without a reply, and the REST relay request hung. Reject the connect promise from the 'error' handler.
This commit is contained in:
1 parent
5479067fab
commit
53640c6990
3 files changed
+22
No files matched your search
@@ -0,0 +1,9 @@
|
||||
---
|
||||
'@maildev/smtp': patch
|
||||
'maildev': patch
|
||||
---
|
||||
|
||||
Fail the relay when the outgoing server cannot be reached. The connection
|
||||
error was only logged, so the relay never finished: with auto-relay on, the
|
||||
SMTP client sending to MailDev never got its reply, and the manual relay
|
||||
request never answered.
|
||||
@@ -147,6 +147,17 @@ describe('relay raw email stream', () => {
|
||||
expect(stream.destroyed).toBe(true)
|
||||
})
|
||||
|
||||
it('closes the stream when the outgoing server cannot be reached', async () => {
|
||||
const client = new RelayClient({ host: '127.0.0.1', port: await freePort() }, false)
|
||||
const stream = createReadStream(emlPath)
|
||||
|
||||
const result = await client.relay(email, stream)
|
||||
|
||||
expect(result.success).toBe(false)
|
||||
expect(result.error).toBeInstanceOf(Error)
|
||||
expect(stream.destroyed).toBe(true)
|
||||
})
|
||||
|
||||
it('closes the stream when the outgoing server rejects the recipient', async () => {
|
||||
const port = await freePort()
|
||||
const rejecting = new SMTPServerLib({
|
||||
|
||||
@@ -160,8 +160,10 @@ export class RelayClient {
|
||||
debug: false,
|
||||
})
|
||||
|
||||
// A failed connection is reported here, not through the connect callback
|
||||
this.client.on('error', (err: Error) => {
|
||||
this.logger.error('SMTP Connection error:', err)
|
||||
reject(err)
|
||||
})
|
||||
|
||||
this.client.connect((err?: Error) => {
|
||||
|
||||
Reference in new issue
Block a user