node实现发送邮件和上传文件功能

在这里插入图片描述

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 相应插件一般错误就能解决,如果还是不行的话可以留言一起解决。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值