kangna преди 7 години
родител
ревизия
0f7720fd7d
променени са 9 файла, в които са добавени 302 реда и са изтрити 0 реда
  1. 94 0
      aliyunSMS.js
  2. 9 0
      config.js
  3. 33 0
      email.js
  4. 61 0
      imageCaptcha.js
  5. 31 0
      index.html
  6. 26 0
      main.js
  7. 19 0
      package.json
  8. 16 0
      sendemail.js
  9. 13 0
      verification.js

+ 94 - 0
aliyunSMS.js

@@ -0,0 +1,94 @@
+const SMSClient = require('@alicloud/sms-sdk')
+    express = require('express')
+    session = require('./session'),
+    bodyParser = require('body-parser'),
+    newsession = new session(),
+    app = express()
+
+app.all('*', (req, res, next) => {
+    res.header("Access-Control-Allow-Origin", req.headers.origin); //设置来源
+    res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
+    res.header("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS");
+    res.header("Access-Control-Max-Age", "604800000");
+    res.header("Access-Control-Allow-Credentials", true);
+    res.header("X-Powered-By", ' 3.2.1');
+    // res.header("Content-Type", "application/json;charset=utf-8");
+    next();
+});
+
+
+// ACCESS_KEY_ID/ACCESS_KEY_SECRET 根据实际申请的账号信息进行替换
+const accessKeyId = 'LTAI1axR0bfBECLK'
+const secretAccessKey = 'i4BARcxzLumd4SV2VeSero6VigEAqT'
+const smsClient = new SMSClient({accessKeyId, secretAccessKey})
+app.use(bodyParser.urlencoded({extended:false}))
+
+app.use(newsession.sessionConfig())
+
+app.post('/postnumber', async (req, res) => {
+    console.log(req.body.number)
+    let code = Math.floor(Math.random() * 99999)
+    req.session.code = code
+    console.log(req.session.code)
+    if (/^1[3|4|5|8][0-9]\d{4,8}$/.test(req.body.number)) {
+            try{
+                let data = await main(req.body.number, code)
+                if (data.Code === 'OK') {
+                    res.status(201).send({
+                        code: 'ok'
+                    })
+                } else {
+                    res.status(202).send({
+                        err: '服务器繁忙,请重新再试'
+                    })
+                }
+            } catch (e) {
+                if (e.code == "isv.BUSINESS_LIMIT_CONTROL") {
+                    res.status(202).send({
+                        err: '你号码已经限流,请稍后再试'
+                    })
+                }
+            }
+    } else {
+        res.status(202).send({
+            err: '请检查手机格式是否正确'
+        })
+    }
+})
+
+app.post('/verifi', (req, res) => {
+    console.log(req.body.code)
+    console.log(req.session.code)
+    if (req.body.code == req.session.code) {
+            res.status(201).send({
+                code: 'ok'
+            })
+    } else {
+        res.status(202).send({
+            err: '验证码错误'
+        })
+    }
+})
+
+app.post('/getmsg', (req, res) => {
+    console.log(req.url)
+    res.send('1')
+})
+
+
+const main = async (number, code) => {
+    let data = await smsClient.sendSMS({
+        PhoneNumbers: number,
+        SignName: '阿里云短信测试专用',
+        TemplateCode: 'SMS_133180335',
+        TemplateParam: '{"code":"' + code + '"}'
+    })
+    return data
+}
+
+
+const server = app.listen(2080, function () {
+    let host = server.address().address;
+    let port = server.address().port;
+    console.log('Example app listening at http://http://localhost/', host, port);
+});

+ 9 - 0
config.js

@@ -0,0 +1,9 @@
+const config = {
+    host: 'mail.1473.cn',
+    port: 25,
+    user: 'postmaster@mail.1473.cn',
+    pass: 'usestudio-1',
+    subject: '雨云科技'
+}
+
+module.exports = config

+ 33 - 0
email.js

@@ -0,0 +1,33 @@
+const nodemailer = require("nodemailer");
+const config = require('./config')
+
+const main = async (userEmail, usermessage) => {
+    try {
+        // let captcha = Math.floor(Math.random() * 9000) + 1000
+        let transporter = nodemailer.createTransport({
+            host: config.host,
+            port: config.port,
+            auth: {
+                user: config.user, // 用户名
+                pass: config.pass // 密码
+            },
+            tls: {
+                rejectUnauthorized: false
+            }
+        });
+    
+        let info = await transporter.sendMail({
+            from: '"1473" <postmaster@mail.1473.cn>', // sender address
+            to: `${userEmail}`, // list of receivers
+            subject: "邮件", // Subject line
+            html: `<h2>${usermessage}</h2>`
+        }); 
+
+        return 'success'
+    } catch (error) {
+        return 'err'
+    }
+
+}
+
+module.exports = main

+ 61 - 0
imageCaptcha.js

