Отправка электронной почты с помощью OAuth2, NodeJs правильным способом

Здравствуйте, несколько месяцев назад я написал статью о том, как отправлять электронную почту с помощью NodeJs. Посмотрите статью здесь.

Хотя метод, описанный в блоге, работает хорошо, в его использовании есть несколько недостатков.
Сегодня я расскажу вам о лучшем способе отправки электронной почты в NodeJs.

Необходимые условия

🎯 Установите NodeJS
🎯 Основы NodeJS RestAPI


Настройка

Зайдите в консоль разработчика google и создайте новый проект, добавьте имя проекта и нажмите кнопку создать.

Переключитесь на проект, который вы только что создали. Я назвал свой Luther.


Создайте учетные данные API, нажмите на меню гамбургер и перейдите к API и Services.

Давайте получим наши учетные данные

Нажмите на учетные данные

Нажмите на OAuth ClientId

Нажмите на экран настройки согласия

Нажмите на создать

Настройте экран

Добавьте название вашего приложения, электронную почту и логотип в выделенное поле

Нажмите Сохранить и продолжить

Нажмите сохранить и продолжить, оставив все остальные настройки по умолчанию

Снова нажмите на значок создания учетных данных

Нажмите Oauth CLient Id

Выберите тип приложения

Добавьте ваше перенаправление и нажмите кнопку создать

Вы получите clientID и секрет, которые вы можете скачать или скопировать в безопасное место.


Настройте OAuth

Перейдите по этому адресу https://developers.google.com/oauthplayground и нажмите на значок шестеренки.

Нажмите использовать собственные учетные данные

Введите clientID и секретный ключ, который вы сохранили ранее.

Далее введите этот url: https://mail.google.com/ в выделенное оранжевым цветом поле ниже.

Нажмите на кнопку authorized api и выберите email, который вы хотите авторизовать Fig X


Исправление ошибки -> Иногда на этом этапе возникает ошибка авторизации.

Чтобы исправить это, давайте авторизуем наше приложение, перейдите на приборную панель и нажмите на экран согласия OAuth

Нажмите на публикацию

Повторите процесс Fig X, и вы попадете на эту страницу.

Нажмите на кнопку Advanced, затем на кнопку unsafe.

Нажмите на продолжить

Вы должны быть перенаправлены обратно на страницу OAuth

Нажмите на обмен кода авторизации на токен в разделе Шаг 2.

В результате будут сгенерированы токен обновления, токен доступа и код авторизации. Скопируйте и сохраните их в безопасном месте.


Теперь, когда мы получили учетные данные api google console, давайте создадим наше NodeJS-приложение с помощью ExpressJS.

Инциализация приложения NodeJs

npm init -y

Установите зависимости для разработки

npm i express nodemailer googleapis

Создайте сервер NodeJS

index.js

Создайте модель пользователя

models/user.model.js

Создайте маршрут пользователя

routes/user.route.js

const router = express.Router();

// signup
router.post('/signup', userSignup);
//...
modeule.exports = router;
Вход в полноэкранный режим Выйти из полноэкранного режима

Создайте свое приложение nodejs и создайте внутри него почтовую папку
const nodemailer = require('nodemailer');
const { google } = require('googleapis');
const OAuth2 = google.auth.OAuth2;

const oauth2Client = new OAuth2(
  'put client id here',
  'put client secret here', // Client Secret
  'https://developers.google.com/oauthplayground' // Redirect URL
);

oauth2Client.setCredentials({
  refresh_token:
    ' add your refresh token here',
});
const accessToken = oauth2Client.getAccessToken();

const sendEmail = async (options) => {
  const transporter = nodemailer.createTransport({
    service: 'gmail',
    auth: {
      type: 'OAuth2',
      user: 'put your email here',
      clientId:
        'put your client id here',
      clientSecret: 'put your client secret here',
      refreshToken:
        'put your refresh token here',
      accessToken: accessToken,
    },
    tls: {
      rejectUnauthorized: false,
    },
  });
  try {
    const message = {
      from: "put your email here",
      to: options.email,
      subject: options.subject,
      text: options.message,
      html: options.message,
    };

    const m = await transporter.sendMail(message);
    console.log(m);
  } catch (error) {
    console.log(error);
    return error;
  }
};

module.exports = sendEmail;
Войти в полноэкранный режим Выйти из полноэкранного режима
Затем в вашем файле user.controller.js
const User = require('../models/user.model');
const House = require('../models/house.model');
const bcrypt = require('bcrypt');
const jwt = require('jsonwebtoken');
const sendEmail = require('../mail/email-sender');

exports.userSignup = async (req, res) => {
  const { password, email, name } = req.body;
  try {
    //  hash password
    const salt = await bcrypt.genSalt(10);
    const hashedPassword = await bcrypt.hash(password, salt);
    const user = await User.create({
      name,
      email,
      password: hashedPassword,
    });
    await sendEmail({
      email: user.email,
      subject: `${user.name} Registered Successfully`,
      message: `<div>
          <h1>HELLO ${user.name}</h1>
          <h2>You just registered successfully</h2>
      </div>`,
    });
    return res
      .status(201)
      .json({ message: 'User created successfully', userId: user._id });
  } catch (error) {
    console.log(error);
    if (error.message.includes('duplicate key error')) {
      return res
        .status(200)
        .json({ message: `${error.message.split('{')[1]} already exist` });
    }
    return res
      .status(500)
      .json({ error: error.message, message: 'internal server error' });
  }
};
Войти в полноэкранный режим Выйти из полноэкранного режима

⚠️: Убедитесь, что вы используете свой .env для хранения учетных данных.


Тестирование нашего API

Давайте протестируем наш API с помощью postman

Проверьте интегрированный терминал на наличие вывода


Проверьте электронную почту

🕺🏻🕺🏻🕺🏻🕺🏻🕺🏻🕺🏻 Это сработало


Заключение

Надеюсь, этот пост был полезен для отправки электронной почты с помощью NodeJS.
Спасибо за прочтение

Оцените статью
devanswers.ru
Добавить комментарий