重构mail模块, 更换依赖为nodemailer

master
yutent 2023-11-02 10:37:51 +08:00
parent 9701b3c8d8
commit b207971b6e
3 changed files with 70 additions and 29 deletions

3
.gitignore vendored
View File

@ -7,3 +7,6 @@
._* ._*
.idea .idea
.vscode .vscode
package-lock.json
node_modules

View File

@ -4,42 +4,72 @@
* @date 2020/09/18 15:59:31 * @date 2020/09/18 15:59:31
*/ */
import mailx from 'mailx' import nodemailer from 'nodemailer'
export default class Sendmail { const DEFAULT_CONFIG = {
constructor({ host, port, mail, passwd }) { host: 'smtp.example.com',
if (!host || !port || !mail || !passwd) { port: 465,
throw new Error('smtp options [host, port, mail, passwd] is required.') secure: true,
auth: {
user: 'no-reply@example.com',
username: 'no-reply',
pass: ''
} }
this.smtp = mailx.transport(host, port, mail, passwd) }
export class Mailer {
#smtp = null
#from = ''
#to = ''
constructor(opts) {
this.#smtp = nodemailer.createTransport(opts)
this.#from = `${opts.auth.username || 'no named'}"<${opts.auth.user}>"`
} }
// 发件人 // 发件人
from(info) { from(email, username) {
this.mail = mailx.message() this.#from = `${username || 'no named'}"<${email}>"`
this.mail.setFrom(info.name, info.mail)
return this return this
} }
// 收件人 // 收件人
to(info) { to(email, username) {
this.mail.addTo(info.name, info.mail) this.#to = `${username || 'no named'}"<${email}>"`
return this return this
} }
// 发送正文 // 发送正文
send(mail) { send(
this.mail.setSubject(mail.subject) mail = {
this.mail.setHtml(mail.content) subject: 'example mail',
var defer = Promise.defer() text: 'example mail plain content',
this.smtp.send(this.mail, function(err, res) { html: '<p>example mail html content</p>'
if (err) {
defer.reject(err)
} else {
defer.resolve(res)
} }
}) ) {
return defer.promise if (!this.#to) {
throw new Error('the email address send to is empty!')
}
mail.from = this.#from
mail.to = this.#to
this.#to = ''
return this.#smtp.sendMail(mail)
}
}
export const MailModule = {
name: 'mail',
install(conf = {}) {
if (!conf.auth) {
throw new Error('mail auth account must not be empty.')
}
let smtp = Object.assign({}, DEFAULT_CONFIG, conf)
return new Mailer(smtp)
} }
} }

View File

@ -1,11 +1,19 @@
{ {
"name": "@gm5/mail", "name": "@gm5/mail",
"version": "1.0.0", "version": "2.0.0",
"type": "module", "type": "module",
"description": "邮件收发管理", "description": "邮件收发管理",
"main": "index.js", "main": "index.js",
"author": "yutent", "author": "yutent",
"keywords": ["fivejs", "controller", "http"], "keywords": [
"repository": "https://github.com/bytedo/gmf.mail.git", "fivejs",
"license": "MIT" "gm5",
"mail",
"sendmail"
],
"repository": "https://git.wkit.fun/gm5/mail.git",
"license": "MIT",
"dependencies": {
"nodemailer": "^6.9.7"
}
} }