0

因此,我有一个提供静态 index.html 页面的快速应用程序,以及我的 app.js 文件中的一个函数,该函数在服务器启动时发送电子邮件。

我想做的是仅在用户点击表单上的“提交”按钮时发送电子邮件(并且表单已成功发送,因此最好是成功确认)。

如何让我的程序“监听” onClick / form-successfully-sent 事件,然后运行我拥有的发送电子邮件的服务器端代码?

const http = require('http');
const nodemailer = require('nodemailer');
const express = require('express');
const app = express();
const port = 8080;

app.listen(port, () => console.log(`App listening on port ${port}!`));
app.use(express.static('public'));
app.get('/', (req, res) => res.send('index.html'))

const transporter = nodemailer.createTransport({
  service: 'gmail',
  auth: {
    user: 'USERNAME@GMAIL.COM',
    pass: 'PASSWORD'
  }
});

const mailOptions = {
  from: 'USERNAME@GMAIL.COM',
  to: 'USERNAME2@GMAIL.COM',
  subject: 'Sending Email using Node.js',
  text: 'That was easy!'
};

transporter.sendMail(mailOptions, function(error, info) {
  if (error) {
    console.log(error);
  } else {
    console.log('Email sent: ' + info.response);
  }
})

我想在用户成功提交表单时触发 transporter.sendMail 方法/函数。

谢谢!

4

4 回答 4

0

在您的服务器上添加将处理表单提交的路由。有多种方法可以做到这一点,但是,作为一个简单的例子,看看下面的代码:

app.post("/send", function(req, res, next) {
  const transporter = nodemailer.createTransport({
    service: "gmail",
    auth: {
      user: "test-email@gmail.com",
      pass: "test123"
    }
  });

  const mailOptions = {
    from: `${req.body.email}`,
    to: "test-email@gmail.com",
    subject: `${req.body.name}`,
    text: `${req.body.message}`,
    replyTo: `${req.body.email}`
  };

  transporter.sendMail(mailOptions, function(err, res) {
    if (err) {
      console.error("there was an error: ", err);
    } else {
      console.log("here is the res: ", res);
    }
  });
});

然后,在您的客户端应用程序中,调用以下函数(或类似函数)将客户端数据发送到新创建的端点:

function sendEmail(name, email, message) {
  const options = {
    method: "POST",
    headers: {
      Accept: "application/json",
      "Content-Type": "application/json"
    },
    body: JSON.stringify({
      name: name,
      email: email,
      message: message
    })
  };

  return fetch("/send", options)
    .then(res => res.json())
    .then(res => {
      console.log("here is the response: ", res);
    })
    .catch(err => {
      console.error("here is the error: ", err);
    });
}
于 2019-08-01T17:11:04.260 回答
0

您必须设置一个 API 端点

app.post('/send-mail', function (req, res) {
  transporter.sendMail(mailOptions, function(error, info) {
    if (error) {
      console.log(error);
    } else {
      console.log('Email sent: ' + info.response);
    }
  })
})

然后从您的表单代码中调用它。

onSubmit() {
  fetch('/send-mail', {
        method: 'POST'
  })
}

编辑:错字。

于 2019-08-01T17:11:55.113 回答
0

将此部分放在一个函数中,并在处理表单请求时调用它,根据 f.ex 的需要在函数中创建参数。邮件选项信息

function sendEmail(){ 
    const mailOptions = {
        from: 'USERNAME@GMAIL.COM',
        to: 'USERNAME2@GMAIL.COM',
        subject: 'Sending Email using Node.js',
        text: 'That was easy!'
    };

    transporter.sendMail(mailOptions, function(error, info) {
        if (error) {
            console.log(error);
        } else {
            console.log('Email sent: ' + info.response);
        }
    })
}
于 2019-08-01T17:16:37.227 回答
0
const bodyparser = require("body-parser");   

const transporter = nodemailer.createTransport({
  service: 'gmail',
  auth: {
    user: `${req.body.username}`,
    pass: `${req.body.password}`
  }
});

const mailOptions = {
  from: `${req.body.email}`,
  to: 'USERNAME2@GMAIL.COM',
  subject: ``${req.body.subject},
  text: `${req.body.message}`
};

 app.post("/login", (req, res)=>{
  transporter.sendMail(mailOptions, function(error, info) {
  if (error) {
     console.log(error);
       } else {
          console.log('Email sent: ' + info.response);
           }
})
    })

记得做npm install --save body-parserapp.use(bodyparser.json())

于 2019-08-01T17:29:39.007 回答