var email ={
config:{
host:'smtp.qq.com',
port:25,
account:'邮箱账号',
pwd:'密码或授权码'},asyncsend(obj){//connectvar res =awaitthis.connect()if(res.code)return res
var serv = res.msg
//AUTH LOGIN
res =awaitthis.login(serv)if(res.code)return res
//send mail
res =awaitthis.sendMail(serv, obj)if(res.code)return res
//quitreturnawaitthis.quit(serv)},asyncsendMail(socket, obj){if(typeof obj.to !='object'||!obj.title ||!obj.body)return{ code:3, msg:'email para error'}//MAIL FROMvarfrom=this.config.account
var res =awaitthis.say(`MAIL FROM:<${from}>\r\n`, socket)if(res.code)return res
//RCPT TOfor(var i in obj.to){
res =awaitthis.say(`RCPT TO:<${obj.to[i]}>\r\n`, socket)if(res.code)return res
}//DATA
res =awaitthis.say(`DATA\r\n`, socket)if(res.code)return res
//DATA startvar data =`MIME-Version:1.0\r\n`+`Content-Type:text/html;charset=utf-8\r\n`+`Cc:${obj.to.join()}\r\n`+//抄送人`From:${from}\r\n`+`Subject:${obj.title}\r\n`+`\r\n${obj.body}\r\n`+`\r\n.\r\n`;returnawaitthis.say(data, socket)},asyncconnect(){if(!this.config.host||!this.config.port)return{code:1,msg:'config error'}const net =require('net')var serv = net.connect({
host:this.config.host,
port:this.config.port
})
serv.on('error',err=>{
serv.end();
console.log(err)})var res =awaitthis.getData(serv)if(res.code)return{ code:1, msg:'connect error'}
res=awaitthis.say(`HELO 127.0.0.1\r\n`, serv)return res.code?res:{code:0,msg:serv}},asynclogin(socket){if(!this.config.account||!this.config.pwd)return{code:1,msg:'config error'}var account = Buffer.from(this.config.account).toString('base64')var pwd = Buffer.from(this.config.pwd).toString('base64')var res =awaitthis.say(`AUTH LOGIN\r\n`, socket)if(res.code)return res
res =awaitthis.say(`${account}\r\n`, socket)if(res.code)return res
returnawaitthis.say(`${pwd}\r\n`, socket)},asyncquit(socket){var res =awaitthis.say(`QUIT\r\n`, socket)if(!res.code) socket.end()return res
},say(cmd, socket){var that=thisreturnnewPromise(resolve=>{
socket.write(cmd)
socket.on('data', data =>{
socket.removeAllListeners('data');
data = data.toString()if(/^[4|5]/.test(data))socket.end()resolve({
code:/^[4|5]/.test(data)?1:0,
msg:`${cmd}${data}`})})})},getData(socket){returnnewPromise(resolve =>{
socket.on('data', data =>{
socket.removeAllListeners('data');
data = data.toString()resolve({
code:/^[4|5]/.test(data)?1:0,
msg:`${data}`})})})}}