Add IMAP server func
This commit is contained in:
parent
c5bd42ece7
commit
d78fbf730e
24
imap/index.js
Normal file
24
imap/index.js
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
const net = require("net");
|
||||||
|
const imap = require("./logic");
|
||||||
|
//const EventEmitter = require("events");
|
||||||
|
|
||||||
|
const server = net.createServer((socket) => {
|
||||||
|
const client = new imap.Client(socket);
|
||||||
|
socket.write("* OK IMAP4rev1 NodeIMAP Ready\r\n");
|
||||||
|
|
||||||
|
let state = "not_authenticated";
|
||||||
|
let currentMailbox = null;
|
||||||
|
//let tag = "";
|
||||||
|
|
||||||
|
socket.on("data", (data) => {
|
||||||
|
const line = data.toString().trim();
|
||||||
|
console.debug("IMAP data:", line);
|
||||||
|
const splitted = line.split(/\s{1,}/g);
|
||||||
|
if (splitted.length < 2) return socket.write(". BAD unknown command\r\n");
|
||||||
|
const [tag, command, ...args] = splitted;
|
||||||
|
|
||||||
|
client.command(tag, command, args);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
module.exports = server;
|
56
imap/logic.js
Normal file
56
imap/logic.js
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
class IMAPController {
|
||||||
|
constructor (socket, tag) {
|
||||||
|
this.socket = socket;
|
||||||
|
this.tag = tag;
|
||||||
|
}
|
||||||
|
|
||||||
|
out (answer) {
|
||||||
|
this.socket.write(`${this.tag} ${answer}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
untaggedOut (answer) {
|
||||||
|
this.socket.write(answer);
|
||||||
|
}
|
||||||
|
|
||||||
|
close () {
|
||||||
|
this.socket.end();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class Commands {
|
||||||
|
constructor (client) {
|
||||||
|
this.client = client;
|
||||||
|
}
|
||||||
|
|
||||||
|
async capability (args, controller) {
|
||||||
|
/*if (args.length > 0)
|
||||||
|
return out();*/
|
||||||
|
controller.untaggedOut("* CAPABILITY IMAP4rev1 STARTTLS LOGINDISABLED\r\n");
|
||||||
|
controller.out("OK CAPABILITY completed\r\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
async logout(args, controller) {
|
||||||
|
controller.untaggedOut("* BYE Logging out\r\n");
|
||||||
|
controller.out("OK LOGOUT completed\r\n");
|
||||||
|
|
||||||
|
controller.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class Client {
|
||||||
|
constructor (socket) {
|
||||||
|
this.socket = socket;
|
||||||
|
this.commands = new Commands(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
command (tag, command, args) {
|
||||||
|
//console.debug("this >>", this, this.socket, this.commands);
|
||||||
|
const cmd = this.commands[command.toLowerCase()];
|
||||||
|
if (cmd === undefined) {
|
||||||
|
return this.socket.write(`${tag} BAD unknown command\r\n`);
|
||||||
|
}
|
||||||
|
cmd.call(this.commands, args, new IMAPController(this.socket, tag));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = { Client };
|
15
server.js
15
server.js
@ -3,6 +3,8 @@ const fs = require("fs");
|
|||||||
const net = require('net');
|
const net = require('net');
|
||||||
const { EventEmitter } = require("events");
|
const { EventEmitter } = require("events");
|
||||||
|
|
||||||
|
const imap = require("./imap");
|
||||||
|
|
||||||
const initalConfig = `{
|
const initalConfig = `{
|
||||||
"pop3-config": {
|
"pop3-config": {
|
||||||
"user": "example",
|
"user": "example",
|
||||||
@ -55,3 +57,16 @@ pop3.init().then(() => {
|
|||||||
//console.log(str);
|
//console.log(str);
|
||||||
}, 1);
|
}, 1);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
imap.listen(
|
||||||
|
global.config["imap-config"].port,
|
||||||
|
global.config["imap-config"].host,
|
||||||
|
(err) => {
|
||||||
|
if (err) throw err;
|
||||||
|
console.log(`IMAP server running on ${
|
||||||
|
global.config["imap-config"].host
|
||||||
|
}:${
|
||||||
|
global.config["imap-config"].port
|
||||||
|
}`);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
Loading…
Reference in New Issue
Block a user