xpensia / ImapServer

IMAP Server module for Nodejs
81 stars 17 forks source link

It doesn't look like you got very far #1

Closed ForbesLindesay closed 11 years ago

ForbesLindesay commented 11 years ago

I have the same goal of creating an IMAP Server, but I've only just started and have basically got to the "finished reading the spec" stage. I can't help but feel it would be faster if I had a group of people working on this.

Are you still interested in building an IMAP server?

JeanSebTr commented 11 years ago

Hi,

sorry, the notification got lost in all the watched projects.... I've just pushed some sleeping code I had on my computer.

This project is still in my roadmap, but I've no idea when I'll put more time on it. I'll take some time this week to check what's the status of the project and if it's somewhere near usable.

It's inspired by Haraka minus the hurdle to use in code.

I've a similar project for FTP server, I don't remember which one is more advanced. Theoretically, it would be used like this (project specific use) :


var fs = require('fs');

// SSL
var certs = {
    key: fs.readFileSync('./ssl/key.pem'),
    cert: fs.readFileSync('./ssl/cert.pem')
};

// Database
var mongoose = require('mongoose');
require('mongoose-schema-extend');
var db = mongoose.createConnection(process.env.MONGODB);
require('./models')(db);

// Imap server
var ImapServer = require('imap-server');
var imapPlugins = require('imap-server/plugins');
var imapServer = ImapServer.createServer();
var onImapConnect = imapServer.createConnection.bind(imapServer);
imapServer.use(imapPlugins.debug);
imapServer.use(imapPlugins.announce);
imapServer.use(imapPlugins.starttls);
imapServer.use(require('./plugins/imap/auth.js'));
imapServer.use(require('./plugins/imap/list.js'));
imapServer.use(require('./plugins/imap/select.js'));
imapServer.notes.db = db;
imapServer.notes.tls = certs;
imapServer.notes.delimiter = '/';
// port 143
var net = require('net');
net.createServer(onImapConnect).listen(process.env.IMAP_PORT || 143);
// port 993
var tls = require('tls');
tls.createServer(certs, onImapConnect).listen(process.env.IMAPS_PORT || 993);
JeanSebTr commented 11 years ago

And yes, I would be really interested to collaborate to a similar project or have collaborators.

As long as the project has the following characteristics :

ForbesLindesay commented 11 years ago

Excellent. I've started an organisation called @hashmail to store repositories for interacting with "legacy" e-mail systems such as IMAP, SMTP, POP3, ICAL etc.

So far all I have is a very bare bones proof of concept at hashmail/imap-server which is just good enough to trick Firefox into accepting it as a valid imap-server.

The API I have in mind is very similar to what you've described. Taking inspiration from express I'd have the main export be createServer() and also have createServer return the createConnection function, which would make your above example be:

  var fs = require('fs');

  // SSL
  var certs = {
      key: fs.readFileSync('./ssl/key.pem'),
      cert: fs.readFileSync('./ssl/cert.pem')
  };

  // Database
  var mongoose = require('mongoose');
  require('mongoose-schema-extend');
  var db = mongoose.createConnection(process.env.MONGODB);
  require('./models')(db);

  // Imap server
  var ImapServer = require('imap-server');
  var imapPlugins = require('imap-server/plugins');
- var imapServer = ImapServer.createServer();
+ var imapServer = ImapServer();
  imapServer.use(imapPlugins.debug);
  imapServer.use(imapPlugins.announce);
  imapServer.use(imapPlugins.starttls);
  imapServer.use(require('./plugins/imap/auth.js'));
  imapServer.use(require('./plugins/imap/list.js'));
  imapServer.use(require('./plugins/imap/select.js'));
  imapServer.notes.db = db;
  imapServer.notes.tls = certs;
  imapServer.notes.delimiter = '/';
  // port 143
  var net = require('net');
- net.createServer(onImapConnect).listen(process.env.IMAP_PORT || 143);
+ net.createServer(imapServer).listen(process.env.IMAP_PORT || 143);
  // port 993
  var tls = require('tls');
- tls.createServer(certs, onImapConnect).listen(process.env.IMAPS_PORT || 993);
+ tls.createServer(certs, imapServer).listen(process.env.IMAPS_PORT || 993);

I then also think that the notes object should just be parsed to ImapServer as an options object:

  var fs = require('fs');

  // SSL
  var certs = {
      key: fs.readFileSync('./ssl/key.pem'),
      cert: fs.readFileSync('./ssl/cert.pem')
  };

  // Database
  var mongoose = require('mongoose');
  require('mongoose-schema-extend');
  var db = mongoose.createConnection(process.env.MONGODB);
  require('./models')(db);

  // Imap server
  var ImapServer = require('imap-server');
  var imapPlugins = require('imap-server/plugins');
- var imapServer = ImapServer();
+ var imapServer = ImapServer({db: db, tls: certs, delimiter: '/'});
  imapServer.use(imapPlugins.debug);
  imapServer.use(imapPlugins.announce);
  imapServer.use(imapPlugins.starttls);
  imapServer.use(require('./plugins/imap/auth.js'));
  imapServer.use(require('./plugins/imap/list.js'));
  imapServer.use(require('./plugins/imap/select.js'));
- imapServer.notes.db = db;
- imapServer.notes.tls = certs;
- imapServer.notes.delimiter = '/';
  // port 143
  var net = require('net');
  net.createServer(imapServer).listen(process.env.IMAP_PORT || 143);
  // port 993
  var tls = require('tls');
  tls.createServer(certs, imapServer).listen(process.env.IMAPS_PORT || 993);

Making the resulting API:

var fs = require('fs');

// SSL
var certs = {
    key: fs.readFileSync('./ssl/key.pem'),
    cert: fs.readFileSync('./ssl/cert.pem')
};

// Database
var mongoose = require('mongoose');
require('mongoose-schema-extend');
var db = mongoose.createConnection(process.env.MONGODB);
require('./models')(db);

// Imap server
var ImapServer = require('imap-server');
var imapPlugins = require('imap-server/plugins');
var imapServer = ImapServer({db: db, tls: certs, delimiter: '/'});
imapServer.use(imapPlugins.debug);
imapServer.use(imapPlugins.announce);
imapServer.use(imapPlugins.starttls);
imapServer.use(require('./plugins/imap/auth.js'));
imapServer.use(require('./plugins/imap/list.js'));
imapServer.use(require('./plugins/imap/select.js'));
// port 143
var net = require('net');
net.createServer(imapServer).listen(process.env.IMAP_PORT || 143);
// port 993
var tls = require('tls');
tls.createServer(certs, imapServer).listen(process.env.IMAPS_PORT || 993);

I also think some plugins may be needed every time so could be included by default (but manually override-able). This would make it a little simpler to set up.

In any case I'll add you as a maintainer on the @hashmail and if you get any time to hack on things that would be awesome.

JeanSebTr commented 11 years ago

Great, I'll check that !