|
# This example script opens an IMAP connection to the server and |
|
# seeks unread messages sent by the user himself. It will then |
|
# download those messages, parse them, and write their attachments |
|
# to disk. |
|
|
|
# Install node-imap with `npm install imap` |
|
imap = require "imap" |
|
# Install mailparser with `npm install mailparser` |
|
mailparser = require "mailparser" |
|
|
|
# You need a config file with your email settings |
|
fs = require "fs" |
|
config = JSON.parse fs.readFileSync "#{process.cwd()}/config.json", "utf-8" |
|
|
|
server = new imap.ImapConnection |
|
username: config.username |
|
password: config.password |
|
host: config.imap.host |
|
port: config.imap.port |
|
secure: config.imap.secure |
|
|
|
exitOnErr = (err) -> |
|
console.error err |
|
do process.exit |
|
|
|
server.connect (err) -> |
|
exitOnErr err if err |
|
server.openBox "INBOX", false, (err, box) -> |
|
exitOnErr err if err |
|
console.log "You have #{box.messages.total} messages in your INBOX" |
|
|
|
server.search ["UNSEEN", ["SINCE", "Sep 18, 2011"], ["FROM", config.email]], (err, results) -> |
|
exitOnErr err if err |
|
|
|
unless results.length |
|
console.log "No unread messages from #{config.email}" |
|
do server.logout |
|
return |
|
|
|
fetch = server.fetch results, |
|
request: |
|
body: "full" |
|
headers: false |
|
|
|
fetch.on "message", (message) -> |
|
fds = {} |
|
filenames = {} |
|
parser = new mailparser.MailParser |
|
|
|
parser.on "headers", (headers) -> |
|
console.log "Message: #{headers.subject}" |
|
|
|
parser.on "astart", (id, headers) -> |
|
filenames[id] = headers.filename |
|
fds[id] = fs.openSync headers.filename, 'w' |
|
|
|
parser.on "astream", (id, buffer) -> |
|
fs.writeSync fds[id], buffer, 0, buffer.length, null |
|
|
|
parser.on "aend", (id) -> |
|
return unless fds[id] |
|
fs.close fds[id], (err) -> |
|
return console.error err if err |
|
console.log "Writing #{filenames[id]} completed" |
|
|
|
message.on "data", (data) -> |
|
parser.feed data.toString() |
|
|
|
message.on "end", -> |
|
do parser.end |
|
|
|
fetch.on "end", -> |
|
do server.logout |
In read.coffee, instead of using sync methods (fs.openSync and fs.writeSync), you can do async writing via fs.createWriteStream(), then .write() on that stream, and then call .end() when you're done.