diff --git a/server/app/controller/notify.js b/server/app/controller/notify.js index 84c3d17..b24f8e0 100644 --- a/server/app/controller/notify.js +++ b/server/app/controller/notify.js @@ -1,4 +1,5 @@ const { readNotifyConfig, writeNotifyConfig, readNotifyList, writeNotifyList } = require('../utils') +const { sctTest, emailTest } = require('../utils/test-notify') // const commonTemp = require('../template/commonTemp') async function getNotifyConfig({ res }) { @@ -9,8 +10,21 @@ async function getNotifyConfig({ res }) { // 根据type待编写测试方法,测试通过才保存到库 async function updateNotifyConfig({ res, request }) { let { body: { noticeConfig } } = request - await writeNotifyConfig(noticeConfig) - return res.success() + let { type } = noticeConfig + try { + switch(type) { + case 'sct': + await sctTest(noticeConfig[type]) + break + case 'email': + await emailTest(noticeConfig[type]) + break + } + await writeNotifyConfig(noticeConfig) + return res.success({ msg: '测试通过 | 保存成功' }) + } catch (error) { + return res.fail({ msg: error.message }) + } } async function getNotifyList({ res }) { diff --git a/server/app/utils/test-notify.js b/server/app/utils/test-notify.js new file mode 100644 index 0000000..be67a54 --- /dev/null +++ b/server/app/utils/test-notify.js @@ -0,0 +1,47 @@ +const nodemailer = require('nodemailer') +const axios = require('axios') + +module.exports.sctTest = function ({ sendKey }) { + // eslint-disable-next-line no-async-promise-executor + return new Promise((async (resolve, reject) => { + consola.info('server酱通知测试: ', sendKey) + try { + let { data } = await axios.get(`https://sctapi.ftqq.com/${ sendKey }.send?title=messagetitle`) + resolve(data) + consola.success('测试成功') + } catch (error) { + reject(error) + consola.error('测试失败: ', error) + } + })) +} + +module.exports.emailTest = function (conf) { + // eslint-disable-next-line no-async-promise-executor + return new Promise((async (resolve, reject) => { + consola.info('邮箱通知测试: ', conf) + try { + const { service, user, pass } = conf + let transporter = nodemailer.createTransport({ + service, + auth: { + user, + pass + } + }) + let info = await transporter.sendMail({ + from: user, + to: user, + subject: 'EasyNode: 测试邮件通知', + text: '测试邮件', + html: '测试邮件' + }) + consola.info('Message sent: %s', info.messageId) + resolve() + consola.success('测试成功') + } catch (error) { + reject(error) + consola.error('测试失败: ', error) + } + })) +} diff --git a/web/src/views/setting/components/notify-config.vue b/web/src/views/setting/components/notify-config.vue index 23f9beb..7b8b7ed 100644 --- a/web/src/views/setting/components/notify-config.vue +++ b/web/src/views/setting/components/notify-config.vue @@ -40,9 +40,10 @@ + 邮箱服务商, 例如: Gmial、qq、126、163, 支持列表: 点击查询 - 保存并测试 + 测试并保存 @@ -100,20 +101,28 @@ const rules = reactive({ const handleSave = () => { formRef.value.validate(async (valid) => { if (!valid) return - await $api.updateNotifyConfig({ noticeConfig: { ...noticeConfig.value } }) - $message.success('保存成功') + try { + loading.value = true + await $api.updateNotifyConfig({ noticeConfig: { ...noticeConfig.value } }) + // $message.success('保存成功') + $notification.success({ + title: '测试通过 | 保存成功', + message: '请确认通知方式是否已收到通知' + }) + } catch (error) { + console.error(error) + } finally { + loading.value = false + } }) } const getNotifyConfig = async () => { try { - loading.value = true let { data } = await $api.getNotifyConfig() noticeConfig.value = data || {} } catch (error) { console.error(error) - } finally { - loading.value = false } } @@ -126,5 +135,10 @@ onMounted(() => {