0

I am trying to develop a mail sending module in my NestJs project. when I send the mail through my local machine it works fine. But when it goes to the server (digital-ocean droplet) it throws the following error and it does not send any email further. what is going on and fix this?

Error on server

My code segment is below:

  1. Auth controller

     @Post('register')
      async register(@Body() register: RegisterRequest) {
        const res = await this.authService.register(register);
        if (res instanceof Error) {
          throw res;
        }
        return {
          statusCode: 200,
          message:
            'Your account is registered successfully. Please check your email to verify your account',
        };
      }
    
  2. Auth Service

    async register(register: RegisterRequest): Promise<any> {
      register.isRegister = true;
      register.status = 0;
      register.roleId = 5;
      const user = await this.userService.save(register);
      console.log('User Saved');
      if (user instanceof User) {
        if (register.isRegister) {
          console.log('IS REGISTER');
          // Generate Token
          const resultsToken = await this.userTokenService.save(user.id, 1);
          console.log('USER TOKEN SAVED');
          if (resultsToken) {
            this.mailService.sendUserConfirmation(user, resultsToken.token);
          }
      }
    }
    return user;
    }
    
  3. User Service

    async save(register: RegisterRequest): Promise<User> {
    try {
      const token = generateToken(8);
      const user = new User();
      user.email = register.email;
      user.firstName = register.firstName;
      user.lastName = register.lastName;
      user.password = hashPassword(register.password || token);
      user.role = register.roleId;
      user.phoneNumber = register.phoneNumber;
      user.isActive = register.status;
      const errors = await validate(user);
      if (errors.length > 0) {
        throw new ParameterMissingException(
          errors[0].constraints[Object.keys(errors[0].constraints)[0]],
        );
      }
      const existing = await this.findOneByEmail(register.email);
      if (existing) {
        throw new EntityFoundException('Email');
      }
      const registered = await this.userRepository.save(user);
      return registered;
    } catch (error) {
      return error;
    }
    }
    
  4. User Token service

    async save(userId: number, type: number): Promise<UserToken> {
    try {
      const userToken = new UserToken();
      userToken.user = userId;
      userToken.type = type;
      userToken.token = generateToken();
      if (type === 2) {
        userToken.expireIn = 15;
      }
      console.log('USER TOKEN SAVE');
      return await this.userTokenRepository.save(userToken);
    } catch (error) {
      console.log('USER TOKEN ERROR');
      return error;
    }
    }
    
  5. Mail Service

    sendUserConfirmation(user: any, token: string) {
    const url = `${
      this.configService.get<string>('REGISTER_CONFIRM_URL') + token
    }`;
    console.log('MAIL SERVICE ' + url);
    this.mailerService
      .sendMail({
        to: user.email,
        // from: '"Support Team" <support@example.com>', // override default from
        subject: 'Greetings from CEWAS!',
        template: join(__dirname, 'templates') + './register-confirmation',
        context: {
          url,
        },
      })
      .then((r) => console.log(r))
      .catch((err) => {
        console.log('MAIL SERVICE ERROR');
        console.log(err);
      });
    }
    
  6. Mail Module and Config

    import { MailerModule } from '@nestjs-modules/mailer';
    import { HandlebarsAdapter } from '@nestjs- 
    modules/mailer/dist/adapters/handlebars.adapter';
    import { Module } from '@nestjs/common';
    import { MailService } from './mail.service';
    import { join } from 'path';
    
    @Module({
     imports: [
      MailerModule.forRoot({
      transport: {
        service: 'gmail',
        secure: true,
        auth: {
          user: '********@gmail.com',
          pass: '********',
        },
      },
      defaults: {
        from: '"<No Reply>" <*******@gmail.com>',
      },
      template: {
        dir: join(__dirname, 'templates'),
        adapter: new HandlebarsAdapter(),
        options: {
          strict: true,
          },
         },
       }),
     ],
     providers: [MailService],
     exports: [MailService],
    })
     export class MailModule {}
    
James Z
  • 12,209
  • 10
  • 24
  • 44

1 Answers1

0

Hi try whit this configuration in your transport:

transport: {
     host: 'smtp.gmail.com',
     port: 465,
     ignoreTLS: true,
     secure: true,
     auth: {
       user: '********@gmail.com', //use the .env variable here for security
       pass: '********'
     },
}

and make sure you turned on access for less secure app

here the link: less secure app