Created
October 18, 2017 07:32
-
-
Save monkeym4ster/e20d4ac76070370e739dea7388ce979b to your computer and use it in GitHub Desktop.
Email address verification
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import Dns from 'dns' | |
import Net from 'net' | |
class VerifyMail { | |
constructor (email) { | |
this.email = email | |
} | |
fetchMx (domain) { | |
return new Promise((resolve, reject) => { | |
Dns.setServers(['223.5.5.5', '223.6.6.6']) | |
Dns.resolveMx(domain, (err, data) => { | |
if (err) return reject(err) | |
return resolve(data) | |
}) | |
}) | |
} | |
sendMSG1(socket) { | |
return new Promise((resolve, reject) => { | |
console.log('=> HELO verify-email') | |
socket.write('HELO verify-email\r\n', resolve) | |
}) | |
} | |
sendMSG2(socket) { | |
return new Promise((resolve, reject) => { | |
const from = 'verify-email@gmail.com' | |
console.log(`=> MAIL FROM: <${from}>`) | |
socket.write(`MAIL FROM: <${from}>\r\n`, resolve) | |
}) | |
} | |
sendMSG3(socket) { | |
return new Promise((resolve, reject) => { | |
console.log(`=> RCPT TO: <${this.email}>`) | |
socket.write(`RCPT TO: <${this.email}>\r\n`, resolve) | |
}) | |
} | |
sendMSG4(socket) { | |
return new Promise((resolve, reject) => { | |
console.log(`=> QUIT`) | |
socket.write(`QUIT\r\n`, resolve) | |
}) | |
} | |
verify (email, domain) { | |
return new Promise((resolve, reject) => { | |
let data = Buffer('') | |
const socket = Net.connect(25, domain) | |
socket.on('error', err => { | |
console.error('err', `* Connection STMP server failed, ${err.message}`) | |
return reject(err) | |
}) | |
socket.on('data', (chunk) => { | |
console.log(`<= ${chunk.toString('utf8').trim()}`) | |
data = Buffer.concat([data, chunk]) | |
}) | |
socket.on('connect', async () => { | |
console.log(`* Connection succeeded to ${domain} SMTP.`) | |
await this.sendMSG1(socket) | |
await this.sendMSG2(socket) | |
await this.sendMSG3(socket) | |
await this.sendMSG4(socket) | |
}) | |
socket.on('end', () => { | |
const verify = !data.toString('utf8').includes('550') | |
console.log(`\n* ${this.email} - Result: ${verify ? 'Success': 'Bad'}`) | |
return resolve(verify) | |
}) | |
}) | |
} | |
async run () { | |
const email = this.email | |
const domain = email.split('@')[1] | |
try { | |
const mxList = await this.fetchMx(domain) | |
const mx = mxList[0].exchange | |
console.log(`* MX record about ${domain} is ${mx}.`) | |
return this.verify(email, mx) | |
} catch (err) { | |
console.log(`* Fetch MX record about ${domain} failed. ${err.message}`) | |
throw err | |
} | |
} | |
} | |
const EMAIL = 'admin@qq.com' | |
console.log(`* Target email: ${EMAIL}`) | |
const verifyMail = new VerifyMail(EMAIL) | |
verifyMail.run() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
验证原理