MadBrozzeR / smtp

[Stability: 4/5] My SMTP server and client

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

mbr-smtp

SMTP (Simple Mail Transfer Protocol) client and server implementation.

Server

const server = new Server(params = {}, listeners = {});

Create new SMTP server instance.

params - Server parameters.

listeners - Optional. Set of event listeners.

params

const params = {
  name: 'example.domain',
  port: 25,
  host: '0.0.0.0',
  size: 30 * 1024 * 1024,
  timeout: 0
}

Set of SMTP server parameters.

name - Server domain name.

port - Optional. Server port to listen to. Default: 25.

host - Optional. Host to listen connections from. Default: '0.0.0.0' (accept all).

size - Optional. Maximum message size to accept. Set 0 to disable limit. Default: 31457280 (30 Mb).

timeout - Optional. Connection timeout before socked is being closed. Set 0 to disable. Default: 0.

listeners

const listeners = {
  // Server events. Receives SMTP server instance as `this`.
  start: function () {},
  stop: function () {},
  error: function (error) {},

  // Client events. Receives Session instance as `this`.
  connect: function (socket) {},
  disconnect: function (socket) {},
  timeout: function () {},
  message: function (message) {},
  response: function (response) {},
  helo: function (origin) {},
  mail: function ({ from, size }) {},
  rcpt: function (email) {},
  dataStart: function () {},
  dataChunk: function (chunk) {},
  data: function (data) {},
};

Set of server related event listeners.

start - Server is ready to listen to connections.

stop - Server is stopped.

error - Some unexpected error occured.

Set of client related event listeners. Most of them are interruptable, so make sure you triggered this.success(), this.failure() or this.ok() inside any listener that has been added. Or just return true to proceed default command execution. Otherwise client won't get any response.

connect - (interruptable) Client connected.

disconnect - Client disconnected.

timeout - (interruptable) Idle timeout was triggered.

message - (interruptable) Any client command (before it's proceeded).

response - All server responses being sent to client.

helo - (interruptable) Client sent HELO or EHLO command with it's origin (domain).

mail - (interruptable) Client sent MAIL command with it's email and optionally expected data size.

rcpt - (interruptable) Client sent RCPT command with destination's email.

dataStart - (interruptable) Client initialized message transfer.

dataChunk - Client sent some data in DATA block.

data - (interruptable) Client provided it's message.

Alternatively listeners argument can be set as function instead of object. It will accept two arguments: type (one of types above as string) and an argument. This function should return true if no interruption intended. Example:

const listeners = function (type, param) {
  switch (type) {
    case 'start':
      // Do something on server start
      break;

    case 'data':
      const sessionData = this.data; // `this` is a session instance
      const message = param;
      // Do something
      this.success();
      break;
  }

  return true; // required to proceed default behavior
}

Server instance methods

server.on(listeners);

Attach listeners to events. You can attach them either here, or in Server constructor.

server.start();

Start server to listen to connections.

server.stop();

Stop server from listening to connections.

Session instance

Client session collecting all required data during current connection. It's being passed to all client listeners.

session.id

Random generated session ID.

session.socket

Session client socket

session.smtp

Link to SMTP server instance.

session.queue

NetQueue instance with current operations.

session.send(code, message)

Send custom server response.

session.success([message])

Trigger success event with default command behavior and proceed communication. If no message is provided default one will be used.

session.ok([message])

Trigger success event skipping default command behavior (session.data object is not filled) and proceed communication. If no message is provided default one will be used.

session.failure(code, message)

Trigger error event and proceed communication. Send client failure reason.

About

[Stability: 4/5] My SMTP server and client


Languages

Language:JavaScript 100.0%