增加邮件发送代码

This commit is contained in:
zhl 2023-03-15 13:43:06 +08:00
parent ef84705b25
commit d09e94260a
5 changed files with 47 additions and 31 deletions

View File

@ -2,3 +2,10 @@ API_PORT=3087
API_HOST=0.0.0.0 API_HOST=0.0.0.0
API_TOKEN_SECRET=sdf(**&*&xx2214 API_TOKEN_SECRET=sdf(**&*&xx2214
API_TOKEN_EXPIRESIN=1d API_TOKEN_EXPIRESIN=1d
MAIL_SMTP_HOST=
MAIL_SMTP_PORT=
MAIL_SMTP_SECURE=
MAIL_SMTP_USER=
MAIL_SMTP_PASS=

View File

@ -8,11 +8,25 @@ const NODE_ENV = process.env.NODE_ENV || 'development'
const zReqParserPlugin = require('plugins/zReqParser') const zReqParserPlugin = require('plugins/zReqParser')
const zTokenParserPlugin = require('plugins/zTokenParser') const zTokenParserPlugin = require('plugins/zTokenParser')
const apiAuthPlugin = require('plugins/apiauth')
const fs = require('fs') const fs = require('fs')
const join = require('path').join const join = require('path').join
const env = process.env const env = process.env
;(() => {
let path
switch (process.env.NODE_ENV) {
case 'test':
path = `${__dirname}/../.env.development`
break
case 'production':
path = `${__dirname}/../.env.production`
break
default:
path = `${__dirname}/../.env.development`
}
dotenv.config({ path: path, debug: NODE_ENV === 'development' })
})()
export class ApiServer { export class ApiServer {
server: FastifyInstance<Server, IncomingMessage, ServerResponse> server: FastifyInstance<Server, IncomingMessage, ServerResponse>
@ -27,10 +41,10 @@ export class ApiServer {
this.server.register(helmet, { hidePoweredBy: false }) this.server.register(helmet, { hidePoweredBy: false })
this.server.register(zTokenParserPlugin) this.server.register(zTokenParserPlugin)
// this.server.register(apiAuthPlugin, { this.server.register(apiAuthPlugin, {
// secret: config.api.token_secret, secret: process.env.API_TOKEN_SECRET,
// expiresIn: config.api.token_expiresIn, expiresIn: process.env.API_TOKEN_EXPIRESIN,
// }) })
if (process.env.NODE_ENV !== 'production') { if (process.env.NODE_ENV !== 'production') {
this.server.register(require('@fastify/cors'), {}) this.server.register(require('@fastify/cors'), {})
} }
@ -120,25 +134,10 @@ export class ApiServer {
return payload return payload
}) })
} }
private loadConfig() {
let path
switch (process.env.NODE_ENV) {
case 'test':
path = `${__dirname}/../.env.development`
break
case 'production':
path = `${__dirname}/../.env.production`
break
default:
path = `${__dirname}/../.env.development`
}
dotenv.config({ path: path, debug: NODE_ENV === 'development' })
}
public async start() { public async start() {
let self = this let self = this
return new Promise(async (resolve, reject) => { return new Promise(async (resolve, reject) => {
self.loadConfig()
self.initControllers() self.initControllers()
self.registerRouter() self.registerRouter()
self.setErrHandler() self.setErrHandler()

View File

@ -6,12 +6,12 @@ import { MailQueue } from 'queue/mail.queue'
class MailController extends BaseController { class MailController extends BaseController {
@role('anon') @role('anon')
@router('post /mail/send') @router('post /mail/send')
async registWebClient(req, res) { async sendOneMail(req, res) {
let { data } = req.params let { message } = req.params
if (!data) { if (!message) {
throw new ZError(10, 'params mismatch') throw new ZError(10, 'params mismatch')
} }
const qrId = new MailQueue().addTaskToQueue(data) const result = await new MailQueue().addTaskToQueue(message)
return {} return { msgId: result.messageId }
} }
} }

View File

@ -1,6 +1,8 @@
import { AsyncQueue, createAsyncQueue } from 'common/AsyncQueue' import { AsyncQueue, createAsyncQueue } from 'common/AsyncQueue'
import { singleton } from 'decorators/singleton' import { singleton } from 'decorators/singleton'
import logger from 'logger/logger'
import { MailService } from 'services/MailService' import { MailService } from 'services/MailService'
import { Deferred } from 'utils/promise.util'
@singleton @singleton
export class MailQueue { export class MailQueue {
@ -10,12 +12,20 @@ export class MailQueue {
} }
public async addTaskToQueue(data: any) { public async addTaskToQueue(data: any) {
let deferred = new Deferred()
this.queue.push(async () => { this.queue.push(async () => {
try { try {
await new MailService().send(data) let info = await new MailService().send(data)
logger.info(
`send mail success:: from: ${data.from}, to: ${data.to}, subject: ${data.subject}, messageId: ${info.messageId}`,
)
deferred.resolve(info)
} catch (err) { } catch (err) {
console.log('send mail error.') logger.info(`send mail error:: from: ${data.from}, to: ${data.to}, subject: ${data.subject}`)
logger.error(err)
deferred.reject(err)
} }
}) })
return deferred.promise
} }
} }

View File

@ -8,8 +8,7 @@ export class MailService {
constructor() { constructor() {
const options = { const options = {
host: process.env.MAIL_SMTP_HOST, host: process.env.MAIL_SMTP_HOST,
port: +process.env.MAIL_SMTP_PORT, secure: true,
secure: process.env.MAIL_SMTP_SECURE,
auth: { auth: {
user: process.env.MAIL_SMTP_USER, user: process.env.MAIL_SMTP_USER,
pass: process.env.MAIL_SMTP_PASS, pass: process.env.MAIL_SMTP_PASS,
@ -18,10 +17,11 @@ export class MailService {
debug: false, debug: false,
} }
// @ts-ignore // @ts-ignore
this.transporter = createTransport(options, { from: '' }) this.transporter = createTransport(options, {})
} }
public send(message: Mail.Options) { public async send(message: Mail.Options) {
await this.transporter.verify()
return this.transporter.sendMail(message) return this.transporter.sendMail(message)
} }
} }