diff --git a/common/email.js b/common/email.js new file mode 100644 index 0000000..16fdb89 --- /dev/null +++ b/common/email.js @@ -0,0 +1,51 @@ +const nodemailer = require('nodemailer'); +const { tokenStore } = require('./token'); +const config = require('../config'); +const { md2html } = require('./utils'); + +async function pushEmailMessage(userPrefix, message) { + let user = tokenStore.get(userPrefix); + if (!user) { + return { + success: false, + message: `不存在的前缀:${userPrefix},请注意大小写`, + }; + } + + let transporter = nodemailer.createTransport({ + host: user.smtpServer, + secure: true, + auth: { + user: user.smtpUser, + pass: user.smtpPass, + }, + }); + + let targetEmail = user.email; + if (message.email) { + targetEmail = message.email; + } + try { + await transporter.sendMail({ + from: `"消息推送服务" <${user.smtpUser}>`, + to: targetEmail, + subject: message.description, + text: message.content, + html: md2html(message.content), + }); + return { + success: true, + message: 'ok', + }; + } catch (e) { + console.error(e); + return { + success: false, + message: e.message, + }; + } +} + +module.exports = { + pushEmailMessage, +}; diff --git a/common/message.js b/common/message.js index 9bcd434..17df7fe 100644 --- a/common/message.js +++ b/common/message.js @@ -1,8 +1,13 @@ const { pushWeChatMessage } = require('./wechat'); +const { pushEmailMessage } = require('./email'); const Message = require('../models/message').Message; async function processMessage(userPrefix, message) { - if (message.content) { + if (message.email) { + // If message has the attribute "email", override its type. + message.type = '1'; + } + if (message.content && message.type === '0') { message = await Message.create(message); } let result = { @@ -14,7 +19,7 @@ async function processMessage(userPrefix, message) { result = await pushWeChatMessage(userPrefix, message); break; case '1': // Email message - // TODO: Email message + result = await pushEmailMessage(userPrefix, message); break; case '2': // HTTP GET request // TODO: HTTP GET request diff --git a/common/token.js b/common/token.js index 988976a..dfa6860 100644 --- a/common/token.js +++ b/common/token.js @@ -13,6 +13,10 @@ async function initializeTokenStore() { wechatOpenId: user.wechatOpenId, wechatVerifyToken: user.wechatVerifyToken, token: '', + email: user.email, + smtpServer: user.smtpServer, + smtpUser: user.smtpUser, + smtpPass: user.smtpPass, }); } }); diff --git a/common/utils.js b/common/utils.js new file mode 100644 index 0000000..4fe169d --- /dev/null +++ b/common/utils.js @@ -0,0 +1,10 @@ +const lexer = require('marked').lexer; +const parser = require('marked').parser; + +function md2html(markdown) { + return parser(lexer(markdown)); +} + +module.exports = { + md2html, +}; diff --git a/models/user.js b/models/user.js index 49c33c0..4da811c 100644 --- a/models/user.js +++ b/models/user.js @@ -42,6 +42,12 @@ User.init( wechatTemplateId: DataTypes.STRING, wechatOpenId: DataTypes.STRING, wechatVerifyToken: DataTypes.STRING, + smtpServer: { + type: DataTypes.STRING, + defaultValue: 'smtp.qq.com', + }, + smtpUser: DataTypes.STRING, + smtpPass: DataTypes.STRING, }, { sequelize } ); diff --git a/package.json b/package.json index 9795404..a2348f9 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ "express-session": "^1.17.1", "marked": "^1.2.7", "morgan": "~1.9.1", + "nodemailer": "^6.4.17", "sequelize": "^6.3.5", "serve-static": "^1.14.1", "sqlite3": "^5.0.1" diff --git a/routers/index.js b/routers/index.js index 4192148..5127c6a 100644 --- a/routers/index.js +++ b/routers/index.js @@ -112,6 +112,9 @@ router.post('/configure', userRequired, async (req, res, next) => { wechatTemplateId: req.body.wechatTemplateId, wechatOpenId: req.body.wechatOpenId, wechatVerifyToken: req.body.wechatVerifyToken, + smtpServer: req.body.smtpServer, + smtpUser: req.body.smtpUser, + smtpPass: req.body.smtpPass, }; for (let field in user) { let value = user[field]; @@ -140,6 +143,9 @@ router.post('/configure', userRequired, async (req, res, next) => { wechatOpenId: userObj.wechatOpenId, wechatVerifyToken: userObj.wechatVerifyToken, token: await requestToken(userObj.wechatAppId, userObj.wechatAppSecret), + smtpServer: userObj.smtpServer, + smtpUser: userObj.smtpUser, + smtpPass: userObj.smtpPass, }); message = '配置更新成功'; console.debug(tokenStore); diff --git a/routers/message.js b/routers/message.js index b2bf5b9..b581354 100644 --- a/routers/message.js +++ b/routers/message.js @@ -1,13 +1,7 @@ const express = require('express'); -const lexer = require('marked').lexer; -const parser = require('marked').parser; const router = express.Router(); -function md2html(markdown) { - return parser(lexer(markdown)); -} - router.get('/delete/:id', (req, res, next) => { // TODO: delete message res.json({ diff --git a/routers/user.js b/routers/user.js index fb7c1e7..32e67d6 100644 --- a/routers/user.js +++ b/routers/user.js @@ -38,6 +38,7 @@ router.all('/:userPrefix', async (req, res, next) => { title: req.query.title || req.body.title || '无标题', description: req.query.description || req.body.description, content: req.query.content || req.body.content, + email: req.query.email || req.body.email, }; let result = await processMessage(userPrefix, message); res.json(result); diff --git a/views/configure.ejs b/views/configure.ejs index 7730214..7de101d 100644 --- a/views/configure.ejs +++ b/views/configure.ejs @@ -89,14 +89,50 @@