NodeJS + smtp-server

Introduction

Monter un serveur SMTP pour faire des tests rapidement avec NodeJS pour recevoir les courriels et ensuite les traiter de plusieurs manières.

Le package NPM utilisé pour faire cela est : smtp-server (http://nodemailer.com/extras/smtp-server/)

Étape 1 - Création du projet

mkdir smtp
cd smtp
npm init
# Vous pouvez remplir comme vous voulez les choix
npm install --save smtp-server

Étape 2 - Création d'un fichier example

Créer un fichier nommé index.js

Le contenu provient directement de l'exemple sur GitHub,

// smtp.js
const {SMTPServer} = require('smtp-server');

const server = new SMTPServer({
    // disable STARTTLS to allow authentication in clear text mode
    disabledCommands: ['STARTTLS', 'AUTH'],
    logger: true,
    onData(stream, session, callback){
        stream.pipe(process.stdout); // print message to console
        stream.on('end', callback);
    },
});

server.listen(2525);

J'ai du utiliser le port 2525 pour faire les tests, car sur ma machine le service de postfix est démarré et utilise le port 25.

Maintenant lancer la commande node

Pour ajouter le port 2525 dans NodeJS, vous pouvez suivre les directives comme suit,

https://github.com/nodemailer/smtp-server/issues/69#issuecomment-605602170

Ou simplement utiliser sudo, pour faire les tests dont j'ai besoin, j'ai simplement utilisé sudo

sudo node index.js

Étape 3 - Envoyer un email

Dans un autre terminal (sur la même machine)

Lancer cette commande:

nc localhost 2525

Puis les commandes SMTP

helo localhost
mail from: <test@localhost>
rcpt to: <test@localhost>
data
Subject: Un test
Du contenu
^M
.^M
quit

J'utilise un Mac pour faire le tout, pour faire afficher le <CR><LF> ou ^M, il faut faire control+v, ENTER, ENTER

donc pour arrêter d'écrire le body(message) il faut faire:

^M
.^M

control+v, ENTER, ENTER

puis

POINT(.) suivit de control+v, puis ENTER et ENTER (http://hints.macworld.com/article.php?story=20040107223331700)

Le output réel:

someuser@MacBook ~ % nc localhost 2525                                                      
220 MacBook.local ESMTP
helo localhost
250 MacBook.local Nice to meet you, mail.local
mail from: <test@localhost>
250 Accepted
rcpt to: <test@localhost>
250 Accepted
data
354 End data with <CR><LF>.<CR><LF>
Subject: Testing email with nodejs
Some content
^M
.^M
250 OK: message queued
quit
221 Bye

À partir de ce moment, vous pouvez aller voir la console du script nodeJS,

someuser@MacBook Tools % sudo node index.js
Password:
[2020-04-02 02:28:35] INFO  SMTP Server listening on [::]:2525
[2020-04-02 02:28:50] INFO  [#tdl2lpomj6hycbca] Connection from mail.local
[2020-04-02 02:28:50] DEBUG [#tdl2lpomj6hycbca] S: 220 MacBook ESMTP
[2020-04-02 02:28:55] DEBUG [#tdl2lpomj6hycbca] C: helo localhost
[2020-04-02 02:28:55] DEBUG [#tdl2lpomj6hycbca] S: 250 MacBook Nice to meet you, mail.local
[2020-04-02 02:29:14] DEBUG [#tdl2lpomj6hycbca] C: mail from: <test@localhost>
[2020-04-02 02:29:14] DEBUG [#tdl2lpomj6hycbca] S: 250 Accepted
[2020-04-02 02:29:23] DEBUG [#tdl2lpomj6hycbca] C: rcpt to: <test@localhost>
[2020-04-02 02:29:23] DEBUG [#tdl2lpomj6hycbca] S: 250 Accepted
[2020-04-02 02:29:25] DEBUG [#tdl2lpomj6hycbca] C: data
[2020-04-02 02:29:25] DEBUG [#tdl2lpomj6hycbca] S: 354 End data with <CR><LF>.<CR><LF>
Subject: Testing email with nodejs
Some content

.

[2020-04-02 02:30:26] DEBUG [#tdl2lpomj6hycbca] C: <73 bytes of DATA>
[2020-04-02 02:30:26] DEBUG [#tdl2lpomj6hycbca] S: 250 OK: message queued
2020-04-02 02:30:59] DEBUG [#tdl2lpomj6hycbca] C: quit
[2020-04-02 02:30:59] DEBUG [#tdl2lpomj6hycbca] S: 221 Bye
[2020-04-02 02:30:59] INFO  [#tdl2lpomj6hycbca] Connection closed to mail.local

Comme vous pouvez voir sur le backend, il est possible d'intercepter le contenu des commandes et toutes les informations, de cette manière il est possible de faire plusieurs choses.

Autres trucs à essayer

Nodemailer offre un outil en NodeJS pour envoyer les emails,

http://nodemailer.com/extras/smtp-connection/

Voici un exemple:

npm install nodemailer --save

Créer un fichier nommé client.js

const SMTPConnection = require("nodemailer/lib/smtp-connection");

let connection = new SMTPConnection({
  port: 2525,
  host: "127.0.0.1",
  secure: false,
  debug: true
});

connection.connect(() => {
  console.log("Connection is established");
});

connection.on("connect", () => {
  console.log("Client Connected");
  connection.send(
    { from: "test@location.com", to: "testing@somewhere.com" },
    "Subject: This is the subject\nThis is my message for you, HELLO !",
    (err, info) => {
      console.error(err);
      console.log(info);
    }
  );
});

connection.on("error", err => {
  console.error(err);
});

Output du script client.js

node client.js

Connection is established
Client Connected
null
{ accepted: [ 'testing@somewhere.com' ],
  rejected: [],
  envelopeTime: 4,
  messageTime: 5,
  messageSize: 70,
  response: '250 OK: message queued' }

Output du serveur

2020-04-02 02:49:55] INFO  [#hmfejvebjflwu4ep] Connection from mail.local
[2020-04-02 02:49:55] DEBUG [#hmfejvebjflwu4ep] S: 220 MacBook.local ESMTP
[2020-04-02 02:49:55] DEBUG [#hmfejvebjflwu4ep] C: EHLO MacBook.local
[2020-04-02 02:49:55] DEBUG [#hmfejvebjflwu4ep] S: 250-MacBook.local Nice to meet you, mail.local
[2020-04-02 02:49:55] DEBUG [#hmfejvebjflwu4ep] 250-PIPELINING
[2020-04-02 02:49:55] DEBUG [#hmfejvebjflwu4ep] 250-8BITMIME
[2020-04-02 02:49:55] DEBUG [#hmfejvebjflwu4ep] 250 SMTPUTF8
[2020-04-02 02:49:55] DEBUG [#hmfejvebjflwu4ep] C: MAIL FROM:<test@location.com>
[2020-04-02 02:49:55] DEBUG [#hmfejvebjflwu4ep] S: 250 Accepted
[2020-04-02 02:49:55] DEBUG [#hmfejvebjflwu4ep] C: RCPT TO:<testing@somewhere.com>
[2020-04-02 02:49:55] DEBUG [#hmfejvebjflwu4ep] S: 250 Accepted
[2020-04-02 02:49:55] DEBUG [#hmfejvebjflwu4ep] C: DATA
[2020-04-02 02:49:55] DEBUG [#hmfejvebjflwu4ep] S: 354 End data with <CR><LF>.<CR><LF>
Subject: This is the subject
This is my message for you, HELLO !
[2020-04-02 02:49:55] DEBUG [#hmfejvebjflwu4ep] C: <67 bytes of DATA>
[2020-04-02 02:49:55] DEBUG [#hmfejvebjflwu4ep] S: 250 OK: message queued
[2020-04-02 02:50:55] DEBUG [#hmfejvebjflwu4ep] S: 421 Timeout - closing connection
[2020-04-02 02:50:55] INFO  [#hmfejvebjflwu4ep] Connection closed to mail.local

Les erreurs

501 Bad sender address syntax

Il me manquait les < et >

mail from: <test@something.com>
rcpt to: <test@somewhere.com>

Port déjà utilisé

Vérifier que votre port 25 est disponible (j'utilise le port 2525 pour éviter les conflits)

Aucun email n'est envoyé

C'est normal, vous devez gérer cette partie pour envoyer le email.

421 Timeout - closing connection

Il faut utiliser la commande quit pour terminer la connexion avant le timeout.

Laisser un commentaire