ENVIO DE CORREOS CON NODEMAILER MEDIANTE GMAIL
let ConfigData = require('./../data/ConfigDataServicios.js');
let GestorDatos = require('./../services/GestorDatos')
let gestorDatos = new GestorDatos()
let Entidades = require('./../data/Entidades')
let Entidad = new Entidades()
const CONF_CORREO = ConfigData.correo;
let EmailTemplates = require('swig-email-templates');
let nodemailer = require('nodemailer');
let async = require("async");
var snc = require('snc')
var verifier = require('email-exist');
let ListaCorreos = require('./../data/ListaCorreos.json')
var success_email = []
var failure_email = []
var CantidadEnvios = 20
var ConsultasArmadas = []
exports.enviarCorreo = function (req, res) {
console.log("Envio CorreoMasivo");
//Configuracion de correo
transporter = nodemailer.createTransport({
host: CONF_CORREO.host,
port: CONF_CORREO.puerto,
secure: CONF_CORREO.seguro, // secure:true para puerto 465, secure:false para puerto 587
auth: {
user: CONF_CORREO.correoUsuario,
pass: CONF_CORREO.password
},
tls: { rejectUnauthorized: false },
debug:true
});
// Fetch all the emails from database and push it in listofemails
success_email = []
failure_email = []
comenzarEnvio(req.body).then(pRespuesta => {
res.send(pRespuesta)
});
}
var comenzarEnvio = function (DatosRequest) {
return new Promise((resolve, reject) => {
let pParametros = {
contenidoCorreo : DatosRequest.parametros || { nombre_modulo : '', fecha_inicio : '', fecha_fin : '', link: '' },
asuntoCorreo : DatosRequest.asunto || '',
plantillaCorreo : DatosRequest.templeta || 'default.html',
IdModuloVersion : DatosRequest.IdModuloVersion
}
// Realizando el bucle async de la lista de correos.
// async.each(DatosRequest.listaCorreos,enviarCorreo.bind(null, pParametros), function(){
ConsultasArmadas = []
async.each(ListaCorreos,enviarCorreo.bind(null, pParametros), function(){
resolve({
Correcto: true,
ListaFallidos : failure_email,
ListaCorreosEnviados : success_email
})
});
})
}
var enviarCorreo = function (ContenidoEmail, Destinatario, FuncionRetorno) {
console.log('envioCorreo Funcion')
let estado = false
async.waterfall([(callback) => {
if (validarCorreo(Destinatario.Email)) {
var mailOptions = {
from: CONF_CORREO.correoNombre+' <'+CONF_CORREO.correoUsuario+'>',
to: Destinatario.Email,
subject: ContenidoEmail.asuntoCorreo
};
let templates = new EmailTemplates({root:CONF_CORREO.rutaTempleta});
templates.render(ContenidoEmail.plantillaCorreo, ContenidoEmail.contenidoCorreo, (err, html, text, subject) => {
//Asigna la respuesta HTML para ser enviado
mailOptions.html =html;
mailOptions.attachments= [
//Adjunto imagen
{
filename: 'Logo',
path: CONF_CORREO.rutaTempleta+'/logo.jpg',
cid: 'correoTempleta'
}
]
transporter.sendMail(mailOptions, function(error, info) {
if(error) {
console.log(error)
failure_email.push(Destinatario);
} else {
estado = true;
success_email.push(Destinatario);
}
callback(null,estado,Destinatario);
});
});
} else {
failure_email.push(Destinatario);
callback(null,estado,Destinatario);
}
}, (EstadoPeticion,DatosPersona,callback) => {
console.log("El envio del correo a: " + DatosPersona.Email + " tiene el estado de :" + EstadoPeticion);
generacionBlast(DatosPersona, EstadoPeticion, ContenidoEmail.IdModuloVersion).then(pRespuesta => {
ConsultasArmadas.push(pRespuesta)
callback()
})
}],function(){
//When everything is done return back to caller.
FuncionRetorno();
})
}
var validarCorreo = function (pCorreo) {
//Expresion regular para validar correo
var re = /\S+@\S+\.\S+/;
if (!re.test(pCorreo)) {
return false
} else {
return true
}
}
var generacionBlast = function (pDatosPersona, EstadoEnvioCorreo, pIdModuloVersion) {
console.log('generacionBlast', pDatosPersona, EstadoEnvioCorreo, pIdModuloVersion)
let EntidadModuloUsuario = Entidad.obtenerEntidad('ModuloUsuario')
EntidadModuloUsuario.EnvioMail = EstadoEnvioCorreo ? '1' : '0'
let Condicion = { IdUsuario: pDatosPersona.IdPersona, IdModuloVersion : pIdModuloVersion }
resolve({ entidad: EntidadModuloUsuario, condicion: Condicion, tipo: 'actualizar' })
}
var asyncActualizarDatosPersona = function () {
return new Promise((resolve, reject) => {
resolve({
Correcto : true
})
})
}
var actualizarPersona = function (pDatosPersona, EstadoEnvioCorreo, pIdModuloVersion) {
return new Promise((resolve, reject) => {
console.log('CantidadEnvios', CantidadEnvios)
let EntidadModuloUsuario = Entidad.obtenerEntidad('ModuloUsuario')
EntidadModuloUsuario.EnvioMail = EstadoEnvioCorreo ? '1' : '0'
let Condicion = { IdUsuario: pDatosPersona.IdPersona, IdModuloVersion : pIdModuloVersion }
gestorDatos.ModificarRegistro(EntidadModuloUsuario, Condicion, pRespuestaModificado => {
//console.log('pRespuestaModificado', pRespuestaModificado)
resolve(pRespuestaModificado)
})
})
}