增加邮件发送代码

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_TOKEN_SECRET=sdf(**&*&xx2214
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 zTokenParserPlugin = require('plugins/zTokenParser')
const apiAuthPlugin = require('plugins/apiauth')
const fs = require('fs')
const join = require('path').join
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 {
server: FastifyInstance<Server, IncomingMessage, ServerResponse>
@ -27,10 +41,10 @@ export class ApiServer {
this.server.register(helmet, { hidePoweredBy: false })
this.server.register(zTokenParserPlugin)
// this.server.register(apiAuthPlugin, {
// secret: config.api.token_secret,
// expiresIn: config.api.token_expiresIn,
// })
this.server.register(apiAuthPlugin, {
secret: process.env.API_TOKEN_SECRET,
expiresIn: process.env.API_TOKEN_EXPIRESIN,
})
if (process.env.NODE_ENV !== 'production') {
this.server.register(require('@fastify/cors'), {})
}
@ -120,25 +134,10 @@ export class ApiServer {
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() {
let self = this
return new Promise(async (resolve, reject) => {
self.loadConfig()
self.initControllers()
self.registerRouter()
self.setErrHandler()

View File

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

View File

@ -1,6 +1,8 @@
import { AsyncQueue, createAsyncQueue } from 'common/AsyncQueue'
import { singleton } from 'decorators/singleton'
import logger from 'logger/logger'
import { MailService } from 'services/MailService'
import { Deferred } from 'utils/promise.util'
@singleton
export class MailQueue {
@ -10,12 +12,20 @@ export class MailQueue {
}
public async addTaskToQueue(data: any) {
let deferred = new Deferred()
this.queue.push(async () => {
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) {
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() {
const options = {
host: process.env.MAIL_SMTP_HOST,
port: +process.env.MAIL_SMTP_PORT,
secure: process.env.MAIL_SMTP_SECURE,
secure: true,
auth: {
user: process.env.MAIL_SMTP_USER,
pass: process.env.MAIL_SMTP_PASS,
@ -18,10 +17,11 @@ export class MailService {
debug: false,
}
// @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)
}
}