-1

所以冒着获得更多反对票的风险,这是我的问题(很好!):我花了几个小时试图弄清楚如何让 Heroku 接受我刚刚添加的 ENV 变量(heroku config:set PASS_CODE='password ')。

我在 Express 应用程序中有一个简单的 HTML 联系表单,我正在使用 npm 包 nodemailer,在 .env 文件中添加了 ENV 变量以与 detenv 一起使用,并使用下面的代码调用它们。Heroku 确实声明以相同的方式调用他们的 ENV 变量,但是表单数据没有发送,我仍然在 Heroku 日志中收到以下错误:{ 错误:无效登录:535 5.0.0 身份验证失败。dotenv 和 heroku 都说使用 .process.env 调用 ENV 变量。它在我的本地 node.js 服务器中完美运行,但在我推送到 heroku 时却不行。

这是我的代码片段:

require('dotenv').config(); 

var express = require('express');
var router = express.Router();
var bodyParser = require('body-parser');
var nodemailer = require('nodemailer');

router.get('/', function(req, res, next) {
	res.render('contact');
});

router.post('/send', function(req, res, next){

	// create reusable transporter object using the default SMTP transport
	var transporter = nodemailer.createTransport({
	    host: 'smtp-mail.outlook.com',
	    port: 587,
	    secure: false, // secure:true for port 465, secure:false for port 587
	    tls: {
	    	ciphers: 'SSLv3'
	    },
	    auth: {
	        user: 'example.outlook.com',
	        pass: process.env.PASS_CODE
	    }
	});

	// setup email data with unicode symbols
	var mailOptions = {
	    from: '"Fred Foo " <example@outlook.com>', // sender address
	    to: 'example.outlook.com', // list of receivers
	    subject: ' New message from your website!', // Subject line
	    text: ' You have a new message from your website with the following details: Name: ' +req.body.first_name + 'Surname: ' + req.body.last_name + 'Email: ' + req.body.email + 'Phone Number: ' + req.body.number + 'Message: ' + req.body.message, // plain text body
	    html: '<b> You have a new message from your website with the following details: </b><br><ul><li>First Name: ' + req.body.first_name + '</li><li>Surname: ' + req.body.last_name + '</li><li>Email: ' + req.body.email + '</li><li>Phone Number: ' + req.body.number + '</li><li>Message: ' + req.body.message + '</li></ul>' // html body
	};

	// send mail with defined transport object
	transporter.sendMail(mailOptions, function(error, info) {
	    if (error) {
	        console.log(error);
	        res.redirect('/');
	    } else {
	    	console.log('Message sent: ' + info.response);
	    	res.redirect('/');
	    	
	    }
	    
	});
});

我还在 .env 文件中声明了 ENV 变量,如下所示:PASS_CODE=password,您可以看到我需要 dotenv。

当我通过 node.js 服务器在本地运行时它工作正常,但当我推送到 Heroku 时却不行。我已经在 Heroku 中设置了 ENV 变量,并通过输入heroku config.

为了完整起见,这是我的 package.json 文件的副本:

{
  "name": "podeg",
  "version": "0.0.0",
  "private": true,
  "scripts": {
    "start": "node ./bin/www",
    "debug": "node --debug ./bin/www"
  },
  "dependencies": {
    "body-parser": "~1.17.1",
    "cookie-parser": "~1.4.3",
    "debug": "~2.6.3",
    "express": "~4.15.2",
    "jade": "~1.11.0",
    "morgan": "~1.8.1",
    "multer": "^1.3.0",
    "nodemailer": "^4.0.1",
    "serve-favicon": "~2.4.2",
    "dotenv": "^4.0.0"
  },
  "engines": {
    "node": "7.10.0"
  }
}

非常感谢!

4

1 回答 1

1

我不知道为什么我得到了一个向下箭头,因为我认为我这种情况的其他人(初学者)也会发现这是一个问题并需要帮助。所以感谢您的帮助。无论如何,我设法找到了答案,这与使用 Outlook.com 作为我的交易电子邮件客户端有关。我改用 sendinblue(这是一项完全免费的服务,而不是 sendgrid 等只提供免费试用然后收费的服务)。我根据我的帐户更改了 API 详细信息,还使用了来自 npm 的包 - heroku-dotenv,它与 dotenv 结合使用,为您将环境变量发送到 heroku。

这两项工作的结合,我现在可以通过 heroku 和正在开发中从我的联系表单接收电子邮件,而无需更改任何 env 编码。

于 2017-06-08T20:38:41.627 回答