GuillermoParedes
9/27/2017 - 2:08 PM

SEND MAIL NODEMAILER

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)
    })
  })
}