Skip to content

Instantly share code, notes, and snippets.

@WanerValencia
Created June 20, 2023 02:37
Show Gist options
  • Save WanerValencia/694a549c6c315ede7df9fa0d508ed375 to your computer and use it in GitHub Desktop.
Save WanerValencia/694a549c6c315ede7df9fa0d508ed375 to your computer and use it in GitHub Desktop.
Enviar mails con AWS SES en Nestjs

AWS SES con Nodemailer en NestJS

En esta sección, aprenderemos cómo configurar y utilizar el servicio de correo electrónico AWS SES (Simple Email Service) con Nodemailer en una aplicación NestJS. AWS SES es un servicio de correo electrónico escalable y rentable que te permite enviar correos electrónicos en aplicaciones web y móviles.

Instalación de paquetes

Primero, asegúrate de tener los siguientes paquetes instalados en tu proyecto de NestJS:

$ npm install aws-sdk nodemailer

Configuración de AWS SES

  1. Asegúrate de tener una cuenta de AWS y que tu aplicación tenga acceso a AWS SES. Obtén tus credenciales de AWS Access Key ID y Secret Access Key.

  2. Configura las variables de entorno en tu archivo .env o en tu sistema operativo para almacenar tus credenciales de AWS:

AWS_REGION=us-east-1
AWS_ACCESS_KEY=your_access_key
AWS_SECRET_ACCESS_KEY=your_secret_access_key
AWS_SES_FROM=your_email_address

Implementación del servicio de correo

A continuación, implementaremos un servicio de correo electrónico utilizando AWS SES y Nodemailer en NestJS. Este servicio se encargará de enviar correos electrónicos utilizando la configuración de AWS SES que hemos establecido.

import { Injectable, Logger } from '@nestjs/common';
import { IMailService, mailParams } from '../../core/interfaces/index.interface';
import * as aws from '@aws-sdk/client-ses';
import { ConfigService } from '@nestjs/config';
import * as nodemailer from 'nodemailer';

@Injectable()
export class MailService implements IMailService {
  private ses: aws.SES;
  private transporter: nodemailer.Transporter;

  private readonly logger = new Logger(MailService.name);

  constructor(private readonly configService: ConfigService) {
    this.ses = new aws.SES({
      region: this.configService.get('AWS_REGION'),
      credentials: {
        accessKeyId: this.configService.get('AWS_ACCESS_KEY'),
        secretAccessKey: this.configService.get('AWS_SECRET_ACCESS_KEY'),
      },
    });

    this.transporter = nodemailer.createTransport({
      SES: { aws, ses: this.ses },
    });
  }

  async sendMail(params: mailParams) {
    const { to, subject, text, attachments, html } = params;

    const mailOptions = {
      from: this.configService.getOrThrow<string>('AWS_SES_FROM'),
      to,
      subject,
      text,
      html,
      attachments,
    };

    try {
      await this.transporter.sendMail(mailOptions as any);
      this.logger.log(
        'Email sent',
        JSON.stringify({
          ...mailOptions,
          attachments: undefined,
          html: undefined,
        }),
      );
    } catch (error) {
      this.logger.error(error);
    }
  }
}

En el código anterior, creamos una clase MailService que implementa la interfaz IMailService. El constructor de la clase configura el cliente de SES de AWS y el transportador de Nodemailer utilizando las credenciales y la región proporcionadas en la configuración.

El método sendMail acepta los parámetros del correo electrónico, como el destinatario, el asunto, el texto, el HTML y los archivos adjuntos, y utiliza el transportador de Nodemailer para enviar el correo electrónico utilizando AWS SES.

Uso del servicio de correo

Para usar el servicio

de correo en tu aplicación, simplemente importa el servicio MailService y llame al método sendMail con los parámetros adecuados:

import { Controller, Post, Body } from '@nestjs/common';
import { MailService } from '../services/aws-ses.service';

@Controller('email')
export class EmailController {
  constructor(private readonly mailService: MailService) {}

  @Post('send')
  async sendEmail(@Body() body: any) {
    const { to, subject, text } = body;

    await this.mailService.sendMail({
      to,
      subject,
      text,
    });
  }
}

En el ejemplo anterior, creamos un controlador EmailController con un método sendEmail que acepta los parámetros del correo electrónico (destinatario, asunto y texto) del cuerpo de la solicitud. Luego, llamamos al método sendMail del servicio MailService para enviar el correo electrónico.

Configuración del módulo de AWS

Por último, debemos configurar el módulo de NestJS para que pueda utilizar el servicio de correo de AWS:

import { Module } from '@nestjs/common';
import { ConfigModule } from '@nestjs/config';
import { MailService } from './services/aws-ses.service';

@Module({
  imports: [ConfigModule.forRoot()],
  providers: [MailService],
  exports: [MailService],
})
export class AwsModule {}

En el módulo de NestJS, importamos el módulo de configuración para acceder a las variables de entorno y registramos el servicio MailService como un proveedor. También exportamos el servicio para que pueda ser utilizado en otros módulos.

Conclusiones

En esta guía, aprendimos cómo configurar y utilizar AWS SES con Nodemailer en una aplicación NestJS. Configuramos la conexión a AWS SES utilizando las credenciales de AWS y la región correspondiente. Implementamos un servicio de correo utilizando Nodemailer y el cliente de SES de AWS, y luego lo utilizamos en un controlador para enviar correos electrónicos. Recuerda ajustar la configuración según tus necesidades y asegurarte de tener las credenciales de AWS correctas.

@softwarecodeCL
Copy link

de donde sale '../../core/interfaces/index.interface'; ? como se que debo tener ahi ?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment