Lorezz
9/19/2011 - 3:50 PM

Node.js email handling examples

Node.js email handling examples

# This script will send an image as an email attachment to the
# user himself. The receiving part of this is in read.coffee

# Install EmailJS with `npm install emailjs`
email = require "emailjs"

# You need a config file with your email settings
fs = require "fs"
config = JSON.parse fs.readFileSync "#{process.cwd()}/config.json", "utf-8"

server = email.server.connect
    user: config.username
    password: config.password
    host: config.smtp.host
    ssl: config.smtp.ssl

message = email.message.create 
    text: "This is test"
    from: "#{config.name} <#{config.email}>"
    to: "#{config.name} <#{config.email}>"
    subject: "Testing Node.js email capabilities"

message.attach "reading.png", "image/png", "reading-image.png"

server.send message, (err, message) ->
    return console.error err if err
    console.log "Message sent with id #{message['header']['message-id']}"
# 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
{
    "name": "My Name",
    "email": "user@domain.com",
    "username": "user@gmail.com",
    "password": "MYPASSWORD",
    "imap": {
        "host": "imap.gmail.com",
        "port": 993,
        "secure": true
    },
    "smtp": {
        "host": "smtp.gmail.com",
        "ssl": true
    }
}

Some examples of sending and receiving emails with Node.js.

This uses the following libraries:

Running

Copy config.json.example to config.json and enter your email account details.

Run coffee send.coffee to send yourself an email with an attachment.

Run coffee read.coffee to receive the sent email and write the attachment back to disk with a new name.

config.json
reading-image.png