Pascal Peridont 17 years ago
parent
commit
ddc25a294b
1 changed files with 95 additions and 0 deletions
  1. 95 0
      std/mtwin/mail/Pop.hx

+ 95 - 0
std/mtwin/mail/Pop.hx

@@ -0,0 +1,95 @@
+package mtwin.mail;
+
+class Pop {
+	var host : String;
+	var user : String;
+	var pass : String;
+	var port : Int;
+
+	var sock : neko.net.Socket;
+
+	public function new( host : String, user : String, pass : String, ?port : Int ){
+		this.host = host;
+		this.user = user;
+		this.pass = pass;
+		this.port = port == null ? 110 : port;
+	}
+	
+	private function connect(){
+		if( sock == null ){
+			var s = new neko.net.Socket();
+			s.setTimeout(1);
+			s.connect(new neko.net.Host(host),port);
+			
+			// get server init line
+			s.input.readLine();
+
+			s.output.write("USER "+user+"\n");
+			var ret = s.input.readLine();
+			if( ret.substr(0,3) != "+OK" ) throw "Pop USER failed: "+ret;
+
+			s.output.write("PASS "+pass+"\n");
+			var ret = s.input.readLine();
+			if( ret.substr(0,3) != "+OK" ) throw "Pop PASS failed: "+ret;
+
+			sock = s;
+		}
+		return sock;
+	}
+
+	public function close(){
+		if( sock != null ){
+			sock.output.write("QUIT\n");
+			var ret = sock.input.readLine();
+			if( ret.substr(0,3) != "+OK" ) throw "Pop QUIT failed: "+ret;
+			sock.close();
+			sock = null;
+		}
+	}
+
+	static var REG_SCAN_LIST = ~/([0-9]+) ([0-9]+)/;
+	public function list() : List<{id: Int,size: Int}> {
+		var cnx = connect();
+
+		cnx.output.write("LIST\n");
+		var ret = new List();
+		var t : String;
+		do {
+			t = StringTools.trim(cnx.input.readLine());
+			if( REG_SCAN_LIST.match(t) )
+				ret.add({
+					id: Std.parseInt(REG_SCAN_LIST.matched(1)),
+					size: Std.parseInt(REG_SCAN_LIST.matched(2))
+				});
+		}while( t != null && t != ".");
+		return ret;
+	}
+
+	public function getMessage( id : Int ){
+		var cnx = connect();
+
+		cnx.output.write("RETR "+id+"\n");
+		var r = cnx.input.readLine();
+		if( r.substr(0,3) != "+OK" ) throw "Pop RETR failed: "+r;
+
+		var ret = new StringBuf();
+		do {
+			var l = StringTools.rtrim(cnx.input.readLine());
+			if( l == "." )
+				break;
+			if( l.substr(0,2) == ".." )
+				l = l.substr(1);
+			ret.add(l);
+			ret.add("\r\n");
+		}while( true );
+		return ret.toString().substr(0,-2);
+	}
+
+	public function delete( id : Int ){
+		var cnx = connect();
+
+		cnx.output.write("DELE "+id+"\n");
+		var r = cnx.input.readLine();
+		if( r.substr(0,3) != "+OK" ) throw "Pop DELE failed: "+r;
+	}
+}