gpt4 book ai didi

javascript - 使用 Sendgrid/Nodemailer 将 Angular 表单数据发布到 Node.js

转载 作者:IT老高 更新时间:2023-10-28 23:08:35 24 4
gpt4 key购买 nike

我关注了this example将数据从我的 Angular 应用程序发布到 Node.js 以将网络表单发布到 Sendgrid。经过一些更改后,这可以正常工作,非常感谢您的快速入门。正在将我的表单数据发布到 Sendgrid!

对于这个项目,我正在使用 Angular Fullstack能够在我的 Angular 应用程序中使用 Node 功能。

但是,此示例只有输入字段和文本区域。我希望能够添加一个文件(PDF、Docx 等),以便人们可以通过 Sendgrid 向收件人发送附件。我已经搜索了一个解决方案,但找不到一个可行的示例。也许是因为我想要实现的目标是不可能的。

我的观点(客户):

<div ng-controller="ContactFormCtrl" id="contactformbox" style="margin-top:50px;" class="mainbox" >                    
<div class="panel panel-info" >

<div class="panel-heading">
<div class="panel-title">Solliciteer direct</div>
</div>

<div style="padding-top:30px" class="panel-body" >
<form id="loginform" class="form-horizontal" role="form" name="contactform">

<div style="margin-bottom: 25px" class="input-group">
<span class="input-group-addon"><i class="glyphicon glyphicon-user"></i></span>
<input type="email" name="to" ng-model="email.to" ng-required="true" id="email-to" class="form-control" name="username" value="" placeholder="The emailadres from the employer">
</div>

<div style="margin-bottom: 25px" class="input-group">
<span class="input-group-addon"><i class="glyphicon glyphicon-lock"></i></span>
<input type="email" name="from" ng-model="email.from" ng-required="true" id="email-from" class="form-control" name="email-from" placeholder="Your e-mail address">
</div>

<div style="margin-bottom: 25px" class="input-group">
<span class="input-group-addon"><i class="glyphicon glyphicon-lock"></i></span>
<input type="text" name="subject" ng-model="email.subject" ng-required="true" id="email-subject" class="form-control" name="subject" placeholder="Your subject please">
</div>

<div style="margin-bottom: 25px" class="input-group">
<input type="file" name="file" ng-model="email.file" ng-required="true" id="email-file" class="form-control" name="file">
</div>

<div style="margin-bottom: 25px" class="input-group">
<textarea ng-model="email.text" name="text" placeholder="Enter Text Here.." class="form-control" rows="5" id="comment"></textarea>
</div>

<div style="margin-top:10px" class="form-group">
<!-- Button -->
<div class="col-sm-12 controls">
<button id="emailSubmitBn" class="btn btn-success" type="submit" ng-click="submitEmail()">Submit</button>
</div>
</div>
</form>
</div>
</div>

我的控制者(客户):

angular.module('angularMyApp')
.controller('ContactFormCtrl', function ($scope, $http) {
$scope.submitEmail = function() {

console.log("TEST");
//Request
$http.post('/api/email', $scope.email)
.success(function(data, status) {
console.log("Sent ok");
})
.error(function(data, status) {
console.log("Error");
})
};
});

我的 APP.JS(服务器):

'use strict';

// Set default node environment to development
process.env.NODE_ENV = process.env.NODE_ENV || 'development';

var express = require('express');
var config = require('./config/environment');
var http = require('http');
var bodyParser = require('body-parser');

var options = {
auth: {
api_key: process.env.SENDGRID_APIKEY;
}
}

var nodemailer = require('nodemailer');
var sgTransport = require('nodemailer-sendgrid-transport');

// Setup server
var app = express();
var server = require('http').createServer(app);
require('./config/express')(app);
require('./routes')(app);

var mailer = nodemailer.createTransport(sgTransport(options));

app.post('/api/email', function(req, res) {
var mailOptions = {
to: ['test@test.nl', req.body.to],
from: req.body.from,
subject: req.body.subject,
text: req.body.text
};

mailer.sendMail(mailOptions, function(err, res) {
if (err) {
console.log(err)
}
console.log(res);
});
});

// Start server
server.listen(config.port, config.ip, function () {
console.log('Express server listening on %d, in %s mode', config.port, app.get('env'));
});

// Expose app
exports = module.exports = app;

有两个主要问题:

  1. 客户端:如何在此表单中将附件从 Angular 发布到 Node?我必须先上传文件还是可以使用 $http.post 将其发送到 Node?还是我必须使用 ng-file-upload?
  2. 服务器端:如何将附件发送到 Sendgrid/Nodemailer。将服务器上的 app.js 中的硬编码文件发送到 Sendgrid 不起作用。邮件已成功发送到 Sendgrid,但不包含附件。

非常感谢!

最佳答案

1。上传带有 Angular 形式的文件

你遇到的第一个问题是 ng-model不适用于 <input type="file" /> .因此,您需要创建一个自定义指令来使用文件填充模型。

.directive('fileModel', ['$parse', function ($parse) {
return {
restrict: 'A',
link: function(scope, element, attrs) {
var model = $parse(attrs.fileModel);
var modelSetter = model.assign;

element.bind('change', function(){
scope.$apply(function(){
modelSetter(scope, element[0].files[0]);
});
});
}
};
}]);

然后像这样在文件输入元素上使用指令:

<input type="file" file-model="email.attachment" ng-required="true" id="email-attachment" name="attachment" class="form-control" />

请注意,我更改了 email.fileemail.attachment以避免混淆其余代码。

接下来,您需要将该文件包含在您的 AJAX 请求中。您需要使用 FormData 为了那个原因。使用 FormData.append() 从范围填充它:

$scope.submitEmail = function() {
var formData = new FormData();
Object.keys($scope.email).forEach(function(key) {
formData.append(key, $scope.email[key]);
});
$http.post('/api/email', formData, {
transformRequest: angular.identity,
headers: {'Content-Type': undefined}
}).then(function(data, status) {
console.log("Sent ok");
}, function(data, status) {
console.log("Error");
});
};

请注意,我还将配置对象传递给 $http.post() .这是为了防止 Angular 解析 FormData对象和设置内容类型。

我非常依赖 this blog post对于这部分答案。

2。使用 Nodemailer 发送附件

要快速访问文件,请使用 multer .

安装:

$ npm install --save multer

用法:

var multer = require('multer');
var upload = multer();

app.post('/api/email', upload.single('attachment'), function(req, res) {
// req.file contains the 'attachment' file
...
});

来自 Nodemailer's Readme section on email fields它说使用 attachments属性是 attachment objects 的数组.

app.post('/api/email', upload.single('attachment'), function(req, res) {
var mailOptions = {
to: ['test@test.nl', req.body.to],
from: req.body.from,
subject: req.body.subject,
text: req.body.text,
attachments: [
{
filename: req.file.originalname,
content: req.file.buffer
}
]
};

mailer.sendMail(mailOptions, function(err, res) {
if (err) {
console.log(err)
}
console.log(res);
});
});

上面的例子将附件保存在内存中,如果经常上传大文件,这可能会很糟糕。您可以改为将文件写入磁盘:

var upload = multer({ dest: '/uploads' });

然后,而不是设置文件的 buffer作为附件的content ,您将设置附件的 path到文件的path :

attachments: [
{
filename: req.file.originalname,
path: req.file.path
}
]

关于javascript - 使用 Sendgrid/Nodemailer 将 Angular 表单数据发布到 Node.js,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32354191/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com