node实现发送邮件带附件
记录下我前不久刚刚接触过的node用来实现发送邮件和上传文件图片功能,希望能帮到和我遇到一样问题的你们,帮助你们少走弯路,提高开发效率
node:是什么?
node可以说99%的后端都可以用node来实现,以下是官方解释:
Node 是一个让 JavaScript 运行在服务端的开发平台,它让 JavaScript 成为与PHP、Python、Perl、Ruby
等服务端语言平起平坐的脚本语言。
大致的意思就是服务端能做的事它也能做。
欲用其器,必知其意。那node怎么实现发送邮件和上传文件图片能。
下载
访问nodejs官网 www.nodejs.org/download/ 下载与机器相匹配的版本
下载成功之后就可以使用npm命令了,想要实现发送邮件需要安装一个nodemail插件,想要上传附件和图片需要express框架。
1,新接文件夹 test,用命令行进入到文件夹,然后执行下面的命令
npm install express formidable --save //下载上传文件fromidable插件
npm install nodemailer --save//下载nodemailer插件
基本环境安装好了之后,开始下面的操作,在命令行用express新建一个文件夹
express -e sampleUpload
cd进入这个文件之后,安装依赖项
cd sampleUpload && npm install
文件结构
express会自动生成项目目录,值得注意的是express4.0之后上传文件功能以及分开,需要自己去下载相关插件
- views存放视图文件
- routes 页面路由跳转控制,表单请求地址直接发送到这
- public 存放css,js,images文件,以及上传文件存放
- controller 是我自己新建的一个文件夹,从路由中抽取出来的用来做文件上传和邮件发送功能
整个请求方式是页面的from表单请求开始,然后到我后台route,路由接收到请求,根据请求信息找到对应的controller
index.html文件
<!DOCTYPE html>
<html>
<head>
<title>测试</title>
<link rel='stylesheet' href='/stylesheets/style.css' />
<script type="text/javascript">
</script>
</head>
<body>
<h1>测试发送邮件带附件</h1>
<form action="/upload" method="post" enctype="multipart/form-data">
<input type="file" class="files" id="files" name="files">
<input type="submit" class="uploadFile" value="文件上传">
</form>
</body>
</html>
在route index.js里面去配置from表单请求地址,以及跳转地址
var express = require('express');//node语法,你需要什么求导入什么
var router = express.Router();
var nodemail = require('../controllers/nodemail');
var mails = require('../controllers/mails');
router.get('/', function (req, res, next) {
res.render('index', { title: 'Express' });
});
router.get('/link', function (req, res, next) {
res.render('link', { title: 'Express' });
});
router.get('/xiamHtml', function (req, res, next) {
res.redirect(301, '');
});
router.get('/mails', function (req, res, next) {
res.render('index', { title: 'Express' });
});
router.get('/xinindex', function (req, res, next) {
res.render('xinindex', { title: 'Express' });
});
router.get('/xinlink', function (req, res, next) {
res.render('xinlink', { title: 'Express' });
});
router.get('/newIndex', function (req, res, next) {
res.render('', { title: 'Express' });
});
router.post('/upload',nodemail.avatar);//第一个是请求过来的地址,第二个是发送邮件的方法,用路由跳转,在我的controller里面
router.post('/upload1',mails.avatar);
module.exports = router;
controllers是我自己新接的文件夹用来实现发送邮件和上传附件的方法
nodemails.js文件
var formidable = require('formidable');//formidable文件上传插件
var nodemailer = require('nodemailer');//发送邮件插件
var path = require('path');
var fs = require('fs');
var TITLE = 'formidable上传示例';
//设置头像
exports.avatar = function(req, res, next) {
var form = new formidable.IncomingForm(); //创建上传表单
form.encoding = 'utf-8'; //设置编辑
form.uploadDir = './public/avatar'; //设置上传目录
form.keepExtensions = true; //保留后缀
form.maxFieldsSize = 2 * 1024 * 1024; //文件大小
form.parse(req,function(err, fields, files) {
console.log("1=================================" + fields.iphone);
console.log("1=================================" + req.body);
if (err) {
res.locals.error = err;
res.render('link', {
title: TITLE
});
return;
}
var extName = ''; //后缀名
console.log("2.2=================================");
switch (files.fulAvatar.type) {
case 'image/pjpeg':
extName = 'jpg';
break;
case 'image/jpeg':
extName = 'jpg';
break;
case 'image/png':
extName = 'png';
break;
case 'image/x-png':
extName = 'png';
break;
}
if (extName.length == 0) {
res.locals.error = '只支持png和jpg格式图片';
console.log("我结束了=================================");
console.log("3=================================");
//邮件发送
var transporter = nodemailer.createTransport({
service: '163.com',
auth: {
user: 'xxx@163.com',
//你的163邮箱账号
pass: '' //密码或者授权码
}
});
var mailOptions = {
from: 'xxx@163.com',//和user必须要一样
// sender address
to: '11@qq.com;cc@qq.com'//需要发送给谁的邮箱
// list of receivers
subject: fields.names,
// Subject line
text:fields.job,
html:"name :"+fields.names+"<br>"+"job:"+ fields.job+"<br>"+
"email :"+fields.mail+"<br>"+"iphone :"+fields.iphone+"address :"+fields.address,
// plaintext body
attachments: [{
filename: fields.names+fields.iphone+files.fulAvatar.name,
path: files.fulAvatar.path
}]
};
transporter.sendMail(mailOptions,
function(error, info) {
if (!error) {
return res.render("link", {
message: "faile!"
});
} else {
console.log(error);
return res.render("link", {
message: "success"
});
}
});
/* res.render("xiamHtml", {
message: "<script>alert('发送成功');</script>",
text:"<script>alert('发送成功');</script>"
});*/ //上传成功之后需要跳转的地址
res.render('link', {
title: TITLE,
});//也可以用路由的方法,找到link路由,在link里面指定跳转路径
return;
}
var avatarName = Math.random() + '.' + extName;
var newPath = form.uploadDir + avatarName;
console.log(newPath);
fs.renameSync(files.fulAvatar.path, newPath); //重命名
res.locals.success = '上传成功';
console.log("文件上传成功");
console.log("文件上传成功=========================" + files.fulAvatar.path);
});
}
大致讲的比较简单,实际中可能会遇到一些问题,一般的错误就是报缺少什么插件,如果是这类的错误,找到错误直接npm install 相应插件一般错误就能解决,如果还是不行的话可以留言一起解决。