【问题标题】:Send route not being found,未找到发送路线,
【发布时间】:2025-12-21 00:05:19
【问题描述】:

我正在尝试使用 nodemailer 从联系页面发送电子邮件。我已经使用 MERN 堆栈构建了该站点。所有其他路线都运行良好。我可以设置一个新用户,写一篇文章并登录一个现有用户。路由中断的唯一部分是在联系页面上发送邮件时。

下面是中间件:

const app = express();

// Connect Database
connectDB();

// Init Middleware
app.use(express.json());

// Define Routes
app.use('/api/users', require('./routes/api/users'));
app.use('/api/auth', require('./routes/api/auth'));
app.use('/api/profile', require('./routes/api/profile'));
app.use('/api/posts', require('./routes/api/posts'));
app.use('/api/send', require('./routes/api/send'));

以下是发送路线:

var express = require('express');
var config = require('config');
var router = express.Router();
var nodemailer = require('nodemailer');
var cors = require('cors');

// @route   POST api/send
// @desc    Send email on contact page
// @access  Public

router.post('/send',(req, res ) => {
    var name = req.body.name
    var email = req.body.email
    var subject = req.body.subject
    var message = req.body.message
    var content = `
    name: ${name} \n 
    email: ${email} \n 
    subject: ${subject} \n 
    message: ${message} `

    var mail = {
      from: name,
      to: receiver, // receiver email,
      subject: subject,
      text: content
    }
    transporter.sendMail(mail, (err, data) => {
      if (err) {
        res.json({
          status: 'fail'
        })

      } else {
        res.json({
         status: 'success'
        })
      }
    })
  });

  module.exports = router;

我在联系页面上提交表单时收到 404 错误。以下是联系方式:

const ContactForm = () => {
  const [state, setState] = useState({
    name: '',
    email: '',
    subject: '',
    message: ''
  });

  const [result, setResult] = useState(null);

  const sendEmail = event => {
    event.preventDefault();
    axios
      .post('/send', { ...state })
      .then(response => {
        setResult(response.data);
        setState({
          name: '',
          email: '',
          subject: '',
          message: ''
        });
      })
      .catch(() => {
        setResult({
          success: false,
          message: 'Something went wrong. Try again later'
        });
      });
  };

  const onInputChange = event => {
    const { name, value } = event.target;

    setState({
      ...state,
      [name]: value
    });
  };

这是我的处理程序:

const nodemailer = require ('nodemailer');

nodemailer.createTransport({
    host: "smtp.gmail.com", //replace with your email provider
    port: 587,
    auth: {
        user: process.env.email,
        pass: process.env.password
    }
}); 

// verify connection configuration
transporter.verify(function(error, success) {
    if (error) {
      console.log("error at mail send");
    } else {
      console.log("Server is ready to take the messages");
    }
  });

module.exports = transporter

为了调试,我尝试将 POST 路由更改为 (req, res, next) (req, res, send)

【问题讨论】:

    标签: node.js reactjs express routes mern


    【解决方案1】:

    您似乎缺少转运器对象。 你需要用nodemailer.createTranspot创建它

    const transpoter = nodemailer.createTranspot({
        service: 'gmail',
        auth: {
            user: 'sender@gmail.com',
            pass: 'password'
        }
    })
    

    那就试试吧。

    【讨论】:

    • 我的 mailer.js 中有这个,抱歉我应该添加那个。我将编辑以包含此内容。
    • 你编辑它真好。您是否在安全部分为您的 gmail 开启了不太安全的应用访问权限
    • 不,我从来没有。我会为此做一个一次性帐户,
    • 早期的 google 允许访问此类应用程序以访问他们的邮件帐户并通过它发送邮件,但现在您必须将其作为安全部分的设置打开。因此,为了通过 gmail 帐户发送邮件,您必须打开它才能访问这些第三方应用程序。它对我有用。
    • 不,没有任何改变。
    【解决方案2】:

    这个问题已经解决了:

    transporter 移动到send route 服务器使用的路由是api/send/send,在POST route 上应该是/

    【讨论】: