Envío de correo electrónico con Node Mailer y Sendgrid en la stack Angular MEAN utilizando el astackdo completo angular de Yeoman

Estoy tratando de entender dónde ubicar la lógica para enviar un correo electrónico a través de un formulario de contacto en mi Aplicación Angular (usando la stack de MEAN de ángulo completo de Yeoman).

Puedo agregar la lógica para enviar un correo electrónico en el archivo app.js en el lado del servidor usando nodemailer y sendgrid y todo funciona y se envía un correo electrónico cada vez que actualizo el servidor, sin embargo estoy un poco confuso sobre dónde colocar la lógica de modo que solo se envía una vez que se envía el formulario y llega al lado del servidor.

Así es como se ve la acción de crear en el lado de Express JS …

exports.create = function(req, res) { Contact.create(req.body, function(err, contact) { if(err) { return handleError(res, err); } return res.json(201, contact); }); }; 

Aquí está el código en app.js que está funcionando, pero obviamente no en el lugar correcto …

 var nodemailer = require('nodemailer'); var sgTransport = require('nodemailer-sendgrid-transport'); var options = { auth: { api_user: 'username', // 'SENDGRID_USERNAME' - Recommended to store as evn variables api_key: 'password', // 'SENDGRID_PASSWORD' } }; var mailer = nodemailer.createTransport(sgTransport(options)); var email = { to: '[email protected]', from: '[email protected]', subject: 'Test Email', text: 'Awesome Email', html: 'Bold and Awesome Email' }; mailer.sendMail(email, function(err, res) { if (err) { console.log(err) } console.log(res); }); 

Desde un fondo de Rails, mi pensamiento inicial es pegar la lógica en la acción de crear para que, si el objeto se crea con éxito, se envíe el correo electrónico. ¿Es esta una forma correcta de pensar en esto en este escenario? Soy nuevo en la stack MEAN.

Gracias por cualquier ayuda…

Debe crear una ruta en el servidor donde puede publicar valores de formulario desde Angular usando $ http.post. Lo siguiente le permite ingresar detalles en forma Angular. Luego, el formulario se publica en Nodo, donde se extraen los valores necesarios y se agrega un objeto de correo electrónico. El correo electrónico es luego enviado por SendGrid.

SERVIDOR.JS

 var express = require('express'); var http = require('http'); var bodyParser = require('body-parser'); var dotenv = require('dotenv'); dotenv.load(); //load environment variables from .env into ENV (process.env). var sendgrid_username = process.env.SENDGRID_USERNAME; var sendgrid_password = process.env.SENDGRID_PASSWORD; var sendgrid = require('sendgrid')(sendgrid_username, sendgrid_password); var email = new sendgrid.Email(); var app = express(); app.use(bodyParser.json()); //needed for req.body app.set('port', process.env.PORT || 3000); app.use(express.static(__dirname + '/public')); app.post('/email', function(req, res) { email.addTo(req.body.to); email.setFrom(req.body.from); email.setSubject(req.body.subject); email.setText(req.body.text); email.addHeader('X-Sent-Using', 'SendGrid-API'); email.addHeader('X-Transport', 'web'); sendgrid.send(email, function(err, json) { if (err) { return res.send("Problem Sending Email!!!!"); } console.log(json); res.send("Email Sent OK!!!!"); }); }); var server = http.createServer(app); server.listen(app.get('port'), function() { console.log('Express server listening on port ' + app.get('port') ) ; }); 

INDEX.HTML

         

CLIENTE LADO APP.JS

 angular.module('myApp', []) .controller('MainCtrl', function($scope, $http) { $scope.submitEmail = function() { console.log("TEST"); //Request $http.post('/email', $scope.email) .success(function(data, status) { console.log("Sent ok"); }) .error(function(data, status) { console.log("Error"); }) }; });