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?
My code segment is below:
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', }; }
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; }
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; } }
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; } }
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); }); }
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 {}