Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/467.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 包含Node.js和Express.js以及AngularJs和nodemailer的电子邮件不发送邮件_Javascript_Angularjs_Node.js_Express_Nodemailer - Fatal编程技术网

Javascript 包含Node.js和Express.js以及AngularJs和nodemailer的电子邮件不发送邮件

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

我阅读了各种教程,并使用Node.js和Express.js通过HTML和AngularJs页面发送基本电子邮件进行了多次搜索,但我的实现无法正常工作。我知道我错过了一些愚蠢的事情

我选择使用nodeEmailer作为Node.js包,并在我的Express.js API中使用它来发送实际邮件

从我的视图到API的路径如下所示:视图(表单)>>控制器>>电子邮件工厂>>API

我得到了每个步骤的结果(数据的控制台日志),但是电子邮件失败了

在Chrome开发工具中,我在标题中得到一个状态代码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!事实证明,唯一的问题是缺少“发件人”电子邮件地址。在工厂中参数的名称(数据/表单数据等)无关紧要,再次感谢!