Sendgrid с серверной частью Nodejs

#node.js #sendgrid

#node.js #sendgrid

Вопрос:

Я пытаюсь использовать почтовую службу SendGrid для отправки почты, и она выдает ошибку 400 на сервере nodejs.

Это из Sendgrid или из интерфейса?

Я также получил содержимое в текстовом редакторе quill, потому что я его использую.

Каждый раз, когда я получаю «НЕВЕРНЫЙ ЗАПРОС» на сервере, но он отправляется как [ссылка на объект null].

Mail.js , где я создаю функцию:

 // SendGrid
const sgMail = require('@sendgrid/mail');
sgMail.setApiKey(process.env.SENDGRID_API_KEY);

// cb means callback for error or success
const sendEmail = (email, subject, content, cb) => {
  const msg = {
    from: email,
    to: 'oabdulazeez70@gmail.com',
    cc: 'letayoknow@gmail.com',
    subject: subject,
    text: content,
    // html: content,
  };
  sgMail
    .send(msg)
    .then(() => {
      console.log('Email sent');
      // console.log(cb(null, data));
    })
    .catch((error) => {
      console.error(error);
      // console.log(cb(error, null));
    });
};

module.exports = sendEmail;
  

index.js // сервер (серверная часть)

 const express = require('express');
const bodyParser = require('body-parser');
const exphbs = require('express-handlebars');
const cors = require('cors');
const path = require('path');
const dotenv = require('dotenv');
const app = express();

dotenv.config({ path: './config/config.env' });

// bring in SendEmail
const sendMail = require('./mail');

// View engine setup
app.engine('handlebars', exphbs({ defaultLayout: false }));
app.set('view engine', 'handlebars');

// Static folder
app.use('/public', express.static(path.join(__dirname, 'public')));

// Body Parser Middleware
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());
app.use(cors());

app.get('/', (req, res) => {
  res.sendFile(path.join(__dirname, 'public', 'contact.html'));
  // res.sendFile('contact.html', { root: '.' });
});
//old key
//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
app.post('/send', (req, res) => {
  const { subject, to, content, email } = sendMail;
  sendMail(email, to, subject, content, () => {
    if (err) {
      console.error(err.ResponseError);
      res.status(400).json({ message: 'Internal Error' });
    } else if (res.status(500)) {
      console.log('Error Something happned!');
    } else {
      console.log(data);
      res.json({ message: 'Message Sent' });
    }
  });
  console.log(req.body);
});

// Setting PORT from .env
const PORT = process.env.PORT || 5000;

// console.log(process.env);
app.listen(PORT, () => console.log(`Server Started on ${PORT}`));
  

app.js (интерфейс)

 const getIds = (id) => {
  return document.getElementById(id);
};

const form = document.querySelector('#form');

form.addEventListener('submit', (e) => {
  e.preventDefault();
  const from = getIds('from').value;
  const subject = getIds('subject').value;
  const emailFormat = quill.root.innerHTML;
  const content = (getIds('content').value = emailFormat);
  const data = {
    from,
    subject,
    content,
  };

  axios
    .post('/send', data, {
      headers: {
        'Content-Type': 'application/json',
      },
    })
    .then((res) => {
      form.reset();
      quill.setContents([{ insert: 'n' }]);
      M.toast({ html: 'Email Sent!!' });
      console.log(res);
    })
    .catch((err) => console.log(err));
});
  

Комментарии:

1. Получаете ли вы «НЕВЕРНЫЙ ЗАПРОС» от SendGrid?

2. Да, сэр … на сервере

3. Можете ли вы поделиться тем, что вы видите в этом журнале .catch((error) => { console.error(error); // console.log(cb(error, null)); });

4. { из: ‘abdulazeezolamide50@gmail.com ‘, тема: ‘ssssss’, содержание: ‘<p>ssssssssssss</p>’} НЕВЕРНЫЙ ЗАПРОС

5. Замените часть route app.post('/send', (req, res) => { try { const { email, subject, content } = req.body; await sendMail(email, subject, content); res.json({ message: 'Message Sent' }); } catch (error) { res.status(400).json({ message: 'Something went wrong' }); } console.log(req.body); });

Ответ №1:

Вы можете использовать модуль @sendgrid / mail NPM.

 import sgMail from '@sendgrid/mail';
const setApiKey = () => sgMail.setApiKey(process.env.SENDGRID_API_KEY);

export const sendEmail = ({
  emailTo, data, emailFrom
}) => {
  return new Promise(async (resolve, reject) => {
    try {
      setApiKey();
      const msg = {
        to: [emailTo],
        from: emailFrom, // Use the email address or domain you verified above
        subject: 'Sending with Twilio SendGrid is Fun',
        html: '<strong>and easy to do anywhere, even with Node.js</strong>',
      };
      const result = await sgMail.send(msg);
      resolve(result);
    } catch (_e) {
      console.log('Error in sendEmail: ', _e.response.body);
      reject(_e.response.body);
    }
  });
};
  

Для вашего случая используйте этот

     import sgMail from '@sendgrid/mail';
const setApiKey = () => sgMail.setApiKey(process.env.SENDGRID_API_KEY);

export const sendEmail = (email, subject, content) => {
  return new Promise(async (resolve, reject) => {
    try {
      setApiKey();
      const msg = {
        from: email,
        to: 'oabdulazeez70@gmail.com',
        cc: 'letayoknow@gmail.com',
        subject: subject,
        text: content,
      };
      const result = await sgMail.send(msg);
      resolve(result);
    } catch (_e) {
      console.log('Error in sendEmail: ', _e.response.body);
      reject(_e.response.body);
    }
  });
};


app.post('/send', (req, res) => {
  try {
    const { email, subject, content } = req.body;
    await sendMail(email, subject, content);
    res.json({ message: 'Message Sent' });
  } catch (error) {
    res.status(400).json({ message: 'Something went wrong' });
  }
  console.log(req.body);
});
  

Комментарии:

1. Проверьте данные, которые вы отправили из интерфейса. Если вы используете текст, он должен иметь строковый тип. Html также должен быть строкой. Вы также можете использовать динамические шаблоны для SendGrid

2. Сэр, html-код представляет собой строку

3. пожалуйста, откуда приходит электронное письмо и откуда?

4. Это связано с тем, как вы используете эту функцию men. В вашем случае вы должны получить их из данных формы.

5. у меня есть только два ввода в моем html