使用 Node 和 Express 发送邮件时出错
Error while sending mail with Node and Express
我正在尝试使用 nodemailer 在提交 HTML 表单时发送邮件。但是每当我按下提交按钮时,它都会显示此错误...
TypeError: sendMail is not a function
at C:\Users\user\Desktop\project\Internship designs\notchup\server.js:20:3
at Layer.handle [as handle_request] (C:\Users\user\Desktop\project\Internship designs\notchup\node_modules\express\lib\router\layer.js:95:5)
at next (C:\Users\user\Desktop\project\Internship designs\notchup\node_modules\express\lib\router\route.js:137:13)
at Route.dispatch (C:\Users\user\Desktop\project\Internship designs\notchup\node_modules\express\lib\router\route.js:112:3)
at Layer.handle [as handle_request] (C:\Users\user\Desktop\project\Internship designs\notchup\node_modules\express\lib\router\layer.js:95:5)
at C:\Users\user\Desktop\project\Internship designs\notchup\node_modules\express\lib\router\index.js:281:22
at Function.process_params (C:\Users\user\Desktop\project\Internship designs\notchup\node_modules\express\lib\router\index.js:335:12)
at next (C:\Users\user\Desktop\project\Internship designs\notchup\node_modules\express\lib\router\index.js:275:10)
at jsonParser (C:\Users\user\Desktop\project\Internship designs\notchup\node_modules\body-parser\lib\types\json.js:101:7)
at Layer.handle [as handle_request] (C:\Users\user\Desktop\project\Internship designs\notchup\node_modules\express\lib\router\layer.js:95:5)
我只收到一封没有任何主题和正文的空白邮件。
我试过更改函数名称,这样它就不会与内置函数冲突。我还尝试将其数据类型从 'const' 更改为 'function'。但这无济于事。我该如何解决?
index.html
<!DOCTYPE html>
<html lang="en" dir="ltr">
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<form class="">
<input type="text" id="subject" placeholder="Subject"><br>
<input type="email" id="email" placeholder="Email"><br>
<textarea name="text" id="text" rows="10" cols="30"></textarea><br>
<input type="submit" value="Submit">
</form>
<!-- JQuery -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<!-- CUSTOM script -->
<script>
$('form').on('submit', (e) => {
e.preventDefault();
const email = $('#email').val().trim();
const subject = $('#subject').val().trim();
const text = $('#text').val().trim();
const data = {
email,
subject,
text
};
$.post('/email',data, function() {
console.log('Server received our data');
});
});
</script>
</body>
</html>
server.js
const express = require('express');
const sendMail = require('./send-mail');
const app = express();
const path = require('path');
const PORT = 8080;
// Data Parsing
app.use(express.urlencoded({
extended: false
}));
app.use(express.json());
app.post('/email', (req, res) => {
// TODO
// send email here
const { subject, email, text } = req.body;
console.log('Data: ', req.body);
sendMail(email, subject, text, function(err, data) {
if (err) {
res.status(500).json({ message: 'Internal Error' });
} else {
res.json({ message: 'Email sent!!!' });
}
});
res.json({ message: 'Message received!!!' })
});
app.get('/', (req, res) => {
res.sendFile(path.join(__dirname, 'views', 'index.html'));
});
app.listen(PORT, () => console.log('Server is starting on PORT, ', 8080));
发送-mail.js
var nodemailer = require('nodemailer');
var transporter = nodemailer.createTransport({
service: 'gmail',
auth: {
user: 'saxena1975sanjeev@gmail.com',
pass: 'my_password'
}
});
const sendMail = (email, subject, text) => {
const mailOptions = {
from: email,
to: 'saxena1975sanjeev@gmail.com',
subject: subject,
text: text
};
transporter.sendMail(mailOptions, function(error, info) {
if(error) {
console.log(error);
} else {
console.log('Email sent: ' + info.response);
}
});
}
module.exports = sendMail();
错误消息说 sendMail
不是一个函数。因此,您需要查看并确定它 是什么。
你在这里给它赋值:
const sendMail = require('./send-mail');
因此查看该文件并看到它导出:
module.exports = sendMail();
要为 export
设置值,您正在 调用 sendMail
并分配其 return 值。
里面没有return
语句,所以returns undefined
.
如果要导出 sendMail
函数,则导出 函数本身 。不要附加 ()
来调用它并获取它的 return 值。
您正在导出 sendMail 的 return 值而不是函数本身:
module.exports = sendMail();
改为:
module.exports = sendMail;
在 send-mail.js 中,不执行 sendMail 函数,只发送函数的引用。
var nodemailer = require('nodemailer');
var transporter = nodemailer.createTransport({
service: 'gmail',
auth: {
user: 'saxena1975sanjeev@gmail.com',
pass: 'my_password'
}
});
const sendMail = (email, subject, text) => {
const mailOptions = {
from: email,
to: 'saxena1975sanjeev@gmail.com',
subject: subject,
text: text
};
transporter.sendMail(mailOptions, function(error, info) {
if(error) {
console.log(error);
} else {
console.log('Email sent: ' + info.response);
}
});
}
module.exports = sendMail; // don't sendMail()
我正在尝试使用 nodemailer 在提交 HTML 表单时发送邮件。但是每当我按下提交按钮时,它都会显示此错误...
TypeError: sendMail is not a function
at C:\Users\user\Desktop\project\Internship designs\notchup\server.js:20:3
at Layer.handle [as handle_request] (C:\Users\user\Desktop\project\Internship designs\notchup\node_modules\express\lib\router\layer.js:95:5)
at next (C:\Users\user\Desktop\project\Internship designs\notchup\node_modules\express\lib\router\route.js:137:13)
at Route.dispatch (C:\Users\user\Desktop\project\Internship designs\notchup\node_modules\express\lib\router\route.js:112:3)
at Layer.handle [as handle_request] (C:\Users\user\Desktop\project\Internship designs\notchup\node_modules\express\lib\router\layer.js:95:5)
at C:\Users\user\Desktop\project\Internship designs\notchup\node_modules\express\lib\router\index.js:281:22
at Function.process_params (C:\Users\user\Desktop\project\Internship designs\notchup\node_modules\express\lib\router\index.js:335:12)
at next (C:\Users\user\Desktop\project\Internship designs\notchup\node_modules\express\lib\router\index.js:275:10)
at jsonParser (C:\Users\user\Desktop\project\Internship designs\notchup\node_modules\body-parser\lib\types\json.js:101:7)
at Layer.handle [as handle_request] (C:\Users\user\Desktop\project\Internship designs\notchup\node_modules\express\lib\router\layer.js:95:5)
我只收到一封没有任何主题和正文的空白邮件。 我试过更改函数名称,这样它就不会与内置函数冲突。我还尝试将其数据类型从 'const' 更改为 'function'。但这无济于事。我该如何解决?
index.html
<!DOCTYPE html>
<html lang="en" dir="ltr">
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<form class="">
<input type="text" id="subject" placeholder="Subject"><br>
<input type="email" id="email" placeholder="Email"><br>
<textarea name="text" id="text" rows="10" cols="30"></textarea><br>
<input type="submit" value="Submit">
</form>
<!-- JQuery -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<!-- CUSTOM script -->
<script>
$('form').on('submit', (e) => {
e.preventDefault();
const email = $('#email').val().trim();
const subject = $('#subject').val().trim();
const text = $('#text').val().trim();
const data = {
email,
subject,
text
};
$.post('/email',data, function() {
console.log('Server received our data');
});
});
</script>
</body>
</html>
server.js
const express = require('express');
const sendMail = require('./send-mail');
const app = express();
const path = require('path');
const PORT = 8080;
// Data Parsing
app.use(express.urlencoded({
extended: false
}));
app.use(express.json());
app.post('/email', (req, res) => {
// TODO
// send email here
const { subject, email, text } = req.body;
console.log('Data: ', req.body);
sendMail(email, subject, text, function(err, data) {
if (err) {
res.status(500).json({ message: 'Internal Error' });
} else {
res.json({ message: 'Email sent!!!' });
}
});
res.json({ message: 'Message received!!!' })
});
app.get('/', (req, res) => {
res.sendFile(path.join(__dirname, 'views', 'index.html'));
});
app.listen(PORT, () => console.log('Server is starting on PORT, ', 8080));
发送-mail.js
var nodemailer = require('nodemailer');
var transporter = nodemailer.createTransport({
service: 'gmail',
auth: {
user: 'saxena1975sanjeev@gmail.com',
pass: 'my_password'
}
});
const sendMail = (email, subject, text) => {
const mailOptions = {
from: email,
to: 'saxena1975sanjeev@gmail.com',
subject: subject,
text: text
};
transporter.sendMail(mailOptions, function(error, info) {
if(error) {
console.log(error);
} else {
console.log('Email sent: ' + info.response);
}
});
}
module.exports = sendMail();
错误消息说 sendMail
不是一个函数。因此,您需要查看并确定它 是什么。
你在这里给它赋值:
const sendMail = require('./send-mail');
因此查看该文件并看到它导出:
module.exports = sendMail();
要为 export
设置值,您正在 调用 sendMail
并分配其 return 值。
里面没有return
语句,所以returns undefined
.
如果要导出 sendMail
函数,则导出 函数本身 。不要附加 ()
来调用它并获取它的 return 值。
您正在导出 sendMail 的 return 值而不是函数本身:
module.exports = sendMail();
改为:
module.exports = sendMail;
在 send-mail.js 中,不执行 sendMail 函数,只发送函数的引用。
var nodemailer = require('nodemailer');
var transporter = nodemailer.createTransport({
service: 'gmail',
auth: {
user: 'saxena1975sanjeev@gmail.com',
pass: 'my_password'
}
});
const sendMail = (email, subject, text) => {
const mailOptions = {
from: email,
to: 'saxena1975sanjeev@gmail.com',
subject: subject,
text: text
};
transporter.sendMail(mailOptions, function(error, info) {
if(error) {
console.log(error);
} else {
console.log('Email sent: ' + info.response);
}
});
}
module.exports = sendMail; // don't sendMail()