En relisant le message de @tagadapps, je me suis aperçu qu’il ne parlait pas nécessairement de Express.js mais de « Express-like » aussi en voici un exemple en Vanilla JS plus « digeste » :p ) :
Dossier Github testable, toutes les instructions sont dans le README.md
— https://github.com/Haeresis/HumanCoders/tree/master/nodemailer-envois-de-mail-par-un-bouton/node-js-version/
Basiquement nous avons l’URL /
qui fait appelle à la vue index.htm
dont voici le contenu :
<!DOCTYPE html>
<html>
<head>
<title>Nodemailer envois de mail par un bouton</title>
<style type="text/css">
.send-email__processing,
.send-email__success,
.send-email__failure,
.send-email.is-processing .send-email__init,
.send-email.is-success .send-email__init,
.send-email.is-failure .send-email__init {
display: none;
}
.send-email.is-processing .send-email__processing,
.send-email.is-success .send-email__success,
.send-email.is-failure .send-email__failure {
display: block;
}
</style>
</head>
<body>
<section class="send-email">
<div class="send-email__init">
<p>De : <input class="send-email__from" type="text" name="from"></p>
<p>À : <input class="send-email__to" type="text" name="to"></p>
<p>Sujet: <input class="send-email__subject" type="text" name="subject"></p>
<p>
Contenu:<br>
<textarea class="send-email__content" name="content"></textarea>
</p>
<button class="send-email__init-button">Envoyer un email</button>
</div>
<div class="send-email__processing">
<p>Envoi en cours...</p>
</div>
<div class="send-email__success">
<p>Votre email a correctement été envoyé!</p>
</div>
<div class="send-email__failure">
<p>Votre email n'a pas été envoyé…</p>
</div>
</section>
<script type="text/javascript">
/* jslint browser: true */
var debug = true,
button = document.getElementsByClassName('send-email__init-button')[0],
sendEmail = document.getElementsByClassName('send-email')[0],
sendEmailFrom = document.getElementsByClassName('send-email__from')[0],
sendEmailTo = document.getElementsByClassName('send-email__to')[0],
sendEmailSubject = document.getElementsByClassName('send-email__subject')[0],
sendEmailContent = document.getElementsByClassName('send-email__content')[0];
button.addEventListener('click', function () {
var mailOptions = {
to: sendEmailFrom.value,
from: sendEmailTo.value,
subject: sendEmailSubject.value,
content: sendEmailContent.value
};
debug && console.log('debug', mailOptions);
sendEmail.classList.add('is-processing');
fetch('http://localhost:7749/send-email/', {
method: 'POST',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json'
},
body: JSON.stringify(mailOptions)
})
.then(function(response) {
response.text().then(function (data) {
sendEmail.classList.remove('is-processing');
if (data.success) {
sendEmail.classList.add('is-success');
} else {
sendEmail.classList.add('is-failure');
}
});
});
});
</script>
</body>
</html>
Qui via la méthode fetch
sur le clique du bouton appelle l’URL /send-email/
qui fait appelle au contrôleur sendemail.js
Voici le contenu du contrôleur en question :
/* jslint node: true */
exports.main = function (next, request, response) {
var debug = true,
nodemailer = require('nodemailer'),
smtpLoginAuth = "",
smtpPasswordAuth = "",
smtpProviderAuth = "",
transporter = nodemailer.createTransport('smtps://' + smtpLoginAuth + ':' + smtpPasswordAuth + '@' + smtpProviderAuth);
body = [];
request.on('data', function (chunk) {
body.push(chunk);
}).on('end', function () {
var mailOptions;
body = JSON.parse(Buffer.concat(body).toString());
mailOptions = {
from: body.from,
to: body.to,
subject: body.subject,
text: body.content
};
debug && console.log('debug', mailOptions);
transporter.sendMail(mailOptions, function (error) {
if (error) {
// FAILLURE
response.writeHead(503, {
"Content-Type": "application/json; charset=utf-8"
});
next({ success: false, error: error });
} else {
// SUCCESS
response.writeHead(200, {
"Content-Type": "application/json; charset=utf-8"
});
response.statusCode = 200;
next({ success: true });
}
});
});
};
Qui renvoi au client le fait que l’email est correctement parti ou non (dans notre cas une erreur car les variables d’accès au SMTP sont vide, voir plus bas).
Le détail des appels nécessaires (l’appelant front-end et l’endpoint REST) sont développé dans le fichier server.js
(ainsi que le port et l’URL déjà mentionné par @tagadapps ).
/* jslint node: true */
var http = require("http"),
fs = require("fs"),
httpPort = 7749,
httpServer;
httpServer = http.createServer(function (request, response) {
var router = {
"/": {
view: "index.htm",
controller: false
},
"/send-email/": {
view: false,
controller: "sendemail.js"
}
},
view = router[request.url].view,
controller = router[request.url].controller,
statusCode = (router[request.url].view) ? 200 : 404;
if (view) {
fs.readFile('./views/' + view, "utf-8", function (err, content) {
if (err) {
console.log("We cannot open " + view + " view file.");
}
response.writeHead(statusCode, {
"Content-Type": "text/html; charset=utf-8"
});
response.end(content);
});
}
if (controller) {
require('./controllers/' + controller).main(function (content) {
response.end(JSON.stringify(content, null, ' '));
}, request, response);
}
});
httpServer.listen(httpPort, function () {
console.log("Server listening on: http://localhost:%s", httpPort);
});
C’est en fonction de cette réponse que nous choisissons de quelle manière nous informons ensuite l’utilisateur final (voir la partie JavaScript de index.htm
).
Merci à @tagadapps pour l’exercice super intéressant !
J’espère qu’avec tout ça @VincentDev83, tu trouverras ton bonheur :)