public Pop3Connection(Pop3Handler handler, Socket socket) throws IOException { configureSocket(socket); configureStreams(); this.handler = handler; }
@Override public void execute(Pop3Connection conn, Pop3State state, String cmd) { try { MailFolder folder = state.getFolder(); if (folder != null) { folder.expunge(); } conn.println("+OK bye see you soon"); conn.quit(); } catch (FolderException me) { conn.println("+OK Signing off, but message deletion failed"); conn.quit(); } } }
@Override public void run() { try { conn = new Pop3Connection(this, socket); state = new Pop3State(manager); quitting = false; sendGreetings(); while (!quitting) { handleCommand(); } conn.close(); } catch (SocketTimeoutException ste) { conn.println("421 Service shutting down and closing transmission channel"); } catch (Exception e) { } finally { try { socket.close(); } catch (IOException ioe) { } } }
@Override public void execute(Pop3Connection conn, Pop3State state, String cmd) { try { MailFolder inbox = state.getFolder(); String[] cmdLine = cmd.split(" "); String msgNumStr = cmdLine[1]; List<StoredMessage> msgList = inbox.getMessages(new MsgRangeFilter(msgNumStr, false)); if (msgList.size() != 1) { conn.println("-ERR no such message"); return; } StoredMessage msg = msgList.get(0); String email = GreenMailUtil.getWholeMessage(msg.getMimeMessage()); conn.println("+OK"); conn.print(new StringReader(email)); conn.println(); conn.println("."); msg.setFlag(Flags.Flag.SEEN, true); } catch (Exception e) { conn.println("-ERR " + e); } } }
void handleCommand() throws IOException { currentLine = conn.readLine(); if (currentLine == null) { close(); return; } String commandName = new StringTokenizer(currentLine, " ").nextToken() .toUpperCase(); Pop3Command command = registry.getCommand(commandName); if (command == null) { conn.println("-ERR Command not recognized"); return; } if (!command.isValidForState(state)) { conn.println("-ERR Command not valid for this state"); return; } command.execute(conn, state, currentLine); }
@Override public void execute(Pop3Connection conn, Pop3State state, String cmd) { conn.println("+OK noop rimes with poop"); } }
@Override public void execute(Pop3Connection conn, Pop3State state, String cmd) { conn.println("-ERR APOP not supported"); /* try { String[] arguments = cmd.split(" "); String username = arguments[1]; state.setUser(state.getUser(username)); conn.send("+OK"); } catch (MailboxException me) { getLogger().warn("APOP exception", me); conn.send("-ERR " + me); } catch (UserException nsue) { getLogger().warn("APOP exception", nsue); conn.send("-ERR " + nsue); } */ } }
void copyLines(BufferedReader in, Pop3Connection conn, int numLines) throws IOException { int count = 0; String line; while ((line = in.readLine()) != null && count < numLines) { conn.println(line); count++; } } }
void copyHeaders(BufferedReader in, Pop3Connection conn) throws IOException { String line; while ((line = in.readLine()) != null) { conn.println(line); if ("".equals(line)) break; } }
public void println(String line) { log.debug("S: {}", line); out.print(line); println(); }
@Override public void execute(Pop3Connection conn, Pop3State state, String cmd) { try { String[] args = cmd.split(" "); if (args.length < 2) { conn.println("-ERR Required syntax: USER <username>"); return; } String username = args[1]; state.setUser(state.getUser(username)); conn.println("+OK"); } catch (UserException nsue) { conn.println("-ERR " + nsue); } } }
@Override public void execute(Pop3Connection conn, Pop3State state, String cmd) { GreenMailUser user = state.getUser(); if (user == null) { conn.println("-ERR USER required"); return; } String[] args = cmd.split(" "); if (args.length < 2) { conn.println("-ERR Required syntax: PASS <username>"); return; } try { String pass = args[1]; state.authenticate(pass); conn.println("+OK"); } catch (Exception e) { conn.println("-ERR Authentication failed: " + e); } } }
void sendGreetings() { conn.println("+OK POP3 GreenMail Server v" + BuildInfo.INSTANCE.getProjectVersion() + " ready"); }
@Override public void execute(Pop3Connection conn, Pop3State state, String cmd) { try { MailFolder inbox = state.getFolder(); List<StoredMessage> messages = inbox.getNonDeletedMessages(); long size = sumMessageSizes(messages); conn.println("+OK " + messages.size() + " " + size); } catch (Exception me) { conn.println("-ERR " + me); } }
@Override public void execute(Pop3Connection conn, Pop3State state, String cmd) { try { MailFolder inbox = state.getFolder(); String[] cmdLine = cmd.split(" "); String msgNumStr = cmdLine[1]; List<StoredMessage> msgList = inbox.getMessages(new MsgRangeFilter(msgNumStr, false)); if (msgList.size() != 1) { conn.println("-ERR no such message"); return; } StoredMessage msg = msgList.get(0); if (msg.isSet(Flags.Flag.DELETED)) { conn.println("-ERR message already deleted"); return; } msg.setFlag(Flags.Flag.DELETED, true); conn.println("+OK message scheduled for deletion"); } catch (Exception e) { conn.println("-ERR " + e); } } }
@Override public void execute(Pop3Connection conn, Pop3State state, String cmd) { conn.println("+OK"); try { MailFolder inbox = state.getFolder(); List<StoredMessage> msgList = inbox.getMessages(); int count = 0; for (StoredMessage msg : msgList) { if (msg.isSet(Flags.Flag.DELETED)) { count++; msg.setFlag(Flags.Flag.DELETED, false); } } conn.println("+OK maildrop has "+count+" messages undeleted."); } catch (Exception e) { conn.println("-ERR " + e); } } }
List<StoredMessage> msgList = inbox.getMessages(new MsgRangeFilter(msgNumStr, false)); if (msgList.size() != 1) { conn.println("-ERR no such message"); conn.println("+OK " + msgNumStr + " " + msg.getUid()); } else { messages = inbox.getNonDeletedMessages(); conn.println("+OK"); for (StoredMessage msg : messages) { conn.println(inbox.getMsn(msg.getUid()) + " " + msg.getUid()); conn.println("."); conn.println("-ERR " + me);
@Override public void execute(Pop3Connection conn, Pop3State state, String cmd) { try { MailFolder inbox = state.getFolder(); String[] cmdLine = cmd.split(" "); if (cmdLine.length < 3) throw new IllegalArgumentException("range and line count required"); String msgNumStr = cmdLine[1]; List<StoredMessage> msgList = inbox.getMessages(new MsgRangeFilter(msgNumStr, false)); if (msgList.size() != 1) { conn.println("-ERR no such message"); return; } StoredMessage msg = msgList.get(0); int numLines = Integer.parseInt(cmdLine[2]); try (BufferedReader in = new BufferedReader( new StringReader(GreenMailUtil.getWholeMessage(msg.getMimeMessage())))) { conn.println("+OK"); copyHeaders(in, conn); copyLines(in, conn, numLines); } conn.println("."); } catch (Exception e) { conn.println("-ERR " + e); } }
List<StoredMessage> msgList = inbox.getMessages(new MsgRangeFilter(msgNumStr, false)); if (msgList.size() != 1) { conn.println("-ERR no such message"); conn.println("+OK " + msgNumStr + " " + msg.getMimeMessage().getSize()); } else { List<StoredMessage> messages = inbox.getNonDeletedMessages(); conn.println("+OK"); for (StoredMessage msg : messages) { conn.println(inbox.getMsn(msg.getUid()) + " " + msg.getMimeMessage().getSize()); conn.println("."); conn.println("-ERR " + me);