Javascript 包含Node.js和Express.js以及AngularJs和nodemailer的电子邮件不发送邮件
我阅读了各种教程,并使用Node.js和Express.js通过HTML和AngularJs页面发送基本电子邮件进行了多次搜索,但我的实现无法正常工作。我知道我错过了一些愚蠢的事情 我选择使用nodeEmailer作为Node.js包,并在我的Express.js API中使用它来发送实际邮件 从我的视图到API的路径如下所示:视图(表单)>>控制器>>电子邮件工厂>>API 我得到了每个步骤的结果(数据的控制台日志),但是电子邮件失败了 在Chrome开发工具中,我在标题中得到一个状态代码Javascript 包含Node.js和Express.js以及AngularJs和nodemailer的电子邮件不发送邮件,javascript,angularjs,node.js,express,nodemailer,Javascript,Angularjs,Node.js,Express,Nodemailer,我阅读了各种教程,并使用Node.js和Express.js通过HTML和AngularJs页面发送基本电子邮件进行了多次搜索,但我的实现无法正常工作。我知道我错过了一些愚蠢的事情 我选择使用nodeEmailer作为Node.js包,并在我的Express.js API中使用它来发送实际邮件 从我的视图到API的路径如下所示:视图(表单)>>控制器>>电子邮件工厂>>API 我得到了每个步骤的结果(数据的控制台日志),但是电子邮件失败了 在Chrome开发工具中,我在标题中得到一个状态代码20
200OK
,但它实际上失败了。当我在“响应”或“预览”下查看时,会收到以下消息:
{error: "connect ETIMEDOUT 64.233.184.109:465"}
error:"connect ETIMEDOUT 64.233.184.109:465"
在Bash控制台(我正在运行服务器的地方)中,我可以看到API端点正在被命中,因为我得到了以下console.log
输出:
THIS IS THE API HIT:Email to: corne.leroux@outlook.comSubject: This is my subjectMessage: This is my message
我使用过的一些参考文献:
我是Express.js的新手,对Node.js的了解有限
以下是我的基本实现:
HTML视图:
<div class="container">
<form name="createEmailForm" method="post" action="" class="form-horizontal" role="form">
<div class="form-group">
<label for="emailAddress" class="col-lg-3 col-md-3 col-xs-12 control-label">From Email Address</label>
<div class="col-lg-9 col-md-9 col-xs-12">
<input ng-model="formData.emailAddress" type="text" class="form-control" id="emailAddress" name="emailAddress" placeholder="Email Address" required>
</div>
</div>
<div class="form-group">
<label for="clientName" class="col-lg-3 col-md-3 col-xs-12 control-label">Name</label>
<div class="col-lg-9 col-md-9 col-xs-12">
<input ng-model="formData.clientName" type="text" class="form-control" id="clientName" name="clientName" placeholder="Name" required>
</div>
</div>
<div class="form-group">
<label for="clientMessage" class="col-lg-3 col-md-3 col-xs-12 control-label">Message</label>
<div class="col-lg-9 col-md-9 col-xs-12">
<input ng-model="formData.clientMessage" type="text" class="form-control" id="clientMessage" name="clientMessage" placeholder="Message" required>
</div>
</div>
</form>
<button class="btn btn-primary" ng-click="submit(formData)">Send</button>
</div>
$scope.submit = function () {
var formData = $scope.formData;
console.log(JSON.stringify($scope.formData));
sendMail(formData);
};
function sendMail(formData) {
console.log('createEmail: ', formData);
return EmailFactory.sendMail(formData)
.then(function (data, status, headers, config) {
console.log("Email Sent");
});
}
function sendMail() {
return $http.post('/api/send')
.then(Success)
.catch(Failure);
function Success(responce) {
console.log(responce.data);
return responce.data;
}
function Failure(error) {
console.log('A problem occurred while sending an email.' + JSON.stringify(error));
}
}
AnularJs工厂:
<div class="container">
<form name="createEmailForm" method="post" action="" class="form-horizontal" role="form">
<div class="form-group">
<label for="emailAddress" class="col-lg-3 col-md-3 col-xs-12 control-label">From Email Address</label>
<div class="col-lg-9 col-md-9 col-xs-12">
<input ng-model="formData.emailAddress" type="text" class="form-control" id="emailAddress" name="emailAddress" placeholder="Email Address" required>
</div>
</div>
<div class="form-group">
<label for="clientName" class="col-lg-3 col-md-3 col-xs-12 control-label">Name</label>
<div class="col-lg-9 col-md-9 col-xs-12">
<input ng-model="formData.clientName" type="text" class="form-control" id="clientName" name="clientName" placeholder="Name" required>
</div>
</div>
<div class="form-group">
<label for="clientMessage" class="col-lg-3 col-md-3 col-xs-12 control-label">Message</label>
<div class="col-lg-9 col-md-9 col-xs-12">
<input ng-model="formData.clientMessage" type="text" class="form-control" id="clientMessage" name="clientMessage" placeholder="Message" required>
</div>
</div>
</form>
<button class="btn btn-primary" ng-click="submit(formData)">Send</button>
</div>
$scope.submit = function () {
var formData = $scope.formData;
console.log(JSON.stringify($scope.formData));
sendMail(formData);
};
function sendMail(formData) {
console.log('createEmail: ', formData);
return EmailFactory.sendMail(formData)
.then(function (data, status, headers, config) {
console.log("Email Sent");
});
}
function sendMail() {
return $http.post('/api/send')
.then(Success)
.catch(Failure);
function Success(responce) {
console.log(responce.data);
return responce.data;
}
function Failure(error) {
console.log('A problem occurred while sending an email.' + JSON.stringify(error));
}
}
Express.js API
var express = require('express');
var nodemailer = require("nodemailer");
var router = express.Router();
var mongoose = require('mongoose');
var customers = require('../schemas/customers.js');
var suppliers = require('../schemas/suppliers.js');
var products = require('../schemas/products.js');
var smtpTransport = nodemailer.createTransport({
service: "gmail",
host: "smtp.gmail.com",
auth: {
user: "cjleroux8@gmail.com",
pass: "*********"
}
});
router.post('/send', function (req, res, next) {
var mailOptions = {
to: req.body.emailAddress,
subject: req.body.clientName,
text: req.body.clientMessage
}
console.log('THIS IS THE API HIT:' + 'Email to: ' + mailOptions.to + 'Subject: ' + mailOptions.subject + 'Message: ' + mailOptions.text);
smtpTransport.sendMail(mailOptions, function (error, response) {
if (error) {
console.log(error);
res.json({error: "API Error"});
} else {
console.log("Message sent: " + response.message);
res.json({ response: "sent" });
}
});
});
这是我的app.js
var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var mongoose = require('mongoose');
var index = require('./routes/index');
var users = require('./routes/users');
var api = require('./routes/api');
mongoose.Promise = global.Promise;
mongoose.connect(process.env.MONGO_CON || 'mongodb://127.0.0.1:27021/impi');
var app = express();
// view engine setup
// app.set('views', path.join(__dirname, 'views'));
// app.set('view engine', 'html');
app.use(express.static(__dirname));
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
app.use('/', index);
app.use('/users', users);
app.use('/api', api);
// catch 404 and forward to error handler
app.use(function(req, res, next) {
var err = new Error('Not Found');
err.status = 404;
next(err);
});
// error handler
app.use(function(err, req, res, next) {
// set locals, only providing error in development
res.locals.message = err.message;
res.locals.error = req.app.get('env') === 'development' ? err : {};
// render the error page
res.status(err.status || 500);
res.render('error');
});
module.exports = app;
var express = require('express');
var router = express.Router();
/* GET home page. */
router.get('/', function(req, res, next) {
res.sendFile('index.html');
});
module.exports = router;
var express = require('express');
var nodemailer = require("nodemailer");
var app = express();
var smtpTransport = nodemailer.createTransport({
service: "gmail",
host: "smtp.gmail.com",
auth: {
user: "******",
pass: "***"
}
});
app.get('/', function(req, res) {
res.sendfile('index.html');
});
app.get('/send', function(req, res) {
//code to send e-mail.
//Will be shown soon.
var mailOptions = {
to: req.query.to,
subject: req.query.subject,
text: req.query.text
}
console.log(mailOptions);
smtpTransport.sendMail(mailOptions, function(error, response) {
if (error) {
console.log(error);
res.end("error");
} else {
console.log("Message sent: " + response.message);
res.end("sent");
}
});
});
app.listen(3000, function() {
console.log("Express Started on Port 3000");
});
这是我的index.js
var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var mongoose = require('mongoose');
var index = require('./routes/index');
var users = require('./routes/users');
var api = require('./routes/api');
mongoose.Promise = global.Promise;
mongoose.connect(process.env.MONGO_CON || 'mongodb://127.0.0.1:27021/impi');
var app = express();
// view engine setup
// app.set('views', path.join(__dirname, 'views'));
// app.set('view engine', 'html');
app.use(express.static(__dirname));
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
app.use('/', index);
app.use('/users', users);
app.use('/api', api);
// catch 404 and forward to error handler
app.use(function(req, res, next) {
var err = new Error('Not Found');
err.status = 404;
next(err);
});
// error handler
app.use(function(err, req, res, next) {
// set locals, only providing error in development
res.locals.message = err.message;
res.locals.error = req.app.get('env') === 'development' ? err : {};
// render the error page
res.status(err.status || 500);
res.render('error');
});
module.exports = app;
var express = require('express');
var router = express.Router();
/* GET home page. */
router.get('/', function(req, res, next) {
res.sendFile('index.html');
});
module.exports = router;
var express = require('express');
var nodemailer = require("nodemailer");
var app = express();
var smtpTransport = nodemailer.createTransport({
service: "gmail",
host: "smtp.gmail.com",
auth: {
user: "******",
pass: "***"
}
});
app.get('/', function(req, res) {
res.sendfile('index.html');
});
app.get('/send', function(req, res) {
//code to send e-mail.
//Will be shown soon.
var mailOptions = {
to: req.query.to,
subject: req.query.subject,
text: req.query.text
}
console.log(mailOptions);
smtpTransport.sendMail(mailOptions, function(error, response) {
if (error) {
console.log(error);
res.end("error");
} else {
console.log("Message sent: " + response.message);
res.end("sent");
}
});
});
app.listen(3000, function() {
console.log("Express Started on Port 3000");
});
我已经实现了一个使用nodejs和express发送电子邮件的基本应用程序。我使用了nodemailer模块,但我没有在我的应用程序中添加mongodb。如果我的代码用于您,请检查下面的代码 Index.html
<html>
<head>
<title>Node.JS Email application</title>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script><script>// <![CDATA[
$(document).ready(function() {
var from, to, subject, text;
$("#send_email").click(function() {
to = $("#to").val();
subject = $("#subject").val();
text = $("#content").val();
$("#message").text("Sending E-mail...Please wait");
$.get("http://192.168.2.47:3000/send", {
to: to,
subject: subject,
text: text
}, function(data) {
if (data == "sent") {
$("#message").empty().html("Email is been sent at " + to + " Please check inbox!");
}
});
});
});
</script>
</head>
<body>
<div id="container">
<h1>Mailer In Node.JS</h1>
<br/>
<input id="to" type="text" placeholder="Enter E-mail ID where you want to send" /><br/>
<input id="subject" type="text" placeholder="Write Subject" /><br/>
<textarea id="content" cols="40" rows="5" placeholder="Write what you want to send"></textarea>
<br/>
<button id="send_email">Send Email</button>
<span id="message"></span>
</div>
</body>
</html>
在
user
,server.js
文件中的pass
使用有效的邮件id及其密码。您的工厂功能sendMail
应具有formData
参数,然后在post
请求中发送该数据。
工厂应该是这样的:
function sendMail(formData) {
return $http.post('/api/send', formData)
.then(Success)
.catch(Failure);
function Success(responce) {
console.log(responce.data);
return responce.data;
}
function Failure(error) {
console.log('A problem occurred while sending an email.' + JSON.stringify(error));
}
}
对于您的API
要发送电子邮件,您应该设置从为nodemailer
发送电子邮件,这样您就可以设置like
var smtpTransport = nodemailer.createTransport({
service: "Gmail",
host: "smtp.gmail.com",
auth: {
user: "cjleroux8@gmail.com",
pass: "*********"
}
},
{
from: 'example@gmail.com',
});
router.post('/api/send', function (req, res, next) {
var mailOptions = {
to: req.body.emailAddress,
subject: req.body.clientName,
text: req.body.clientMessage
};
console.log('THIS IS THE API HIT:' + 'Email to: ' + mailOptions.to + 'Subject: ' + mailOptions.subject + 'Message: ' + mailOptions.text);
smtpTransport.sendMail(mailOptions, function (error, response) {
if (error) {
console.log(error);
res.json({error: "API Error"});
} else {
console.log("Message sent: " + response.message);
res.json({ response: "sent" });
}
});
});
或您可以在邮件选项
var mailOptions = {
from: 'example@gmail.com',
to: req.body.emailAddress,
subject: req.body.clientName,
text: req.body.clientMessage
}
检查请求是否到达/send
。您提供的代码不正确。使用此代码,您无法从服务器获得任何响应。例如,我在app.js中没有看到app.listen()
,在angularJs中也没有看到sendMail()
,工厂不接受任何参数并发送到服务器空体。@alexmac数据确实被发送到API,并到达API。请通读这个问题。我提到,在API路径的每个步骤中,数据都会被注销。控制器>>工厂>>API。我的应用程序的其余部分具有类似的API和Factory实现,它确实向DB发送数据。只有电子邮件没有被发送。我们需要提供我们自己的电子邮件和gmail密码还是什么???请帮忙谢谢你的反馈。我实际上使用了与您使用的完全相同的示例。:)我的问题是与其他API调用、AngularJs和Digitalocean的集成。谢谢Shaishab!事实证明,唯一的问题是缺少“发件人”电子邮件地址。在工厂中参数的名称(数据/表单数据等)无关紧要,再次感谢!