@@ -0,0 +1,61 @@
+const imageCaptch = require('svg-captcha')
+const express = require('express')
+const session = require('express-session')
+const bodyParser = require('body-parser')
+const app = express()
+
+app.all('*', (req, res, next) => {
+    res.header("Access-Control-Allow-Origin", req.headers.origin); //设置来源
+    res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
+    res.header("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS");
+    res.header("Access-Control-Max-Age", "604800000");
+    res.header("Access-Control-Allow-Credentials", true);
+    res.header("X-Powered-By", ' 3.2.1');
+    // res.header("Content-Type", "application/json;charset=utf-8");
+    next();
+});
+
+app.use(session({
+    secret: 'captcha',
+    cookie: {
+        maxAge: 300000
+    },
+    saveUninitialized: true,
+    resave: true,
+    name: 'imageVerification'
+}))
+app.use(bodyParser.urlencoded({extended:false}))
+
+app.get('/getImage', (req, res) => {
+    const svgimg = imageCaptch.create({
+        size: 4,
+        ignoreChars: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
+        noise: 2,
+        color: true
+    })
+    req.session.imgtext = svgimg.text
+    res.send(svgimg.data)
+})
+
+app.post('/postImagetext', (req, res) => {
+    if(req.session.imgtext){
+        if(req.session.imgtext == req.body.imgtexter){
+            res.send({
+                seccess: '验证码正确'
+            })
+        }else{
+            res.status(202).send({
+                err: '验证码错误'
+            })
+        }
+    }else{
+        res.status(203).send({
+            err: '未获取验证码'
+        })
+    }
+})
+
+app.listen('9000', () => {
+    console.log('service listing port 9000')
+})
+

+ 31 - 0
index.html

@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <meta http-equiv="X-UA-Compatible" content="ie=edge">
+    <title>demo</title>
+</head>
+<body>
+    <input type="email" placeholder="邮箱" name="email" id="emailer">
+    <input type="text" placeholder="信息" name="message" id="messager">
+    <input type="button" value="发送" onclick="loadDoc()">
+    <div id="State"></div>
+</body>
+<script>
+    function loadDoc() {
+        var xhttp = new XMLHttpRequest();
+        xhttp.onreadystatechange = function() {
+            if (this.readyState == 4 && this.status == 200) {
+                document.querySelectorAll('#State')[0].innerHTML = '发送成功'
+            }else if (this.status == 201) {
+                document.querySelectorAll('#State')[0].innerHTML = '服务器出错'
+            }
+        };
+        xhttp.open("POST", "http://short.1473.cn/postemail", true);
+        xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
+        xhttp.withCredentials = true;
+        xhttp.send(`useremail=${document.querySelectorAll('#emailer')[0].value}&usermessage=${document.querySelectorAll('#messager')[0].value}`);
+    }
+</script>
+</html>

+ 26 - 0
main.js

@@ -0,0 +1,26 @@
+const express = require('express')
+const bodyParser = require('body-parser')
+const app = express()
+
+const sendemail = require('./sendemail')
+const verification = require('./verification')
+
+app.all('*', (req, res, next) => {
+    res.header("Access-Control-Allow-Origin", req.headers.origin); //设置来源
+    res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
+    res.header("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS");
+    res.header("Access-Control-Max-Age", "604800000");
+    res.header("Access-Control-Allow-Credentials", true);
+    res.header("X-Powered-By", ' 3.2.1');
+    // res.header("Content-Type", "application/json;charset=utf-8");
+    next();
+});
+
+app.use(bodyParser.urlencoded({extended:false}))
+
+app.use('/postemail', sendemail)
+app.use('/verification', verification)
+
+app.listen('8081', () => {
+    console.log('http://127.0.0.1:8081')
+})

+ 19 - 0
package.json

@@ -0,0 +1,19 @@
+{
+  "name": "emailcode",
+  "version": "1.0.0",
+  "description": "email code",
+  "main": "main.js",
+  "scripts": {
+    "test": "echo \"Error: no test specified\" && exit 1",
+    "start": "node main.js"
+  },
+  "author": "kangna",
+  "license": "ISC",
+  "dependencies": {
+    "body-parser": "^1.19.0",
+    "express": "^4.16.4",
+    "express-session": "^1.16.1",
+    "nodemailer": "^6.1.1",
+    "svg-captcha": "^1.4.0"
+  }
+}

+ 16 - 0
sendemail.js

@@ -0,0 +1,16 @@
+const express = require('express')
+const router = express.Router()
+const email = require('./email')
+
+router.post('/', async (req, res) => {
+    let useremail = req.body.useremail
+    let usermessage = req.body.usermessage
+    let data = await email(useremail, usermessage)
+    if(data != 'err' && data == 'success') {
+        res.status(200).send('success')
+    }else {
+        res.status(201).send('服务器出错了')
+    }
+})
+
+module.exports = router

+ 13 - 0
verification.js

@@ -0,0 +1,13 @@
+const express = require('express')
+const router = express.Router()
+
+router.post('/', async (req, res) => {
+    let code = req.body.code
+    if(code == req.session.emailtext) {
+        res.status(200).send('验证码正确')
+    }else {
+        res.status(201).send('验证码错误')
+    }
+})
+
+module.exports = router