#ifndef __POP3Command_h__ # define __POP3Command_h__ # include "Command.h" # include "POP3Session.h" namespace mail { class POP3Server; // RFC 1939 3: POP3 message numbers are 1-based positions in the // maildrop's fixed-for-the-session ordering - session.mailbox's own // ascending-by-UID message list, loaded once at PASS and never // reloaded mid-session, already IS that fixed ordering, so message // number N is simply session.mailbox.messages()[N-1]. Returns // nullptr for an out-of-range number OR a number already marked // \Deleted this session (RFC 1939 3: "the POP3 server MUST NOT" let // a deleted message be referenced by any command). MailFolder::Message *pop3FindMessage(POP3Session &session, int msgNum); // Shared by RETR and TOP - RFC 1939 3's byte-stuffing rule (any line // starting with "." gets an extra "." prepended, same transparency // rule as SMTP DATA, RFC 5321 4.5.2) applies to both, and TOP is // otherwise identical to RETR except it stops after maxBodyLines // lines of body (headers and the header/body blank line always go // out in full either way). maxBodyLines < 0 means unlimited (RETR's // own call site). void pop3SendMessage(POP3Session &session, const std::string &content, int maxBodyLines); class POP3Command : public core::Command { public: virtual int processCommand(coreutils::ZString &request, core::TCPSession &session) override; virtual int processCommand(coreutils::ZString request, POP3Session &session, POP3Server &server); }; } #endif