62 lines
1.4 KiB
JavaScript
62 lines
1.4 KiB
JavaScript
'use strict'
|
|
|
|
const os = require('os')
|
|
const readline = require('readline')
|
|
const smtp = require('smtp-protocol')
|
|
|
|
const rl = readline.createInterface({
|
|
input: process.stdin,
|
|
output: process.stdout,
|
|
prompt: ''
|
|
})
|
|
|
|
const cfg = {
|
|
host: 'localhost',
|
|
port: 2525,
|
|
email: 'me@me.com',
|
|
hostname: os.hostname()
|
|
}
|
|
|
|
rl.on('SIGINT', () => {
|
|
console.log('... cancelled ...')
|
|
process.exit()
|
|
})
|
|
|
|
smtp.connect(cfg.host, cfg.port, (mail) => {
|
|
mail.helo(cfg.hostname)
|
|
mail.from(cfg.email)
|
|
rl.question('To: ', (to) => {
|
|
to.split(/;|,/gm).forEach((rcpt) => {
|
|
rcpt = rcpt.trim()
|
|
mail.to(rcpt, (err, code, lines) => {
|
|
exitOnFail(err, code, lines, {rcpt: rcpt})
|
|
})
|
|
})
|
|
rl.write('===== Message (^D to send) =====\n')
|
|
mail.data(exitOnFail)
|
|
const body = []
|
|
rl.on('line', (line) => body.push(`${line}\r\n`))
|
|
rl.on('close', () => send(mail, body))
|
|
})
|
|
})
|
|
|
|
function send (mail, body) {
|
|
console.log('... sending ...')
|
|
const message = mail.message()
|
|
body.forEach(message.write, message)
|
|
message.end()
|
|
mail.quit()
|
|
}
|
|
|
|
function exitOnFail (err, code, lines, info) {
|
|
if (code === 550) {
|
|
err = Error(`No Mailbox for Recipient "${info.rcpt}"`)
|
|
}
|
|
if (!err && code !== 354 && code !== 250 && code !== 220 && code !== 200) {
|
|
err = Error(`Protocol Error: ${code} ${lines.join('')}`)
|
|
}
|
|
if (!err) return
|
|
console.error(err.message)
|
|
process.exit(1)
|
|
}
|