From ccf476bd6e03e851b8c77691478e50fab938c1e6 Mon Sep 17 00:00:00 2001 From: evenegas Date: Fri, 27 Jun 2025 20:43:08 -0600 Subject: [PATCH] =?UTF-8?q?ultima=20versi=C3=B3n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/auth/auth.service.ts | 7 +- src/mail/mail.service.ts | 248 ++++++++++++++++++++------------------- 2 files changed, 129 insertions(+), 126 deletions(-) diff --git a/src/auth/auth.service.ts b/src/auth/auth.service.ts index 64290f7..68117d3 100644 --- a/src/auth/auth.service.ts +++ b/src/auth/auth.service.ts @@ -3,19 +3,20 @@ import { JwtService } from '@nestjs/jwt'; @Injectable() export class AuthService { - constructor(private jwtService: JwtService) {} + constructor(private jwtService: JwtService) { } generarToken(payload: any) { return this.jwtService.sign(payload, { - secret: process.env.JWT_SECRET, + secret: process.env.JWT_SECRET, expiresIn: '1d', }); } verificarToken(token: string) { + try { return this.jwtService.verify(token, { - secret: process.env.JWT_SECRET, + secret: process.env.JWT_SECRET, }); } catch { return null; diff --git a/src/mail/mail.service.ts b/src/mail/mail.service.ts index be98d09..a8a3fde 100644 --- a/src/mail/mail.service.ts +++ b/src/mail/mail.service.ts @@ -15,46 +15,46 @@ export class MailService { constructor( - private readonly sistemaService: SistemaService, - private readonly authService: AuthService, - @InjectRepository(Correo) private readonly correoRepository: Repository, - @InjectRepository(Status) private readonly statusRepository: Repository, - @InjectRepository(Sistema) private readonly sistemaRepositosistemaRepositoryry: Repository - - -) { - - - - /* this.transporter = nodemailer.createTransport({ - host: 'smtp-relay.gmail.com', - port: 587, - secure: false, - requireTLS: true, - auth: { - user: process.env.USER_GMAIL, - pass: process.env.PASS_GMAIL, - }, - }); */ + private readonly sistemaService: SistemaService, + private readonly authService: AuthService, + @InjectRepository(Correo) private readonly correoRepository: Repository, + @InjectRepository(Status) private readonly statusRepository: Repository, + @InjectRepository(Sistema) private readonly sistemaRepositosistemaRepositoryry: Repository - -/* - this.transporter = nodemailer.createTransport({ - host: 'smtp.gmail.com', // o smtp‑relay.gmail.com (ver punto 2) - port: 587, - secure: false, - requireTLS: true, // TLS STARTTLS - auth: { user: process.env.USER_GMAIL, pass: process.env.PASS_GMAIL }, - pool: true, // <‑‑ activa reuse - maxConnections: 1, // una sola conexión viva - maxMessages: 100, // reabrir después de 100 envíos - rateDelta: 2000, // ventana 1 s - rateLimit: 1 // máx. 5 mensajes/seg - }); + + ) { + + + + /* this.transporter = nodemailer.createTransport({ + host: 'smtp-relay.gmail.com', + port: 587, + secure: false, + requireTLS: true, + auth: { + user: process.env.USER_GMAIL, + pass: process.env.PASS_GMAIL, + }, + }); */ + + + /* + this.transporter = nodemailer.createTransport({ + host: 'smtp.gmail.com', // o smtp‑relay.gmail.com (ver punto 2) + port: 587, + secure: false, + requireTLS: true, // TLS STARTTLS + auth: { user: process.env.USER_GMAIL, pass: process.env.PASS_GMAIL }, + pool: true, // <‑‑ activa reuse + maxConnections: 1, // una sola conexión viva + maxMessages: 100, // reabrir después de 100 envíos + rateDelta: 2000, // ventana 1 s + rateLimit: 1 // máx. 5 mensajes/seg + }); + - - */ - + */ + /* this.transporter = nodemailer.createTransport({ host: 'localhost', @@ -64,81 +64,83 @@ export class MailService { */ } - - - async findAllBySistema(TOKEN:string,nombreSistema:string){ + + + async findAllBySistema(TOKEN: string, nombreSistema: string) { if (!TOKEN) { throw new UnauthorizedException('Header "Password" es requerido'); } - - const sistem=await this.sistemaService.acceso(TOKEN) - if(!sistem){ + + const sistem = await this.sistemaService.acceso(TOKEN) + if (!sistem) { throw new UnauthorizedException('Password incorrecto'); } - const result= await this.correoRepository.find({where:{ - id_sistema:{nombre_sistema:nombreSistema} - }, - relations: { - id_sistema: true, - id_status: true, - },} + const result = await this.correoRepository.find({ + where: { + id_sistema: { nombre_sistema: nombreSistema } + }, + relations: { + id_sistema: true, + id_status: true, + }, + } ) return result -} + } -async sendMail(sendEmail:SendCorreoDto,token:string) { - + async sendMail(sendEmail: SendCorreoDto, token: string) { + console.log("token", token) let payload - - payload = await this.authService.verificarToken(token); - - if (!payload || !payload.nombre) { - throw new UnauthorizedException('Token inválido o incompleto'); - } - - const sistem= await this.sistemaService.findByNombre(payload.nombre) - - - if(!sistem){ + payload = await this.authService.verificarToken(token); + + console.log("payload", payload) + if (!payload || !payload.nombre) { + throw new UnauthorizedException('Token inválido o incompleto'); + } + + const sistem = await this.sistemaService.findByNombre(payload.nombre) + + + if (!sistem) { throw new UnauthorizedException('sistema No encontrado'); } - - const decryptedPassword = decrypt( - sistem.email_password_encrypted, - sistem.email_password_iv - ); - const decryptedToken = decrypt( - sistem.refreshToken_encrypted, - sistem.refreshToken_iv - ); + const decryptedPassword = decrypt( + sistem.email_password_encrypted, + sistem.email_password_iv + ); + + const decryptedToken = decrypt( + sistem.refreshToken_encrypted, + sistem.refreshToken_iv + ); + - const transporter = nodemailer.createTransport({ - /* host: 'smtp.gmail.com', // o smtp‑relay.gmail.com (ver punto 2) - port: 587, - secure: false, - requireTLS: true, // TLS STARTTLS - auth: { user:sistem.email, pass:decryptedPassword}, - pool: true, // <‑‑ activa reuse - maxConnections: 1, // una sola conexión viva - maxMessages: 100, // reabrir después de 100 envíos - rateDelta: 2000, // ventana 1 s - rateLimit: 1 // máx. 5 mensajes/seg - */ + /* host: 'smtp.gmail.com', // o smtp‑relay.gmail.com (ver punto 2) + port: 587, + secure: false, + requireTLS: true, // TLS STARTTLS + auth: { user:sistem.email, pass:decryptedPassword}, + pool: true, // <‑‑ activa reuse + maxConnections: 1, // una sola conexión viva + maxMessages: 100, // reabrir después de 100 envíos + rateDelta: 2000, // ventana 1 s + rateLimit: 1 // máx. 5 mensajes/seg + */ service: 'gmail', auth: { @@ -154,56 +156,56 @@ async sendMail(sendEmail:SendCorreoDto,token:string) { maxMessages: 100, rateDelta: 2000, rateLimit: 1 - - + + }); - - - console.log("estos son los archivos adjuntos en el service",sendEmail.adjuntos); - + + console.log("estos son los archivos adjuntos en el service", sendEmail.adjuntos); + + const mailOptions = { from: sistem.email, - to:sendEmail.to, - subject:sendEmail.subject, + to: sendEmail.to, + subject: sendEmail.subject, text: sendEmail.text, - html:sendEmail.html, + html: sendEmail.html, - // OJO: nodemailer usa 'attachments', no 'adjuntos' - attachments: (sendEmail.adjuntos || []).map((adj) => { - // Asegúrate de no incluir 'data:image/png;base64,' en 'content' - let base64Clean = adj.content; - // Si viene con prefijo "data:image...", lo quitamos - if (base64Clean.startsWith('data:image/')) { - base64Clean = base64Clean.split('base64,')[1]; - } - - return { - filename: adj.filename || 'qr.png', - content: Buffer.from(base64Clean, adj.encoding || 'base64'), - cid: adj.cid || 'qrCode', // el mismo que uses en - contentType: 'image/png' // recomendable para que sepa que es PNG - }; - }) + // OJO: nodemailer usa 'attachments', no 'adjuntos' + attachments: (sendEmail.adjuntos || []).map((adj) => { + // Asegúrate de no incluir 'data:image/png;base64,' en 'content' + let base64Clean = adj.content; + // Si viene con prefijo "data:image...", lo quitamos + if (base64Clean.startsWith('data:image/')) { + base64Clean = base64Clean.split('base64,')[1]; + } + + return { + filename: adj.filename || 'qr.png', + content: Buffer.from(base64Clean, adj.encoding || 'base64'), + cid: adj.cid || 'qrCode', // el mismo que uses en + contentType: 'image/png' // recomendable para que sepa que es PNG + }; + }) }; console.log(mailOptions); - - let resMail = await transporter.sendMail(mailOptions); -if(!resMail) throw new Error("") + + let resMail = await transporter.sendMail(mailOptions); + if (!resMail) throw new Error("") const statusTexto = resMail.accepted.length > 0 ? "Enviado" : "Fallido"; - + let status = await this.statusRepository.findOne({ where: { status: statusTexto } }); @@ -211,8 +213,8 @@ if(!resMail) throw new Error("") status = this.statusRepository.create({ status: statusTexto }); await this.statusRepository.save(status); } - - const info= this.correoRepository.create({ + + const info = this.correoRepository.create({ id_status: status, id_sistema: sistem, fecha_recibido: sendEmail.fecha_recibido, @@ -220,19 +222,19 @@ if(!resMail) throw new Error("") destinatario: sendEmail.to, remitente: sistem.email, - }); + }); - - if(!resMail){ + + if (!resMail) { throw new Error("fallo") } this.correoRepository.save(info); - + return (statusTexto); } - - + + }