based on reworked servercore.

This commit is contained in:
Brad Arant 2020-02-29 19:25:13 -08:00
parent 50eb707f10
commit db3e82a18e
1698 changed files with 41157 additions and 797 deletions

BIN
BMAMail Executable file

Binary file not shown.

View File

@ -1,127 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<CodeLite_Project Name="BMAMail" Version="10.0.0" InternalType="Console">
<Description/>
<Dependencies/>
<VirtualDirectory Name="src">
<File Name="main.cpp"/>
<File Name="./BMAIMAPServer.h"/>
<File Name="./BMAIMAPSession.h"/>
<File Name="./BMAPOP3Server.h"/>
<File Name="./BMAPOP3Session.h"/>
<File Name="./BMASMTPServer.h"/>
<File Name="./BMASMTPSession.h"/>
<File Name="__SMTP_HELO.h"/>
<File Name="__SMTP_EHLO.h"/>
<File Name="__SMTP_AUTH.h"/>
<File Name="__SMTP_MAIL.h"/>
<File Name="__SMTP_RCPT.h"/>
<File Name="__SMTP_DATA.h"/>
<File Name="__SMTP_RSET.h"/>
<File Name="__SMTP_VRFY.h"/>
<File Name="__SMTP_NOOP.h"/>
<File Name="__SMTP_QUIT.h"/>
<File Name="SMTPService.h"/>
<File Name="SMTPSession.h"/>
<File Name="POP3Service.h"/>
<File Name="IMAPService.h"/>
</VirtualDirectory>
<Dependencies Name="Debug"/>
<Dependencies Name="Release"/>
<Settings Type="Executable">
<GlobalSettings>
<Compiler Options="" C_Options="" Assembler="">
<IncludePath Value="."/>
</Compiler>
<Linker Options="">
<LibraryPath Value="."/>
</Linker>
<ResourceCompiler Options=""/>
</GlobalSettings>
<Configuration Name="Debug" CompilerType="GCC" DebuggerType="GNU gdb debugger" Type="Executable" BuildCmpWithGlobalSettings="append" BuildLnkWithGlobalSettings="append" BuildResWithGlobalSettings="append">
<Compiler Options="-g;-O0;-Wall" C_Options="-g;-O0;-Wall" Assembler="" Required="yes" PreCompiledHeader="" PCHInCommandLine="no" PCHFlags="" PCHFlagsPolicy="0">
<IncludePath Value="."/>
<IncludePath Value="../ServerCore"/>
<IncludePath Value="../BMAMySQL"/>
</Compiler>
<Linker Options="" Required="yes">
<LibraryPath Value="../Debug/ServerCore"/>
<LibraryPath Value="../Debug/BMAMySQL"/>
<Library Value="ServerCore"/>
<Library Value="BMAMySQL"/>
</Linker>
<ResourceCompiler Options="" Required="no"/>
<General OutputFile="$(IntermediateDirectory)/$(ProjectName)" IntermediateDirectory="./Debug" Command="./$(ProjectName)" CommandArguments="" UseSeparateDebugArgs="no" DebugArguments="" WorkingDirectory="$(IntermediateDirectory)" PauseExecWhenProcTerminates="yes" IsGUIProgram="no" IsEnabled="yes"/>
<BuildSystem Name="Default"/>
<Environment EnvVarSetName="&lt;Use Defaults&gt;" DbgSetName="&lt;Use Defaults&gt;">
<![CDATA[]]>
</Environment>
<Debugger IsRemote="no" RemoteHostName="" RemoteHostPort="" DebuggerPath="" IsExtended="no">
<DebuggerSearchPaths/>
<PostConnectCommands/>
<StartupCommands/>
</Debugger>
<PreBuild/>
<PostBuild/>
<CustomBuild Enabled="no">
<RebuildCommand/>
<CleanCommand/>
<BuildCommand/>
<PreprocessFileCommand/>
<SingleFileCommand/>
<MakefileGenerationCommand/>
<ThirdPartyToolName>None</ThirdPartyToolName>
<WorkingDirectory/>
</CustomBuild>
<AdditionalRules>
<CustomPostBuild/>
<CustomPreBuild/>
</AdditionalRules>
<Completion EnableCpp11="no" EnableCpp14="no">
<ClangCmpFlagsC/>
<ClangCmpFlags/>
<ClangPP/>
<SearchPaths/>
</Completion>
</Configuration>
<Configuration Name="Release" CompilerType="GCC" DebuggerType="GNU gdb debugger" Type="Executable" BuildCmpWithGlobalSettings="append" BuildLnkWithGlobalSettings="append" BuildResWithGlobalSettings="append">
<Compiler Options="-O2;-Wall" C_Options="-O2;-Wall" Assembler="" Required="yes" PreCompiledHeader="" PCHInCommandLine="no" PCHFlags="" PCHFlagsPolicy="0">
<IncludePath Value="."/>
<Preprocessor Value="NDEBUG"/>
</Compiler>
<Linker Options="" Required="yes"/>
<ResourceCompiler Options="" Required="no"/>
<General OutputFile="$(IntermediateDirectory)/$(ProjectName)" IntermediateDirectory="./Release" Command="./$(ProjectName)" CommandArguments="" UseSeparateDebugArgs="no" DebugArguments="" WorkingDirectory="$(IntermediateDirectory)" PauseExecWhenProcTerminates="yes" IsGUIProgram="no" IsEnabled="yes"/>
<BuildSystem Name="Default"/>
<Environment EnvVarSetName="&lt;Use Defaults&gt;" DbgSetName="&lt;Use Defaults&gt;">
<![CDATA[]]>
</Environment>
<Debugger IsRemote="no" RemoteHostName="" RemoteHostPort="" DebuggerPath="" IsExtended="no">
<DebuggerSearchPaths/>
<PostConnectCommands/>
<StartupCommands/>
</Debugger>
<PreBuild/>
<PostBuild/>
<CustomBuild Enabled="no">
<RebuildCommand/>
<CleanCommand/>
<BuildCommand/>
<PreprocessFileCommand/>
<SingleFileCommand/>
<MakefileGenerationCommand/>
<ThirdPartyToolName>None</ThirdPartyToolName>
<WorkingDirectory/>
</CustomBuild>
<AdditionalRules>
<CustomPostBuild/>
<CustomPreBuild/>
</AdditionalRules>
<Completion EnableCpp11="no" EnableCpp14="no">
<ClangCmpFlagsC/>
<ClangCmpFlags/>
<ClangPP/>
<SearchPaths/>
</Completion>
</Configuration>
</Settings>
</CodeLite_Project>

View File

@ -1 +0,0 @@
./Debug/main.cpp.o

24
IMAPCommand.h Normal file
View File

@ -0,0 +1,24 @@
#ifndef __IMAPCommand_h__
# define __IMAPCommand_h__
# include "Command.h"
# include "TCPSession.h"
# include "IMAPSession.h"
namespace mail {
class IMAPCommand : public core::Command {
public:
virtual int processCommand(std::string request, core::TCPSession *session, std::stringstream &data) override {
coreutils::PString parser(request);
return processCommand(parser, (IMAPSession &)*session, data);
}
virtual int processCommand(coreutils::PString request, IMAPSession &session, std::stringstream &data) {}
};
}
#endif

View File

@ -1,48 +1,88 @@
#ifndef __IMAPService_h__ #ifndef __IMAPService_h__
#define __IMAPService_h__ #define __IMAPService_h__
#include "Service.h" #include "TCPServer.h"
#include "Exception.h" #include "Exception.h"
#include "__SMTP_AUTH.h" #include "__IMAP_APPEND.h"
#include "__SMTP_DATA.h" #include "__IMAP_AUTHENTICATE.h"
#include "__SMTP_EHLO.h" #include "__IMAP_CHECK.h"
#include "__SMTP_HELO.h" #include "__IMAP_CLOSE.h"
#include "__SMTP_MAIL.h" #include "__IMAP_COPY.h"
#include "__SMTP_NOOP.h" #include "__IMAP_CREATE.h"
#include "__SMTP_QUIT.h" #include "__IMAP_DELETE.h"
#include "__SMTP_RCPT.h" #include "__IMAP_EXAMINE.h"
#include "__SMTP_RSET.h" #include "__IMAP_EXPUNGE.h"
#include "__SMTP_VRFY.h" #include "__IMAP_FETCH.h"
#include "__IMAP_LIST.h"
#include "__IMAP_LOGIN.h"
#include "__IMAP_LSUB.h"
#include "__IMAP_RENAME.h"
#include "__IMAP_SEARCH.h"
#include "__IMAP_SELECT.h"
#include "__IMAP_STARTTLS.h"
#include "__IMAP_STATUS.h"
#include "__IMAP_STORE.h"
#include "__IMAP_SUBSCRIBE.h"
#include "__IMAP_UID.h"
#include "__IMAP_UNSUBSCRIBE.h"
namespace mail { namespace mail {
class IMAPService : public core::Service { class IMAPService : public core::TCPServer {
public: public:
IMAPService() { IMAPService(core::EPoll &epoll, std::string hostName, std::string mailPath, core::IPAddress ipAddress)
commands.add(_smtp_auth, "AUTH"); : TCPServer(epoll, ipAddress), mailFileSystem(mailPath), hostName(hostName) {
commands.add(_smtp_data, "DATA"); commands.add(_imap_append, "APPEND");
commands.add(_smtp_ehlo, "EHLO"); commands.add(_imap_authenticate, "AUTHENTCATE");
commands.add(_smtp_helo, "HELO"); commands.add(_imap_check, "CHECK");
commands.add(_smtp_mail, "MAIL"); commands.add(_imap_close, "CLOSE");
commands.add(_smtp_noop, "NOOP"); commands.add(_imap_copy, "COPY");
commands.add(_smtp_quit, "QUIT"); commands.add(_imap_create, "CREATE");
commands.add(_smtp_rcpt, "RCPT"); commands.add(_imap_delete, "DELETE");
commands.add(_smtp_rset, "RSET"); commands.add(_imap_examine, "EXAAMINE");
commands.add(_smtp_vrfy, "VRFY"); commands.add(_imap_expunge, "EXPUNGE");
commands.add(_imap_fetch, "FETCH");
commands.add(_imap_list, "LIST");
commands.add(_imap_login, "LOGIN");
commands.add(_imap_lsub, "LSUB");
commands.add(_imap_rename, "RENAME");
commands.add(_imap_search, "SEARCH");
commands.add(_imap_select, "SELECT");
commands.add(_imap_starttls, "STARTTLS");
commands.add(_imap_status, "STATUS");
commands.add(_imap_store, "STORE");
commands.add(_imap_subscribe, "SUBSCRIBE");
commands.add(_imap_uid, "UID");
commands.add(_imap_unsubscribe, "UNSUBSCRIBE");
} }
MailFileSystem mailFileSystem;
std::string hostName;
private: private:
__SMTP_AUTH _smtp_auth; __IMAP_APPEND _imap_append;
__SMTP_DATA _smtp_data; __IMAP_AUTHENTICATE _imap_authenticate;
__SMTP_EHLO _smtp_ehlo; __IMAP_CHECK _imap_check;
__SMTP_HELO _smtp_helo; __IMAP_CLOSE _imap_close;
__SMTP_MAIL _smtp_mail; __IMAP_COPY _imap_copy;
__SMTP_NOOP _smtp_noop; __IMAP_CREATE _imap_create;
__SMTP_QUIT _smtp_quit; __IMAP_DELETE _imap_delete;
__SMTP_RCPT _smtp_rcpt; __IMAP_EXAMINE _imap_examine;
__SMTP_RSET _smtp_rset; __IMAP_EXPUNGE _imap_expunge;
__SMTP_VRFY _smtp_vrfy; __IMAP_FETCH _imap_fetch;
__IMAP_LIST _imap_list;
__IMAP_LOGIN _imap_login;
__IMAP_LSUB _imap_lsub;
__IMAP_RENAME _imap_rename;
__IMAP_SEARCH _imap_search;
__IMAP_SELECT _imap_select;
__IMAP_STARTTLS _imap_starttls;
__IMAP_STATUS _imap_status;
__IMAP_STORE _imap_store;
__IMAP_SUBSCRIBE _imap_subscribe;
__IMAP_UID _imap_uid;
__IMAP_UNSUBSCRIBE _imap_unsubscribe;
}; };

21
IMAPSession.h Normal file
View File

@ -0,0 +1,21 @@
#ifndef __IMAPSession_h__
#define __IMAPSession_h__
namespace mail {
class IMAPSession : public core::TCPSession {
public:
std::string clientDomainName;
std::string userName;
std::string password;
AuthState authstate = USER_UNKNOWN;
bool relay = false;
};
}
#endif

58
MailDelivery.cpp2 Normal file
View File

@ -0,0 +1,58 @@
#include "MailDelivery.h"
#include "Directory.h"
#include "time.h"
namespace mail {
MailDelivery::MailDelivery(core::EPoll &ePoll, std::string mailQueue) : INotify(ePoll) {
addWatch(mailQueue);
startDelivery(mailQueue);
}
void MailDelivery::onDataReceived(std::string data) {
// TODO: Receive file and parse email name.
// TODO: Compare time to named time and if time has passed then send the message
// TODO: If email is a local mailbox then make a hard link to the mail message in the appropriate Inbox. Remove entry from queue.
// TODO: If email is a remote mailbox then perform remote send algorithm.
// TODO: If error sending on remote then calculate next send attempt time and rename file to reflect new time.
// TODO: If date is on the future then set a timer to that time and wait.
}
int MailDelivery::startDelivery(std::string mailQueue) {
coreutils::Directory mailDir(mailQueue);
std::string entryName = mailDir.get().getName();
std::string now = getMailFileName();
// if(now > entryName) {
// std::string recipientName = coreutils::File(); // read recipient name
// if(isLocal(recipientName)) {
// link(existing, new);
// } else {
// open connect socket to mx.domain
// if error
// calculate future date name and rename mail data
// else
// write smtp data on socket 25
//
// }
// }
}
int MailDelivery::deliver() {
}
std::string MailDelivery::getMailFileName() {
char fileName[64];
time_t gtime;
time(&gtime);
struct tm *timex;
timex = gmtime(&gtime);
strftime(fileName, 64, "%Y%m%d%H%M%S", gmtime(&gtime));
return std::string(fileName);
}
}

24
MailDelivery.h2 Normal file
View File

@ -0,0 +1,24 @@
#ifndef __MailDelivery_h__
# define __MailDelivery_h__
# include "INotify.h"
# include "EPoll.h"
namespace mail {
class MailDelivery : core::INotify {
public:
MailDelivery(core::EPoll &ePoll, std::string mailQueue);
void onDataReceived(std::string data) override;
int startDelivery(std::string mailQueue);
int deliver();
std::string getMailFileName();
};
}
#endif

52
MailFileSystem.h Normal file
View File

@ -0,0 +1,52 @@
#ifndef __MailFileSystem_h__
# define __MailFileSystem_h__
# include <sys/types.h>
# include <sys/stat.h>
# include <unistd.h>
# include "EPoll.h"
# include "INotify.h"
namespace mail {
class MailFileSystem {
public:
MailFileSystem(std::string mailPath) : mailPath(mailPath) {}
bool ifMailBoxExists(std::string mailbox) {
if(stat(getMailBoxPath(mailbox).c_str(), &statbuf) != -1)
if(S_ISDIR(statbuf.st_mode))
return true;
return false;
}
bool ifAliasExists(std::string alias) {
if(stat(getMailBoxPath(alias).c_str(), &statbuf) != -1)
if(S_ISREG(statbuf.st_mode))
return true;
return false;
}
std::string getMailBoxPath(std::string mailbox) {
coreutils::PString email(mailbox);
email.split("@");
std::string path = mailPath + "/" + email[1].str() + "/" + email[0].str();
return path;
}
std::vector<std::string> getAliasMailboxes(std::string alias);
std::string getMailPath() {
return mailPath;
}
private:
std::string mailPath;
struct stat statbuf;
};
}
#endif

24
POP3Command.h Normal file
View File

@ -0,0 +1,24 @@
#ifndef __POP3Command_h__
# define __POP3Command_h__
# include "Command.h"
# include "TCPSession.h"
# include "POP3Session.h"
namespace mail {
class POP3Command : public core::Command {
public:
virtual int processCommand(std::string request, core::TCPSession *session, std::stringstream &data) override {
coreutils::PString parser(request);
return processCommand(parser, (POP3Session &)*session, data);
}
virtual int processCommand(coreutils::PString request, POP3Session &session, std::stringstream &data) {}
};
}
#endif

View File

@ -1,48 +1,58 @@
#ifndef __POP3Service_h__ #ifndef __POP3Service_h__
#define __POP3Service_h__ #define __POP3Service_h__
#include "Service.h" #include "TCPServer.h"
#include "Exception.h" #include "Exception.h"
#include "__SMTP_AUTH.h" #include "__POP3_DELE.h"
#include "__SMTP_DATA.h" #include "__POP3_LAST.h"
#include "__SMTP_EHLO.h" #include "__POP3_LIST.h"
#include "__SMTP_HELO.h" #include "__POP3_NOOP.h"
#include "__SMTP_MAIL.h" #include "__POP3_PASS.h"
#include "__SMTP_NOOP.h" #include "__POP3_QUIT.h"
#include "__SMTP_QUIT.h" #include "__POP3_RETR.h"
#include "__SMTP_RCPT.h" #include "__POP3_RPOP.h"
#include "__SMTP_RSET.h" #include "__POP3_RSET.h"
#include "__SMTP_VRFY.h" #include "__POP3_STAT.h"
#include "__POP3_TOP.h"
#include "__POP3_USER.h"
namespace mail { namespace mail {
class POP3Service : public core::Service { class POP3Service : public core::TCPServer {
public: public:
POP3Service() { POP3Service(core::EPoll &epoll, std::string hostName, std::string mailPath, core::IPAddress ipAddress)
commands.add(_smtp_auth, "AUTH"); : TCPServer(epoll, ipAddress), mailFileSystem(mailPath), hostName(hostName) {
commands.add(_smtp_data, "DATA"); commands.add(_pop3_dele, "DELE");
commands.add(_smtp_ehlo, "EHLO"); commands.add(_pop3_last, "LAST");
commands.add(_smtp_helo, "HELO"); commands.add(_pop3_list, "LIST");
commands.add(_smtp_mail, "MAIL"); commands.add(_pop3_noop, "NOOP");
commands.add(_smtp_noop, "NOOP"); commands.add(_pop3_pass, "PASS");
commands.add(_smtp_quit, "QUIT"); commands.add(_pop3_quit, "QUIT");
commands.add(_smtp_rcpt, "RCPT"); commands.add(_pop3_retr, "RETR");
commands.add(_smtp_rset, "RSET"); commands.add(_pop3_rpop, "RPOP");
commands.add(_smtp_vrfy, "VRFY"); commands.add(_pop3_rset, "RSET");
commands.add(_pop3_stat, "STAT");
commands.add(_pop3_top, "TOP");
commands.add(_pop3_user, "USER");
} }
MailFileSystem mailFileSystem;
std::string hostName;
private: private:
__SMTP_AUTH _smtp_auth; __POP3_DELE _pop3_dele;
__SMTP_DATA _smtp_data; __POP3_LAST _pop3_last;
__SMTP_EHLO _smtp_ehlo; __POP3_LIST _pop3_list;
__SMTP_HELO _smtp_helo; __POP3_NOOP _pop3_noop;
__SMTP_MAIL _smtp_mail; __POP3_PASS _pop3_pass;
__SMTP_NOOP _smtp_noop; __POP3_QUIT _pop3_quit;
__SMTP_QUIT _smtp_quit; __POP3_RETR _pop3_retr;
__SMTP_RCPT _smtp_rcpt; __POP3_RPOP _pop3_rpop;
__SMTP_RSET _smtp_rset; __POP3_RSET _pop3_rset;
__SMTP_VRFY _smtp_vrfy; __POP3_STAT _pop3_stat;
__POP3_TOP _pop3_top;
__POP3_USER _pop3_user;
}; };

20
POP3Session.h Normal file
View File

@ -0,0 +1,20 @@
#ifndef __POP3Session_h__
#define __POP3Session_h__
namespace mail {
class POP3Session : public core::TCPSession {
public:
std::string clientDomainName;
std::string userName;
std::string password;
AuthState authstate = USER_UNKNOWN;
bool relay = false;
};
}
#endif

15
SMTPCommand.cpp Normal file
View File

@ -0,0 +1,15 @@
# include "Command.h"
# include "SMTPSession.h"
# include "SMTPServer.h"
# include "Log.h"
namespace mail {
int SMTPCommand::processCommand(std::string request, core::TCPSession *session, std::stringstream &data) {
coreutils::PString parser(request);
parser.split(" ");
return processCommand(parser, (SMTPSession &)*session, (SMTPServer &)session->server, data);
}
}

21
SMTPCommand.h Normal file
View File

@ -0,0 +1,21 @@
#ifndef __SMTPCommand_h__
# define __SMTPCommand_h__
# include "Command.h"
# include "SMTPSession.h"
namespace mail {
class SMTPServer;
class SMTPCommand : public core::Command {
public:
virtual int processCommand(std::string request, core::TCPSession *session, std::stringstream &data) override;
virtual int processCommand(coreutils::PString request, SMTPSession &session, SMTPServer &server, std::stringstream &data) {}
};
}
#endif

91
SMTPServer.h Normal file
View File

@ -0,0 +1,91 @@
#ifndef __SMTPServer_h__
# define __SMTPServer_h__
# include <string>
# include "EPoll.h"
# include "TCPServer.h"
# include "SMTPSession.h"
# include "MailFileSystem.h"
# include "__SMTP_AUTH.h"
# include "__SMTP_DATA.h"
# include "__SMTP_EHLO.h"
# include "__SMTP_HELO.h"
# include "__SMTP_MAIL.h"
# include "__SMTP_NOOP.h"
# include "__SMTP_QUIT.h"
# include "__SMTP_RCPT.h"
# include "__SMTP_RSET.h"
# include "__SMTP_VRFY.h"
# include "INotify.h"
# include "Log.h"
namespace mail {
class SMTPServer : public core::TCPServer, public core::INotify {
public:
SMTPServer(core::EPoll &ePoll, std::string hostName, std::string mailPath, core::IPAddress ipAddress)
: core::TCPServer(ePoll, ipAddress, "SMTP Server"), core::INotify(ePoll), hostName(hostName), mailFileSystem(mailPath) {
this->mailPath = mailPath;
commands.add(_smtp_auth, "AUTH");
commands.add(_smtp_data, "DATA");
commands.add(_smtp_ehlo, "EHLO");
commands.add(_smtp_helo, "HELO");
commands.add(_smtp_mail, "MAIL");
commands.add(_smtp_noop, "NOOP");
commands.add(_smtp_quit, "QUIT");
commands.add(_smtp_rcpt, "RCPT");
commands.add(_smtp_rset, "RSET");
commands.add(_smtp_vrfy, "VRFY");
processExisting();
wd = addWatch(mailPath + "/.queue/");
}
MailFileSystem mailFileSystem;
std::string hostName;
std::string mailPath;
SMTPSession * getSocketAccept(core::EPoll &ePoll) override {
return new SMTPSession(ePoll, *this);
}
void sessionErrorHandler(std::string errorString, std::stringstream &out) {
out << "252 " << errorString << CRLF;
}
protected:
void inCreate(std::string name) {
int pos = name.find(".") + 10;
std::string mail = name.substr(0, pos);
std::string recipient = name.substr(pos);
if(recipient != "") {
std::string fileName = mailPath + "/.queue/" + name;
std::string path = mailFileSystem.getMailBoxPath(recipient) + "/Inbox/" + mail;
int rc = link(fileName.c_str(), path.c_str());
rc = unlink(fileName.c_str());
coreutils::Log(coreutils::LOG_INFO) << "Message " << mail << " delivered to " << recipient << ".";
}
}
private:
__SMTP_AUTH _smtp_auth;
__SMTP_DATA _smtp_data;
__SMTP_EHLO _smtp_ehlo;
__SMTP_HELO _smtp_helo;
__SMTP_MAIL _smtp_mail;
__SMTP_NOOP _smtp_noop;
__SMTP_QUIT _smtp_quit;
__SMTP_RCPT _smtp_rcpt;
__SMTP_RSET _smtp_rset;
__SMTP_VRFY _smtp_vrfy;
int wd;
void processExisting() {
}
};
}
#endif

View File

@ -1,51 +0,0 @@
#ifndef __SMTPService_h__
#define __SMTPService_h__
#include "Service.h"
#include "Exception.h"
#include "__SMTP_AUTH.h"
#include "__SMTP_DATA.h"
#include "__SMTP_EHLO.h"
#include "__SMTP_HELO.h"
#include "__SMTP_MAIL.h"
#include "__SMTP_NOOP.h"
#include "__SMTP_QUIT.h"
#include "__SMTP_RCPT.h"
#include "__SMTP_RSET.h"
#include "__SMTP_VRFY.h"
namespace mail {
class SMTPService : public core::Service {
public:
SMTPService() {
commands.add(_smtp_auth, "AUTH");
commands.add(_smtp_data, "DATA");
commands.add(_smtp_ehlo, "EHLO");
commands.add(_smtp_helo, "HELO");
commands.add(_smtp_mail, "MAIL");
commands.add(_smtp_noop, "NOOP");
commands.add(_smtp_quit, "QUIT");
commands.add(_smtp_rcpt, "RCPT");
commands.add(_smtp_rset, "RSET");
commands.add(_smtp_vrfy, "VRFY");
}
private:
__SMTP_AUTH _smtp_auth;
__SMTP_DATA _smtp_data;
__SMTP_EHLO _smtp_ehlo;
__SMTP_HELO _smtp_helo;
__SMTP_MAIL _smtp_mail;
__SMTP_NOOP _smtp_noop;
__SMTP_QUIT _smtp_quit;
__SMTP_RCPT _smtp_rcpt;
__SMTP_RSET _smtp_rset;
__SMTP_VRFY _smtp_vrfy;
};
}
#endif

View File

@ -1,14 +1,37 @@
#ifndef __SMTPSession_h__ #ifndef __SMTPSession_h__
#define __SMTPSession_h__ # define __SMTPSession_h__
#include "includes" # include "TCPSession.h"
# include "TCPServer.h"
# define CRLF "\r\n"
namespace mail { namespace mail {
class SMTPSession : public core::Session { enum State {CONNECT, READY, MAIL, RCPT, DATA};
enum AuthState {USER_UNKNOWN, USER_QUERY, USER_SECRET_QUERY, USER_KNOWN};
enum Mode {WAIT_FOR_DATA, RECEIVE_DATA};
class SMTPSession : public core::TCPSession {
public: public:
std::string state; SMTPSession(core::EPoll &ePoll, core::TCPServer &server)
: TCPSession(ePoll, server, "SMTP Client Session") {}
void onConnected(std::stringstream &out) {
out << "220 localhost BMAMail" << CRLF;
}
std::string clientDomainName;
std::string userName;
std::string password;
std::stringstream mailData;
State state = CONNECT;
AuthState authState = USER_UNKNOWN;
Mode mode = WAIT_FOR_DATA;
bool relay = false;
std::string sender;
std::vector<std::string> recipientList;
}; };

19
__IMAP_APPEND.h Normal file
View File

@ -0,0 +1,19 @@
#ifndef ____IMAP_APPEND_h__
# define ____IMAP_APPEND_h__
# include "IMAPCommand.h"
# include "IMAPSession.h"
namespace mail {
class __IMAP_APPEND : public IMAPCommand {
int processCommand(coreutils::PString request, IMAPSession &session, std::stringstream &data) {
data << "250 OK" << CRLF;
}
};
}
#endif

19
__IMAP_AUTHENTICATE.h Normal file
View File

@ -0,0 +1,19 @@
#ifndef ____IMAP_AUTHENTICATE_h__
# define ____IMAP_AUTHENTICATE_h__
# include "IMAPCommand.h"
# include "IMAPSession.h"
namespace mail {
class __IMAP_AUTHENTICATE : public IMAPCommand {
int processCommand(coreutils::PString request, IMAPSession &session, std::stringstream &data) {
data << "250 OK" << CRLF;
}
};
}
#endif

19
__IMAP_CHECK.h Normal file
View File

@ -0,0 +1,19 @@
#ifndef ____IMAP_CHECK_h__
# define ____IMAP_CHECK_h__
# include "IMAPCommand.h"
# include "IMAPSession.h"
namespace mail {
class __IMAP_CHECK : public IMAPCommand {
int processCommand(coreutils::PString request, IMAPSession &session, std::stringstream &data) {
data << "250 OK" << CRLF;
}
};
}
#endif

19
__IMAP_CLOSE.h Normal file
View File

@ -0,0 +1,19 @@
#ifndef ____IMAP_CLOSE_h__
# define ____IMAP_CLOSE_h__
# include "IMAPCommand.h"
# include "IMAPSession.h"
namespace mail {
class __IMAP_CLOSE : public IMAPCommand {
int processCommand(coreutils::PString request, IMAPSession &session, std::stringstream &data) {
data << "250 OK" << CRLF;
}
};
}
#endif

19
__IMAP_COPY.h Normal file
View File

@ -0,0 +1,19 @@
#ifndef ____IMAP_COPY_h__
# define ____IMAP_COPY_h__
# include "IMAPCommand.h"
# include "IMAPSession.h"
namespace mail {
class __IMAP_COPY : public IMAPCommand {
int processCommand(coreutils::PString request, IMAPSession &session, std::stringstream &data) {
data << "250 OK" << CRLF;
}
};
}
#endif

19
__IMAP_CREATE.h Normal file
View File

@ -0,0 +1,19 @@
#ifndef ____IMAP_CREATE_h__
# define ____IMAP_CREATE_h__
# include "IMAPCommand.h"
# include "IMAPSession.h"
namespace mail {
class __IMAP_CREATE : public IMAPCommand {
int processCommand(coreutils::PString request, IMAPSession &session, std::stringstream &data) {
data << "250 OK" << CRLF;
}
};
}
#endif

19
__IMAP_DELETE.h Normal file
View File

@ -0,0 +1,19 @@
#ifndef ____IMAP_DELETE_h__
# define ____IMAP_DELETE_h__
# include "IMAPCommand.h"
# include "IMAPSession.h"
namespace mail {
class __IMAP_DELETE : public IMAPCommand {
int processCommand(coreutils::PString request, IMAPSession &session, std::stringstream &data) {
data << "250 OK" << CRLF;
}
};
}
#endif

19
__IMAP_EXAMINE.h Normal file
View File

@ -0,0 +1,19 @@
#ifndef ____IMAP_EXAMINE_h__
# define ____IMAP_EXAMINE_h__
# include "IMAPCommand.h"
# include "IMAPSession.h"
namespace mail {
class __IMAP_EXAMINE : public IMAPCommand {
int processCommand(coreutils::PString request, IMAPSession &session, std::stringstream &data) {
data << "250 OK" << CRLF;
}
};
}
#endif

19
__IMAP_EXPUNGE.h Normal file
View File

@ -0,0 +1,19 @@
#ifndef ____IMAP_EXPUNGE_h__
# define ____IMAP_EXPUNGE_h__
# include "IMAPCommand.h"
# include "IMAPSession.h"
namespace mail {
class __IMAP_EXPUNGE : public IMAPCommand {
int processCommand(coreutils::PString request, IMAPSession &session, std::stringstream &data) {
data << "250 OK" << CRLF;
}
};
}
#endif

19
__IMAP_FETCH.h Normal file
View File

@ -0,0 +1,19 @@
#ifndef ____IMAP_FETCH_h__
# define ____IMAP_FETCH_h__
# include "IMAPCommand.h"
# include "IMAPSession.h"
namespace mail {
class __IMAP_FETCH : public IMAPCommand {
int processCommand(coreutils::PString request, IMAPSession &session, std::stringstream &data) {
data << "250 OK" << CRLF;
}
};
}
#endif

19
__IMAP_LIST.h Normal file
View File

@ -0,0 +1,19 @@
#ifndef ____IMAP_LIST_h__
# define ____IMAP_LIST_h__
# include "IMAPCommand.h"
# include "IMAPSession.h"
namespace mail {
class __IMAP_LIST : public IMAPCommand {
int processCommand(coreutils::PString request, IMAPSession &session, std::stringstream &data) {
data << "250 OK" << CRLF;
}
};
}
#endif

19
__IMAP_LOGIN.h Normal file
View File

@ -0,0 +1,19 @@
#ifndef ____IMAP_LOGIN_h__
# define ____IMAP_LOGIN_h__
# include "IMAPCommand.h"
# include "IMAPSession.h"
namespace mail {
class __IMAP_LOGIN : public IMAPCommand {
int processCommand(coreutils::PString request, IMAPSession &session, std::stringstream &data) {
data << "250 OK" << CRLF;
}
};
}
#endif

19
__IMAP_LSUB.h Normal file
View File

@ -0,0 +1,19 @@
#ifndef ____IMAP_LSUB_h__
# define ____IMAP_LSUB_h__
# include "IMAPCommand.h"
# include "IMAPSession.h"
namespace mail {
class __IMAP_LSUB : public IMAPCommand {
int processCommand(coreutils::PString request, IMAPSession &session, std::stringstream &data) {
data << "250 OK" << CRLF;
}
};
}
#endif

19
__IMAP_RENAME.h Normal file
View File

@ -0,0 +1,19 @@
#ifndef ____IMAP_RENAME_h__
# define ____IMAP_RENAME_h__
# include "IMAPCommand.h"
# include "IMAPSession.h"
namespace mail {
class __IMAP_RENAME : public IMAPCommand {
int processCommand(coreutils::PString request, IMAPSession &session, std::stringstream &data) {
data << "250 OK" << CRLF;
}
};
}
#endif

19
__IMAP_SEARCH.h Normal file
View File

@ -0,0 +1,19 @@
#ifndef ____IMAP_SEARCH_h__
# define ____IMAP_SEARCH_h__
# include "IMAPCommand.h"
# include "IMAPSession.h"
namespace mail {
class __IMAP_SEARCH : public IMAPCommand {
int processCommand(coreutils::PString request, IMAPSession &session, std::stringstream &data) {
data << "250 OK" << CRLF;
}
};
}
#endif

19
__IMAP_SELECT.h Normal file
View File

@ -0,0 +1,19 @@
#ifndef ____IMAP_SELECT_h__
# define ____IMAP_SELECT_h__
# include "IMAPCommand.h"
# include "IMAPSession.h"
namespace mail {
class __IMAP_SELECT : public IMAPCommand {
int processCommand(coreutils::PString request, IMAPSession &session, std::stringstream &data) {
data << "250 OK" << CRLF;
}
};
}
#endif

19
__IMAP_STARTTLS.h Normal file
View File

@ -0,0 +1,19 @@
#ifndef ____IMAP_STARTTLS_h__
# define ____IMAP_STARTTLS_h__
# include "IMAPCommand.h"
# include "IMAPSession.h"
namespace mail {
class __IMAP_STARTTLS : public IMAPCommand {
int processCommand(coreutils::PString request, IMAPSession &session, std::stringstream &data) {
data << "250 OK" << CRLF;
}
};
}
#endif

19
__IMAP_STATUS.h Normal file
View File

@ -0,0 +1,19 @@
#ifndef ____IMAP_STATUS_h__
# define ____IMAP_STATUS_h__
# include "IMAPCommand.h"
# include "IMAPSession.h"
namespace mail {
class __IMAP_STATUS : public IMAPCommand {
int processCommand(coreutils::PString request, IMAPSession &session, std::stringstream &data) {
data << "250 OK" << CRLF;
}
};
}
#endif

19
__IMAP_STORE.h Normal file
View File

@ -0,0 +1,19 @@
#ifndef ____IMAP_STORE_h__
# define ____IMAP_STORE_h__
# include "IMAPCommand.h"
# include "IMAPSession.h"
namespace mail {
class __IMAP_STORE : public IMAPCommand {
int processCommand(coreutils::PString request, IMAPSession &session, std::stringstream &data) {
data << "250 OK" << CRLF;
}
};
}
#endif

19
__IMAP_SUBSCRIBE.h Normal file
View File

@ -0,0 +1,19 @@
#ifndef ____IMAP_SUBSCRIBE_h__
# define ____IMAP_SUBSCRIBE_h__
# include "IMAPCommand.h"
# include "IMAPSession.h"
namespace mail {
class __IMAP_SUBSCRIBE : public IMAPCommand {
int processCommand(coreutils::PString request, IMAPSession &session, std::stringstream &data) {
data << "250 OK" << CRLF;
}
};
}
#endif

19
__IMAP_UID.h Normal file
View File

@ -0,0 +1,19 @@
#ifndef ____IMAP_UID_h__
# define ____IMAP_UID_h__
# include "IMAPCommand.h"
# include "IMAPSession.h"
namespace mail {
class __IMAP_UID : public IMAPCommand {
int processCommand(coreutils::PString request, IMAPSession &session, std::stringstream &data) {
data << "250 OK" << CRLF;
}
};
}
#endif

19
__IMAP_UNSUBSCRIBE.h Normal file
View File

@ -0,0 +1,19 @@
#ifndef ____IMAP_UNSUBSCRIBE_h__
# define ____IMAP_UNSUBSCRIBE_h__
# include "IMAPCommand.h"
# include "IMAPSession.h"
namespace mail {
class __IMAP_UNSUBSCRIBE : public IMAPCommand {
int processCommand(coreutils::PString request, IMAPSession &session, std::stringstream &data) {
data << "250 OK" << CRLF;
}
};
}
#endif

19
__POP3_DELE.h Normal file
View File

@ -0,0 +1,19 @@
#ifndef ____POP3_DELE_h__
# define ____POP3_DELE_h__
# include "POP3Command.h"
# include "POP3Session.h"
namespace mail {
class __POP3_DELE : public POP3Command {
int processCommand(coreutils::PString request, POP3Session &session, std::stringstream &data) {
data << "250 OK" << CRLF;
}
};
}
#endif

19
__POP3_LAST.h Normal file
View File

@ -0,0 +1,19 @@
#ifndef ____POP3_LAST_h__
# define ____POP3_LAST_h__
# include "POP3Command.h"
# include "POP3Session.h"
namespace mail {
class __POP3_LAST : public POP3Command {
int processCommand(coreutils::PString request, POP3Session &session, std::stringstream &data) {
data << "250 OK" << CRLF;
}
};
}
#endif

19
__POP3_LIST.h Normal file
View File

@ -0,0 +1,19 @@
#ifndef ____POP3_LIST_h__
# define ____POP3_LIST_h__
# include "POP3Command.h"
# include "POP3Session.h"
namespace mail {
class __POP3_LIST : public POP3Command {
int processCommand(coreutils::PString request, POP3Session &session, std::stringstream &data) {
data << "250 OK" << CRLF;
}
};
}
#endif

19
__POP3_NOOP.h Normal file
View File

@ -0,0 +1,19 @@
#ifndef ____POP3_NOOP_h__
# define ____POP3_NOOP_h__
# include "POP3Command.h"
# include "POP3Session.h"
namespace mail {
class __POP3_NOOP : public POP3Command {
int processCommand(coreutils::PString request, POP3Session &session, std::stringstream &data) {
data << "250 OK" << CRLF;
}
};
}
#endif

19
__POP3_PASS.h Normal file
View File

@ -0,0 +1,19 @@
#ifndef ____POP3_PASS_h__
# define ____POP3_PASS_h__
# include "POP3Command.h"
# include "POP3Session.h"
namespace mail {
class __POP3_PASS : public POP3Command {
int processCommand(coreutils::PString request, POP3Session &session, std::stringstream &data) {
data << "250 OK" << CRLF;
}
};
}
#endif

19
__POP3_QUIT.h Normal file
View File

@ -0,0 +1,19 @@
#ifndef ____POP3_QUIT_h__
# define ____POP3_QUIT_h__
# include "POP3Command.h"
# include "POP3Session.h"
namespace mail {
class __POP3_QUIT : public POP3Command {
int processCommand(coreutils::PString request, POP3Session &session, std::stringstream &data) {
data << "250 OK" << CRLF;
}
};
}
#endif

19
__POP3_RETR.h Normal file
View File

@ -0,0 +1,19 @@
#ifndef ____POP3_RETR_h__
# define ____POP3_RETR_h__
# include "POP3Command.h"
# include "POP3Session.h"
namespace mail {
class __POP3_RETR : public POP3Command {
int processCommand(coreutils::PString request, POP3Session &session, std::stringstream &data) {
data << "250 OK" << CRLF;
}
};
}
#endif

19
__POP3_RPOP.h Normal file
View File

@ -0,0 +1,19 @@
#ifndef ____POP3_RPOP_h__
# define ____POP3_RPOP_h__
# include "POP3Command.h"
# include "POP3Session.h"
namespace mail {
class __POP3_RPOP : public POP3Command {
int processCommand(coreutils::PString request, POP3Session &session, std::stringstream &data) {
data << "250 OK" << CRLF;
}
};
}
#endif

19
__POP3_RSET.h Normal file
View File

@ -0,0 +1,19 @@
#ifndef ____POP3_RSET_h__
# define ____POP3_RSET_h__
# include "POP3Command.h"
# include "POP3Session.h"
namespace mail {
class __POP3_RSET : public POP3Command {
int processCommand(coreutils::PString request, POP3Session &session, std::stringstream &data) {
data << "250 OK" << CRLF;
}
};
}
#endif

19
__POP3_STAT.h Normal file
View File

@ -0,0 +1,19 @@
#ifndef ____POP3_STAT_h__
# define ____POP3_STAT_h__
# include "POP3Command.h"
# include "POP3Session.h"
namespace mail {
class __POP3_STAT : public POP3Command {
int processCommand(coreutils::PString request, POP3Session &session, std::stringstream &data) {
data << "250 OK" << CRLF;
}
};
}
#endif

19
__POP3_TOP.h Normal file
View File

@ -0,0 +1,19 @@
#ifndef ____POP3_TOP_h__
# define ____POP3_TOP_h__
# include "POP3Command.h"
# include "POP3Session.h"
namespace mail {
class __POP3_TOP : public POP3Command {
int processCommand(coreutils::PString request, POP3Session &session, std::stringstream &data) {
data << "250 OK" << CRLF;
}
};
}
#endif

19
__POP3_USER.h Normal file
View File

@ -0,0 +1,19 @@
#ifndef ____POP3_USER_h__
# define ____POP3_USER_h__
# include "POP3Command.h"
# include "POP3Session.h"
namespace mail {
class __POP3_USER : public POP3Command {
int processCommand(coreutils::PString request, POP3Session &session, std::stringstream &data) {
data << "250 OK" << CRLF;
}
};
}
#endif

70
__SMTP_AUTH.cpp Normal file
View File

@ -0,0 +1,70 @@
#include "__SMTP_AUTH.h"
#include "SMTPServer.h"
#include "Base64.h"
namespace mail {
int __SMTP_AUTH::processCommand(coreutils::PString request, SMTPSession &session, SMTPServer &server, std::stringstream &data) {
switch(session.authState) {
case USER_UNKNOWN:
if(request[1].str() == "LOGIN") {
data << "334 VXNlcm5hbWU6" << CRLF;
// setTimer(10.0f);
session.authState = USER_QUERY;
session.server.commands.grabInput(&session, *this);
}
else {
data << "504 AUTH method not supported." << CRLF;
}
return 1;
case USER_QUERY:
session.userName = request[0].str();
// setTimer(0.0f);
data << "334 UGFzc3dvcmQ6" << CRLF;
// setTimer(10.0f);
session.authState = USER_SECRET_QUERY;
return 1;
case USER_SECRET_QUERY:
session.password = request[0].str();
// setTimer(0.0f);
coreutils::Base64 base64;
if(authLogin(session.userName, session.password, server)) {
data << "235 2.7.0 Authentication successful" << CRLF;
session.relay = true;
session.authState = USER_KNOWN;
session.server.commands.clearGrab(&session);
}
else {
data << "530 Login was unsuccessful." << CRLF;
}
return 1;
}
return 0;
}
bool __SMTP_AUTH::authLogin(std::string userName, std::string password, SMTPServer &server) {
std::string secretPath = server.mailFileSystem.getMailBoxPath(userName) + "/.password";
coreutils::File secret(secretPath);
secret.read();
return secret.asString() == password;
}
}

View File

@ -1,95 +1,19 @@
#ifndef ____SMTP_AUTH_h__ #ifndef ____SMTP_AUTH_h__
#define ____SMTP_AUTH_h__ # define ____SMTP_AUTH_h__
#include "Command.h" # include "SMTPCommand.h"
# include "SMTPSession.h"
namespace mail { namespace mail {
class __SMTP_AUTH : public core::Command { class SMTPServer;
int processCommand(std::string request, Session *session, std::stringstream &data); class __SMTP_AUTH : public SMTPCommand {
data << "" << std::endl; public:
int processCommand(coreutils::PString request, SMTPSession &session, SMTPServer &server, std::stringstream &data);
bool authLogin(std::string userName, std::string password, SMTPServer &server);
//---------------------------------------------------------------------------
// AUTH command request handling.
//---------------------------------------------------------------------------
else if(command(input) == "AUTH") {
if(input.length() > 5) {
string method = input.substr(5);
string userName;
string password;
//--------------------------------
// Check for AUTH LOGIN method.
//--------------------------------
if(method == "LOGIN") {
cout << "334 VXNlcm5hbWU6" << CRLF;
alarm(10);
if(!getline(cin, userName)) {
return -1;
}
alarm(0);
if(userName[userName.length() - 1] == '\r')
userName.erase(userName.length() - 1);
cout << "334 UGFzc3dvcmQ6" << CRLF;
alarm(10);
if(!getline(cin, password)) {
return -1;
}
alarm(0);
if(password[password.length() - 1] == '\r')
password.erase(password.length() - 1);
BASE64 base64;
log.message("Logging in with user '" + base64.decode(userName) + "' using password '" + base64.decode(password) + "'.");
if(authLogin(base64.decode(userName), base64.decode(password))) {
cout << "235 Authentication successful" << CRLF;
log.message("Response: 235 Authentication successful.");
relay = true;
}
else {
cout << "530 Login was unsuccessful." << CRLF;
log.message("Response: 530 Login was unsuccessful.");
}
}
else {
cout << "530 AUTH method not supported." << CRLF;
log.message("Response: 530 AUTH method not supported.");
}
}
else {
}
}
httpRequest.response.addHeader("Content-Type", "script/javascript");
return 0;
}
}; };

89
__SMTP_DATA.cpp Normal file
View File

@ -0,0 +1,89 @@
#include "__SMTP_DATA.h"
#include "SMTPServer.h"
#include "Log.h"
#include <chrono>
#include <iomanip>
namespace mail {
int __SMTP_DATA::processCommand(coreutils::PString request, SMTPSession &session, SMTPServer &server, std::stringstream &data) {
switch(session.mode) {
case WAIT_FOR_DATA:
switch(session.state) {
case RCPT:
data << "354 Enter the mail message terminated by <CRLF>.<CRLF>" << CRLF;
session.mailData.str("");
session.mode = RECEIVE_DATA;
session.server.commands.grabInput(&session, *this);
// setTimer(120.0f);
break;
case MAIL:
data << "503 Please use RCPT first" << CRLF;
break;
default:
data << "503 Please use MAIL first" << CRLF;
break;
}
break;
case RECEIVE_DATA:
if(request.str() != ".")
session.mailData << request.str() << CRLF;
else {
session.mode = WAIT_FOR_DATA;
session.state = READY;
session.server.commands.clearGrab(&session);
// if(filterMessage(session.mailData)) {
if(session.recipientList.size() > 0) {
if(session.mailData.str().size() > 0) {
std::string ID = queueMail(server, session.sender, session.recipientList, session.mailData);
if(ID != "") {
coreutils::Log(coreutils::LOG_INFO) << "Queued message " << ID << ".";
data << "250 OK Queued message " << ID << CRLF;
}
else
data << "550 Mail message too big" << CRLF;
} else
data << "550 Mail message was empty" << CRLF;
} else
data << "250 OK Queued message " << CRLF;
// } else
// data << "550 Message is probably spam" << CRLF;
}
break;
}
}
std::string __SMTP_DATA::generateMailFileName() {
std::stringstream temp;
struct timespec timex;
clock_gettime(CLOCK_REALTIME, &timex);
temp << timex.tv_sec << "." << std::setfill('0') << std::setw(9) << timex.tv_nsec;
return temp.str();
}
std::string __SMTP_DATA::queueMail(SMTPServer &server, std::string sender, std::vector<std::string> recipientList, std::stringstream &mailData) {
std::string fileName = server.mailFileSystem.getMailPath() + "/.queue/" + generateMailFileName();
coreutils::File mailFile(fileName, O_CREAT | O_WRONLY, 0660);
mailFile.write(mailData.str());
for(std::string recipient: recipientList) {
std::string newName = fileName + recipient;
link(fileName.c_str(), newName.c_str());
}
unlink(fileName.c_str());
return fileName;
}
}

View File

@ -1,177 +1,24 @@
#ifndef ____SMTP_DATA_h__ #ifndef ____SMTP_DATA_h__
#define ____SMTP_DATA_h__ # define ____SMTP_DATA_h__
#include "Command.h" # include "SMTPCommand.h"
# include "SMTPSession.h"
namespace mail { namespace mail {
class __SMTP_DATA : public core::Command { class SMTPServer;
int processCommand(std::string request, Session *session, std::stringstream &data); class __SMTP_DATA : public SMTPCommand {
data << "" << std::endl; public:
int processCommand(coreutils::PString request, SMTPSession &session, SMTPServer &server, std::stringstream &data);
//--------------------------------------------------------------------------- std::string generateMailFileName();
// DATA command request handling. std::string queueMail(SMTPServer &server, std::string sender, std::vector<std::string> recipientList, std::stringstream &mailData);
//---------------------------------------------------------------------------
else if(command(input) == "DATA") { };
//-------------------------------------------------------------- }
// We must have recipients before we can send data.
//--------------------------------------------------------------
if(state == "RCPT") { #endif
//---------------------------------------------------------
// Prompt for client to begin entering mail message data.
//---------------------------------------------------------
cout << "354 Enter the mail message terminated by <CRLF>.<CRLF>" << CRLF;
mailData = "";
//-----------------------------------------------------------
// Receive mail message one line at a time and keep an eye
// out for the terminating period character.
//-----------------------------------------------------------
do {
alarm(120);
if(!getline(cin, input)) {
return -1;
}
if(input[input.length() - 1] == '\r')
input.erase(input.length() - 1);
alarm(0);
if(input != ".") {
//--------------------------------------------------------------
// If there was a period for the first character but it wasn't
// the only character then remove and ignore the first period.
// This is the transparency mode capability.
//--------------------------------------------------------------
if(input[0] == '.') {
mailData += input.substr(1) + CRLF;
}
else {
mailData += input + CRLF;
}
}
} while(input != ".");
//------------------------------------------------------------------
// Run the received message through an external filter program if
// one is configured into the system settings.
//------------------------------------------------------------------
string ID;
if(filterMessage(mailData)) {
if(recipientList != "") {
if(mailData.length() > 0) {
//------------------------------------------------------------------
// We have the message and we have a list of recipients. Send the
// message to the queue since we know everyone in the recipient
// list has passed the test.
//------------------------------------------------------------------
ID = queueMail(sender, recipientList, mailData, clientIP, log, sql, "N");
if(ID != "") {
log.message("Response: 250 OK Queued message " + ID);
//------------------------------
// Tell the client we sent it.
//------------------------------
cout << "250 OK Queued message " << ID << CRLF;
}
else {
log.message("Response: 550 Mail message too big.");
//---------------------------------
// Tell the client it was too big.
//---------------------------------
cout << "550 Mail message too big" << CRLF;
}
}
//------------------------------------------------------------------------
// The mail message is empty so we are going to error out. We don't like
// getting empty messages.
//------------------------------------------------------------------------
else {
log.message("Response: 550 Mail message was empty.");
cout << "550 Mail message was empty" << CRLF;
}
}
else {
log.message("Response: 250 OK Queued message. (We actually discarded it due to empty recipient list)");
//------------------------------
// Tell the client we sent it.
//------------------------------
cout << "250 OK Queued message " << ID << CRLF;
}
}
//----------------------------------------------------
// Error out cause it did not pass the filter test.
//----------------------------------------------------
else {
cout << "550 Message is probably spam" << CRLF;
log.message("Response: 550 Message is probably spam.");
}
//----------------------------
// Return to the READY state.
//----------------------------
state = "READY";
}
//--------------------------------------------------------
// Generate an error cause we are not in the right state.
//--------------------------------------------------------
else {
if(state == "MAIL") {
cout << "503 Please use RCPT first" << CRLF;
log.message("Response: 503 Please use RCPT first.");
}
else {
cout << "503 Please use MAIL first" << CRLF;
log.message("Response: 503 Please use MAIL first.");
}
}
}

19
__SMTP_EHLO.cpp Normal file
View File

@ -0,0 +1,19 @@
#include "__SMTP_EHLO.h"
#include "SMTPServer.h"
namespace mail {
int __SMTP_EHLO::processCommand(coreutils::PString request, SMTPSession &session, SMTPServer &server, std::stringstream &data) {
session.clientDomainName = request[1].str();
data << "250-" << server.hostName << CRLF;
// cout << "250-STARTTLS" << CRLF;
// cout << "250-PIPELINING" << CRLF;
// cout << "250-8BITMIME" << CRLF;
data << "250-AUTH LOGIN" << CRLF;
data << "250 HELP" << CRLF;
session.state = READY;
}
}

View File

@ -1,30 +1,20 @@
#ifndef ____SMTP_EHLO_h__ #ifndef ____SMTP_EHLO_h__
#define ____SMTP_EHLO_h__ # define ____SMTP_EHLO_h__
#include "Command.h" # include "SMTPCommand.h"
# include "SMTPSession.h"
namespace mail { namespace mail {
class __SMTP_EHLO : public core::Command { class SMTPServer;
int processCommand(std::string request, Session *session, std::stringstream &data); class __SMTP_EHLO : public SMTPCommand {
if(input.length() > 5) { public:
string hostName = input.substr(5); int processCommand(coreutils::PString request, SMTPSession &session, SMTPServer &server, std::stringstream &data);
}
else { };
// TODO: Provide error message demanding identity here. }
//
}
data << "250-" << getHostName() << CRLF;
// cout << "250-STARTTLS" << CRLF;
// cout << "250-PIPELINING" << CRLF;
// cout << "250-8BITMIME" << CRLF;
data << "250-AUTH LOGIN" << CRLF;
data << "250 HELP" << CRLF;
session->state = "READY";
}
#endif

11
__SMTP_EXPN.cpp Normal file
View File

@ -0,0 +1,11 @@
#include "__SMTP_EXPN.h"
#include "SMTPServer.h"
namespace mail {
int __SMTP_EXPN::processCommand(coreutils::PString request, SMTPSession &session, SMTPServer &server, std::stringstream &data) {
data << "252 You must know recipient." << CRLF;
session.state = READY;
}
}

19
__SMTP_EXPN.h Normal file
View File

@ -0,0 +1,19 @@
#ifndef ____SMTP_EXPN_h__
# define ____SMTP_EXPN_h__
# include "SMTPCommand.h"
# include "SMTPSession.h"
namespace mail {
class SMTPServer;
class __SMTP_EXPN : public SMTPCommand {
public:
int processCommand(coreutils::PString request, SMTPSession &session, SMTPServer &server, std::stringstream &data);
};
}
#endif

15
__SMTP_HELO.cpp Normal file
View File

@ -0,0 +1,15 @@
#include "__SMTP_HELO.h"
#include "SMTPServer.h"
namespace mail {
int __SMTP_HELO::processCommand(coreutils::PString request, SMTPSession &session, SMTPServer &server, std::stringstream &data) {
std::string clientName = request[1].str();
data << "250 " << server.hostName << CRLF;
session.state = READY;
}
}

View File

@ -1,32 +1,20 @@
#ifndef ____SMTP_HELO_h__ #ifndef ____SMTP_HELO_h__
#define ____SMTP_HELO_h__ # define ____SMTP_HELO_h__
#include "Command.h" # include "SMTPCommand.h"
# include "SMTPSession.h"
namespace mail { namespace mail {
class __SMTP_HELO : public core::Command { class SMTPServer;
int processCommand(std::string request, Session *session, std::stringstream &data); class __SMTP_HELO : public SMTPCommand {
data << "" << std::endl; public:
int processCommand(coreutils::PString request, SMTPSession &session, SMTPServer &server, std::stringstream &data);
//--------------------------------------------------------------------------- };
// HELO command request handling.
//---------------------------------------------------------------------------
if(command(input) == "HELO") { }
if(input.length() > 5) { #endif
string hostName = input.substr(5);
}
else {
// TODO: Provide error message demanding identity here.
//
}
cout << "250 " << getHostName() << CRLF;
state = "READY";
}

12
__SMTP_HELP.cpp Normal file
View File

@ -0,0 +1,12 @@
#include "__SMTP_HELP.h"
#include "SMTPServer.h"
namespace mail {
int __SMTP_HELP::processCommand(coreutils::PString request, SMTPSession &session, SMTPServer &server, std::stringstream &data) {
data << "250 Sure you need help." << CRLF;
session.state = READY;
}
}

19
__SMTP_HELP.h Normal file
View File

@ -0,0 +1,19 @@
#ifndef ____SMTP_HELP_h__
# define ____SMTP_HELP_h__
# include "SMTPCommand.h"
# include "SMTPSession.h"
namespace mail {
class SMTPServer;
class __SMTP_HELP : public SMTPCommand {
int processCommand(coreutils::PString request, SMTPSession &session, SMTPServer &server, std::stringstream &data);
};
}
#endif

32
__SMTP_MAIL.cpp Normal file
View File

@ -0,0 +1,32 @@
#include "__SMTP_MAIL.h"
#include "SMTPServer.h"
namespace mail {
int __SMTP_MAIL::processCommand(coreutils::PString request, SMTPSession &session, SMTPServer &server, std::stringstream &data) {
if(request.ifNext("MAIL FROM:")) {
request.skipWhitespace();
if(request.ifNext("<")) {
session.sender = request.getTokenExclude(">");
if(session.authState = USER_KNOWN) {
data << "250 OK" << CRLF;
session.recipientList.clear();
session.state = MAIL;
}
} else
data << "550 Usage: MAIL FROM:<email-address>" << CRLF;
} else
data << "550 Usage: MAIL FROM:<email-address>" << CRLF;
return 1;
}
std::string domainOnly(std::string email) {
coreutils::PString split(email);
split.split("@");
return split[1].str();
}
}

View File

@ -1,38 +1,21 @@
#ifndef ____SMTP_MAIL_h__ #ifndef ____SMTP_MAIL_h__
#define ____SMTP_MAIL_h__ # define ____SMTP_MAIL_h__
#include "Command.h" # include "SMTPCommand.h"
# include "SMTPSession.h"
namespace mail { namespace mail {
class __SMTP_MAIL : public core::Command { class SMTPServer;
int processCommand(std::string request, Session *session, std::stringstream &data); class __SMTP_MAIL : public SMTPCommand {
data << "" << std::endl; public:
//--------------------------------------------------------------------------- int processCommand(coreutils::PString request, SMTPSession &session, SMTPServer &server, std::stringstream &data);
// MAIL command request handling.
//---------------------------------------------------------------------------
else if(command(input) == "MAIL") { };
sender = cleanEMail(input.substr(5)); }
//------------------------------------------------------------- #endif
// Verify that the senders domain name resolves to an address
// with an MX record. If not and there is a bounce then we
// will not be able to return the bounce message so it is
// probably a spammer anyway.
//-------------------------------------------------------------
if(verifyDomainMX(domainOnly(sender))) {
cout << "250 OK" << CRLF;
log.message("Response: 250 OK.");
recipientList = "";
state = "MAIL";
}
}

20
__SMTP_NOOP.cpp Normal file
View File

@ -0,0 +1,20 @@
#ifndef ____SMTP_NOOP_h__
# define ____SMTP_NOOP_h__
# include "SMTPCommand.h"
# include "SMTPSession.h"
# include "PString.h"
namespace mail {
class __SMTP_NOOP : public SMTPCommand {
int processCommand(coreutils::PString request, SMTPSession &session, std::stringstream &data) {
data << "250 OK" << CRLF;
}
};
}
#endif

View File

@ -1,12 +1,20 @@
#ifndef ____SMTP_NOOP_h__ #ifndef ____SMTP_NOOP_h__
#define ____SMTP_NOOP_h__ # define ____SMTP_NOOP_h__
#include "Command.h" # include "SMTPCommand.h"
# include "SMTPSession.h"
# include "PString.h"
namespace mail { namespace mail {
class __SMTP_NOOP : public core::Command { class __SMTP_NOOP : public SMTPCommand {
int processCommand(std::string request, Session *session, std::stringstream &data); int processCommand(coreutils::PString request, SMTPSession &session, std::stringstream &data) {
data << "250 OK" << CRLF; data << "250 OK" << CRLF;
} }
};
}
#endif

12
__SMTP_QUIT.cpp Normal file
View File

@ -0,0 +1,12 @@
# include "__SMTP_QUIT.h"
# include "SMTPServer.h"
namespace mail {
int __SMTP_QUIT::processCommand(coreutils::PString request, SMTPSession &session, SMTPServer &server, std::stringstream &data) {
data << "221 " << server.hostName << CRLF;
session.shutdown("quit request");
}
}

View File

@ -1,17 +1,21 @@
#ifndef ____SMTP_QUIT_h__ #ifndef ____SMTP_QUIT_h__
#define ____SMTP_QUIT_h__ # define ____SMTP_QUIT_h__
#include "Command.h" # include "SMTPCommand.h"
# include "SMTPSession.h"
namespace mail { namespace mail {
class __SMTP_QUIT : public core::Command { class SMTPServer;
int processCommand(std::string request, Session *session, std::stringstream &data); class __SMTP_QUIT : public SMTPCommand {
data << "221 " << getHostName() << CRLF;
session->shutdown(); public:
}
int processCommand(coreutils::PString request, SMTPSession &session, SMTPServer &server, std::stringstream &data);
}; };
} }
#endif

34
__SMTP_RCPT.cpp Normal file
View File

@ -0,0 +1,34 @@
# include "__SMTP_RCPT.h"
# include "SMTPServer.h"
namespace mail {
int __SMTP_RCPT::processCommand(coreutils::PString request, SMTPSession &session, SMTPServer &server, std::stringstream &data) {
if((session.state == MAIL) || (session.state == RCPT)) {
std::string recipient;
if(request.ifNext("RCPT TO:")) {
request.skipWhitespace();
if(request.ifNext("<")) {
recipient = request.getTokenExclude(">");
if(server.mailFileSystem.ifMailBoxExists(recipient)) {
session.recipientList.push_back(recipient);
data << "250 OK" << CRLF;
session.state = RCPT;
} else if(session.relay) {
session.recipientList.push_back(recipient);
data << "250 OK" << CRLF;
session.state = RCPT;
} else
data << "550 Mailbox does not exist" << CRLF;
} else
data << "550 Usage: RCPT TO:<email-address>" << CRLF;
} else
data << "550 Usage: RCPT TO:<email-address>" << CRLF;
} else
data << "503 Please use MAIL first" << CRLF;
return 1;
}
}

View File

@ -1,159 +1,18 @@
#ifndef ____SMTP_RCPT_h__ #ifndef ____SMTP_RCPT_h__
#define ____SMTP_RCPT_h__ # define ____SMTP_RCPT_h__
#include "Command.h" # include "SMTPCommand.h"
# include "MailFileSystem.h"
# include "SMTPSession.h"
namespace mail { namespace mail {
class __SMTP_RCPT : public core::Command { class SMTPServer;
int processCommand(std::string request, Session *session, std::stringstream &data); class __SMTP_RCPT : public SMTPCommand {
if((state == "MAIL") || (state == "RCPT")) { public:
int processCommand(coreutils::PString request, SMTPSession &session, SMTPServer &server, std::stringstream &data);
bool done = false;
//--------------------------------------
// Obtain the recipient's email address.
//--------------------------------------
string recipient = input.substr(5);
//-----------------------------------------------
// Fetch the recipient list for the alias.
//-----------------------------------------------
string aliasRecipients;
if(getAliasList(cleanEMail(recipient), aliasRecipients)) {
//-----------------------------------------------
// If the list is not blank then add the list
// to the recipient list and accept the request.
//-----------------------------------------------
recipientList += aliasRecipients;
data << "250 OK" << CRLF;
state = "RCPT";
done = true;
}
//-------------------------------------------------
// No alias entry for the mailbox so check if it
// is a hard mailbox.
//-------------------------------------------------
if(!done) {
//--------------------------------------
// Check to see if the user is a local
// address to deliver to.
//--------------------------------------
if(localUser(cleanEMail(recipient))) {
//------------------------------------------
// They're local so lets queue it for them.
//------------------------------------------
recipientList += cleanEMail(recipient) + " ";
data << "250 OK" << CRLF;
state = "RCPT";
done = true;
}
}
//--------------------------------------------------
// There is no mailbox either so do domain check.
//--------------------------------------------------
if(!done) {
//---------------------------------------------------
// Check to see if the domain is good at least and
// if there is a default mailbox address..
//---------------------------------------------------
string defaultMailbox;
if(localDomain(domainOnly(cleanEMail(recipient)), defaultMailbox)) {
//--------------------------------------------------
// The domain is local so if there is a default
// mailbox then let's send it to the queue with the
// default address attached instead.
//--------------------------------------------------
if(defaultMailbox != "*NONE") {
//---------------------------------------------------------
// If the default mailbox is *DISCARD then we do not want
// to add the mailbox to the recipient list but we still
// want to say we have a mailbox.
//---------------------------------------------------------
if(defaultMailbox != "*DISCARD")
recipientList += defaultMailbox + " ";
cout << "250 OK" << CRLF;
log.message("Response: 250 OK.");
state = "RCPT";
done = true;
}
//--------------------------------------------------
// If there is no default address then we will tell
// the client that the mailbox does not exist.
//--------------------------------------------------
else {
cout << "553 Mailbox does not exist" << CRLF;
log.message("Response: 553 Mailbox does not exist.");
done = true;
}
}
}
//--------------------------------------------------------------
// If we are not done then this is a relay request.
//--------------------------------------------------------------
if (!done) {
//---------------------------------------------------------
// If relaying is enabled for this conversation then
// queue the mail.
//---------------------------------------------------------
if(relay) {
recipientList += cleanEMail(recipient) + " ";
cout << "250 OK" << CRLF;
log.message("Response: 250 OK.");
state = "RCPT";
}
//----------------------------------------
// Otherwise send an error.
//----------------------------------------
else {
cout << "553 Server requires authentication to relay" << CRLF;
log.message("Response: 553 Server requires authentication to relay.");
}
}
}
else {
cout << "503 Please use MAIL first" << CRLF;
log.message("Response: 503 Please use MAIL first.");
}
return 0;
}
}; };

20
__SMTP_RSET.cpp Normal file
View File

@ -0,0 +1,20 @@
#ifndef ____SMTP_RSET_h__
#define ____SMTP_RSET_h__
#include "SMTPCommand.h"
namespace mail {
class __SMTP_RSET : public SMTPCommand {
int processCommand(coreutils::PString request, SMTPSession &session, std::stringstream &data) {
session.state = READY;
data << "250 OK" << CRLF;
return 0;
}
};
}
#endif

View File

@ -1,14 +1,14 @@
#ifndef ____SMTP_RSET_h__ #ifndef ____SMTP_RSET_h__
#define ____SMTP_RSET_h__ #define ____SMTP_RSET_h__
#include "Command.h" #include "SMTPCommand.h"
namespace mail { namespace mail {
class __SMTP_RSET : public core::Command { class __SMTP_RSET : public SMTPCommand {
int processCommand(std::string request, Session *session, std::stringstream &data); int processCommand(coreutils::PString request, SMTPSession &session, std::stringstream &data) {
state = "READY"; session.state = READY;
data << "250 OK" << CRLF; data << "250 OK" << CRLF;
return 0; return 0;
} }

11
__SMTP_VRFY.cpp Normal file
View File

@ -0,0 +1,11 @@
#include "__SMTP_VRFY.h"
namespace mail {
int __SMTP_VRFY::processCommand(coreutils::PString request, SMTPSession &session, std::stringstream &data) {
data << "252 You must know who the mail is for" << CRLF;
return 0;
}
}

View File

@ -1,16 +1,14 @@
#ifndef ____SMTP_VRFY_h__ #ifndef ____SMTP_VRFY_h__
#define ____SMTP_VRFY_h__ # define ____SMTP_VRFY_h__
#include "Command.h" # include "SMTPCommand.h"
# include "PString.h"
namespace mail { namespace mail {
class __SMTP_VRFY : public core::Command { class __SMTP_VRFY : public SMTPCommand {
int processCommand(std::string request, Session *session, std::stringstream &data) { int processCommand(coreutils::PString request, SMTPSession &session, std::stringstream &data);
data << "252 You must know who the mail is for" << CRLF;
return 0;
}
}; };

29
compile Executable file
View File

@ -0,0 +1,29 @@
#!/bin/bash
for file in *.cpp
do
filename="${file%.*}"
list="$list $filename.o"
echo -n "Compiling $filename..."
g++ -g -c -std=c++17 -I../CoreUtils -I../ServerCore $file
if [ $? = '0' ]
then
echo "OK"
else
echo "ERROR"
exit -1
fi
done
wait
echo -n "Building executable BMAMail..."
g++ -g -std=c++17 -o BMAMail $list -L../CoreUtils -lCoreUtils -L../ServerCore -lServerCore -lpthread -luuid -lssl -lcrypto
if [ $? = '0' ]
then
echo "OK"
else
echo "ERROR"
exit -1
fi

2494
docs/Doxyfile Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,111 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.13"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>BMAMail: /home/bradarant/barant/BMAMail/__IMAP_APPEND.h File Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectalign" style="padding-left: 0.5em;">
<div id="projectname">BMAMail
&#160;<span id="projectnumber">1.0.0</span>
</div>
<div id="projectbrief">E-Mail System</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.13 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search",false,'Search');
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
$(function() {
initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
</script>
<div id="main-nav"></div>
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
</div>
</div><!-- top -->
<div class="header">
<div class="summary">
<a href="#nested-classes">Classes</a> &#124;
<a href="#namespaces">Namespaces</a> </div>
<div class="headertitle">
<div class="title">/home/bradarant/barant/BMAMail/__IMAP_APPEND.h File Reference</div> </div>
</div><!--header-->
<div class="contents">
<div class="textblock"><code>#include &quot;<a class="el" href="_i_m_a_p_command_8h_source.html">IMAPCommand.h</a>&quot;</code><br />
<code>#include &quot;<a class="el" href="_i_m_a_p_session_8h_source.html">IMAPSession.h</a>&quot;</code><br />
</div><div class="textblock"><div class="dynheader">
Include dependency graph for __IMAP_APPEND.h:</div>
<div class="dyncontent">
<div class="center"><img src="_____i_m_a_p___a_p_p_e_n_d_8h__incl.png" border="0" usemap="#_2home_2bradarant_2barant_2_b_m_a_mail_2_____i_m_a_p___a_p_p_e_n_d_8h" alt=""/></div>
<map name="_2home_2bradarant_2barant_2_b_m_a_mail_2_____i_m_a_p___a_p_p_e_n_d_8h" id="_2home_2bradarant_2barant_2_b_m_a_mail_2_____i_m_a_p___a_p_p_e_n_d_8h">
<area shape="rect" id="node2" href="_i_m_a_p_command_8h.html" title="IMAPCommand.h" alt="" coords="129,95,255,121"/>
<area shape="rect" id="node5" href="_i_m_a_p_session_8h.html" title="IMAPSession.h" alt="" coords="254,169,367,196"/>
</map>
</div>
</div><div class="textblock"><div class="dynheader">
This graph shows which files directly or indirectly include this file:</div>
<div class="dyncontent">
<div class="center"><img src="_____i_m_a_p___a_p_p_e_n_d_8h__dep__incl.png" border="0" usemap="#_2home_2bradarant_2barant_2_b_m_a_mail_2_____i_m_a_p___a_p_p_e_n_d_8hdep" alt=""/></div>
<map name="_2home_2bradarant_2barant_2_b_m_a_mail_2_____i_m_a_p___a_p_p_e_n_d_8hdep" id="_2home_2bradarant_2barant_2_b_m_a_mail_2_____i_m_a_p___a_p_p_e_n_d_8hdep">
<area shape="rect" id="node2" href="_i_m_a_p_service_8h.html" title="/home/bradarant/barant\l/BMAMail/IMAPService.h" alt="" coords="22,95,193,136"/>
<area shape="rect" id="node3" href="main_8cpp.html" title="/home/bradarant/barant\l/BMAMail/main.cpp" alt="" coords="29,184,185,225"/>
</map>
</div>
</div>
<p><a href="_____i_m_a_p___a_p_p_e_n_d_8h_source.html">Go to the source code of this file.</a></p>
<table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
Classes</h2></td></tr>
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmail_1_1_____i_m_a_p___a_p_p_e_n_d.html">mail::__IMAP_APPEND</a></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table><table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="namespaces"></a>
Namespaces</h2></td></tr>
<tr class="memitem:namespacemail"><td class="memItemLeft" align="right" valign="top"> &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemail.html">mail</a></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table>
</div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.8.13
</small></address>
</body>
</html>

View File

@ -0,0 +1,4 @@
<map id="/home/bradarant/barant/BMAMail/__IMAP_APPEND.h" name="/home/bradarant/barant/BMAMail/__IMAP_APPEND.h">
<area shape="rect" id="node2" href="$_i_m_a_p_service_8h.html" title="/home/bradarant/barant\l/BMAMail/IMAPService.h" alt="" coords="22,95,193,136"/>
<area shape="rect" id="node3" href="$main_8cpp.html" title="/home/bradarant/barant\l/BMAMail/main.cpp" alt="" coords="29,184,185,225"/>
</map>

View File

@ -0,0 +1 @@
22f73b6a82680dc85cb63acda50fcaa8

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

View File

@ -0,0 +1,4 @@
<map id="/home/bradarant/barant/BMAMail/__IMAP_APPEND.h" name="/home/bradarant/barant/BMAMail/__IMAP_APPEND.h">
<area shape="rect" id="node2" href="$_i_m_a_p_command_8h.html" title="IMAPCommand.h" alt="" coords="129,95,255,121"/>
<area shape="rect" id="node5" href="$_i_m_a_p_session_8h.html" title="IMAPSession.h" alt="" coords="254,169,367,196"/>
</map>

View File

@ -0,0 +1 @@
cd58f15aee07f1189f517c74a37f4eb8

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

View File

@ -0,0 +1,82 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.13"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>BMAMail: /home/bradarant/barant/BMAMail/__IMAP_APPEND.h Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectalign" style="padding-left: 0.5em;">
<div id="projectname">BMAMail
&#160;<span id="projectnumber">1.0.0</span>
</div>
<div id="projectbrief">E-Mail System</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.13 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search",false,'Search');
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
$(function() {
initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
</script>
<div id="main-nav"></div>
</div><!-- top -->
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
</div>
<div class="header">
<div class="headertitle">
<div class="title">/home/bradarant/barant/BMAMail/__IMAP_APPEND.h</div> </div>
</div><!--header-->
<div class="contents">
<a href="_____i_m_a_p___a_p_p_e_n_d_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span>&#160;<span class="preprocessor">#ifndef ____IMAP_APPEND_h__</span></div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span>&#160;<span class="preprocessor"># define ____IMAP_APPEND_h__</span></div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span>&#160;</div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160;<span class="preprocessor"># include &quot;<a class="code" href="_i_m_a_p_command_8h.html">IMAPCommand.h</a>&quot;</span></div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160;<span class="preprocessor"># include &quot;<a class="code" href="_i_m_a_p_session_8h.html">IMAPSession.h</a>&quot;</span></div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160;</div><div class="line"><a name="l00007"></a><span class="lineno"><a class="line" href="namespacemail.html"> 7</a></span>&#160;<span class="keyword">namespace </span><a class="code" href="namespacemail.html">mail</a> {</div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160; </div><div class="line"><a name="l00009"></a><span class="lineno"><a class="line" href="classmail_1_1_____i_m_a_p___a_p_p_e_n_d.html"> 9</a></span>&#160; <span class="keyword">class </span><a class="code" href="classmail_1_1_____i_m_a_p___a_p_p_e_n_d.html">__IMAP_APPEND</a> : <span class="keyword">public</span> <a class="code" href="classmail_1_1_i_m_a_p_command.html">IMAPCommand</a> {</div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160; </div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160; <span class="keywordtype">int</span> processCommand(coreutils::PString request, <a class="code" href="classmail_1_1_i_m_a_p_session.html">IMAPSession</a> &amp;session, std::stringstream &amp;data) { </div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160; data &lt;&lt; <span class="stringliteral">&quot;250 OK&quot;</span> &lt;&lt; <a class="code" href="_s_m_t_p_session_8h.html#a6cb23a858b0a21bdaa644b9181dc415f">CRLF</a>;</div><div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160; }</div><div class="line"><a name="l00014"></a><span class="lineno"> 14</span>&#160; </div><div class="line"><a name="l00015"></a><span class="lineno"> 15</span>&#160; };</div><div class="line"><a name="l00016"></a><span class="lineno"> 16</span>&#160; </div><div class="line"><a name="l00017"></a><span class="lineno"> 17</span>&#160;}</div><div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160;</div><div class="line"><a name="l00019"></a><span class="lineno"> 19</span>&#160;<span class="preprocessor">#endif</span></div><div class="ttc" id="_i_m_a_p_command_8h_html"><div class="ttname"><a href="_i_m_a_p_command_8h.html">IMAPCommand.h</a></div></div>
<div class="ttc" id="classmail_1_1_____i_m_a_p___a_p_p_e_n_d_html"><div class="ttname"><a href="classmail_1_1_____i_m_a_p___a_p_p_e_n_d.html">mail::__IMAP_APPEND</a></div><div class="ttdef"><b>Definition:</b> __IMAP_APPEND.h:9</div></div>
<div class="ttc" id="namespacemail_html"><div class="ttname"><a href="namespacemail.html">mail</a></div><div class="ttdef"><b>Definition:</b> __IMAP_APPEND.h:7</div></div>
<div class="ttc" id="classmail_1_1_i_m_a_p_command_html"><div class="ttname"><a href="classmail_1_1_i_m_a_p_command.html">mail::IMAPCommand</a></div><div class="ttdef"><b>Definition:</b> IMAPCommand.h:10</div></div>
<div class="ttc" id="_s_m_t_p_session_8h_html_a6cb23a858b0a21bdaa644b9181dc415f"><div class="ttname"><a href="_s_m_t_p_session_8h.html#a6cb23a858b0a21bdaa644b9181dc415f">CRLF</a></div><div class="ttdeci">#define CRLF</div><div class="ttdef"><b>Definition:</b> SMTPSession.h:7</div></div>
<div class="ttc" id="_i_m_a_p_session_8h_html"><div class="ttname"><a href="_i_m_a_p_session_8h.html">IMAPSession.h</a></div></div>
<div class="ttc" id="classmail_1_1_i_m_a_p_session_html"><div class="ttname"><a href="classmail_1_1_i_m_a_p_session.html">mail::IMAPSession</a></div><div class="ttdef"><b>Definition:</b> IMAPSession.h:6</div></div>
</div><!-- fragment --></div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.8.13
</small></address>
</body>
</html>

View File

@ -0,0 +1,111 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.13"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>BMAMail: /home/bradarant/barant/BMAMail/__IMAP_AUTHENTICATE.h File Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectalign" style="padding-left: 0.5em;">
<div id="projectname">BMAMail
&#160;<span id="projectnumber">1.0.0</span>
</div>
<div id="projectbrief">E-Mail System</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.13 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search",false,'Search');
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
$(function() {
initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
</script>
<div id="main-nav"></div>
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
</div>
</div><!-- top -->
<div class="header">
<div class="summary">
<a href="#nested-classes">Classes</a> &#124;
<a href="#namespaces">Namespaces</a> </div>
<div class="headertitle">
<div class="title">/home/bradarant/barant/BMAMail/__IMAP_AUTHENTICATE.h File Reference</div> </div>
</div><!--header-->
<div class="contents">
<div class="textblock"><code>#include &quot;<a class="el" href="_i_m_a_p_command_8h_source.html">IMAPCommand.h</a>&quot;</code><br />
<code>#include &quot;<a class="el" href="_i_m_a_p_session_8h_source.html">IMAPSession.h</a>&quot;</code><br />
</div><div class="textblock"><div class="dynheader">
Include dependency graph for __IMAP_AUTHENTICATE.h:</div>
<div class="dyncontent">
<div class="center"><img src="_____i_m_a_p___a_u_t_h_e_n_t_i_c_a_t_e_8h__incl.png" border="0" usemap="#_2home_2bradarant_2barant_2_b_m_a_mail_2_____i_m_a_p___a_u_t_h_e_n_t_i_c_a_t_e_8h" alt=""/></div>
<map name="_2home_2bradarant_2barant_2_b_m_a_mail_2_____i_m_a_p___a_u_t_h_e_n_t_i_c_a_t_e_8h" id="_2home_2bradarant_2barant_2_b_m_a_mail_2_____i_m_a_p___a_u_t_h_e_n_t_i_c_a_t_e_8h">
<area shape="rect" id="node2" href="_i_m_a_p_command_8h.html" title="IMAPCommand.h" alt="" coords="129,95,255,121"/>
<area shape="rect" id="node5" href="_i_m_a_p_session_8h.html" title="IMAPSession.h" alt="" coords="254,169,367,196"/>
</map>
</div>
</div><div class="textblock"><div class="dynheader">
This graph shows which files directly or indirectly include this file:</div>
<div class="dyncontent">
<div class="center"><img src="_____i_m_a_p___a_u_t_h_e_n_t_i_c_a_t_e_8h__dep__incl.png" border="0" usemap="#_2home_2bradarant_2barant_2_b_m_a_mail_2_____i_m_a_p___a_u_t_h_e_n_t_i_c_a_t_e_8hdep" alt=""/></div>
<map name="_2home_2bradarant_2barant_2_b_m_a_mail_2_____i_m_a_p___a_u_t_h_e_n_t_i_c_a_t_e_8hdep" id="_2home_2bradarant_2barant_2_b_m_a_mail_2_____i_m_a_p___a_u_t_h_e_n_t_i_c_a_t_e_8hdep">
<area shape="rect" id="node2" href="_i_m_a_p_service_8h.html" title="/home/bradarant/barant\l/BMAMail/IMAPService.h" alt="" coords="46,95,217,136"/>
<area shape="rect" id="node3" href="main_8cpp.html" title="/home/bradarant/barant\l/BMAMail/main.cpp" alt="" coords="53,184,209,225"/>
</map>
</div>
</div>
<p><a href="_____i_m_a_p___a_u_t_h_e_n_t_i_c_a_t_e_8h_source.html">Go to the source code of this file.</a></p>
<table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
Classes</h2></td></tr>
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmail_1_1_____i_m_a_p___a_u_t_h_e_n_t_i_c_a_t_e.html">mail::__IMAP_AUTHENTICATE</a></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table><table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="namespaces"></a>
Namespaces</h2></td></tr>
<tr class="memitem:namespacemail"><td class="memItemLeft" align="right" valign="top"> &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemail.html">mail</a></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table>
</div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.8.13
</small></address>
</body>
</html>

View File

@ -0,0 +1,4 @@
<map id="/home/bradarant/barant/BMAMail/__IMAP_AUTHENTICATE.h" name="/home/bradarant/barant/BMAMail/__IMAP_AUTHENTICATE.h">
<area shape="rect" id="node2" href="$_i_m_a_p_service_8h.html" title="/home/bradarant/barant\l/BMAMail/IMAPService.h" alt="" coords="46,95,217,136"/>
<area shape="rect" id="node3" href="$main_8cpp.html" title="/home/bradarant/barant\l/BMAMail/main.cpp" alt="" coords="53,184,209,225"/>
</map>

View File

@ -0,0 +1 @@
5aefedb62eaf0aa8df6f0ec27f6197bd

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

View File

@ -0,0 +1,4 @@
<map id="/home/bradarant/barant/BMAMail/__IMAP_AUTHENTICATE.h" name="/home/bradarant/barant/BMAMail/__IMAP_AUTHENTICATE.h">
<area shape="rect" id="node2" href="$_i_m_a_p_command_8h.html" title="IMAPCommand.h" alt="" coords="129,95,255,121"/>
<area shape="rect" id="node5" href="$_i_m_a_p_session_8h.html" title="IMAPSession.h" alt="" coords="254,169,367,196"/>
</map>

View File

@ -0,0 +1 @@
62ff7e3fdbdb1928db6d124adecf1185

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

View File

@ -0,0 +1,82 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.13"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>BMAMail: /home/bradarant/barant/BMAMail/__IMAP_AUTHENTICATE.h Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectalign" style="padding-left: 0.5em;">
<div id="projectname">BMAMail
&#160;<span id="projectnumber">1.0.0</span>
</div>
<div id="projectbrief">E-Mail System</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.13 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search",false,'Search');
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
$(function() {
initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
</script>
<div id="main-nav"></div>
</div><!-- top -->
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
</div>
<div class="header">
<div class="headertitle">
<div class="title">/home/bradarant/barant/BMAMail/__IMAP_AUTHENTICATE.h</div> </div>
</div><!--header-->
<div class="contents">
<a href="_____i_m_a_p___a_u_t_h_e_n_t_i_c_a_t_e_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span>&#160;<span class="preprocessor">#ifndef ____IMAP_AUTHENTICATE_h__</span></div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span>&#160;<span class="preprocessor"># define ____IMAP_AUTHENTICATE_h__</span></div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span>&#160;</div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160;<span class="preprocessor"># include &quot;<a class="code" href="_i_m_a_p_command_8h.html">IMAPCommand.h</a>&quot;</span></div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160;<span class="preprocessor"># include &quot;<a class="code" href="_i_m_a_p_session_8h.html">IMAPSession.h</a>&quot;</span></div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160;</div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160;<span class="keyword">namespace </span><a class="code" href="namespacemail.html">mail</a> {</div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160; </div><div class="line"><a name="l00009"></a><span class="lineno"><a class="line" href="classmail_1_1_____i_m_a_p___a_u_t_h_e_n_t_i_c_a_t_e.html"> 9</a></span>&#160; <span class="keyword">class </span><a class="code" href="classmail_1_1_____i_m_a_p___a_u_t_h_e_n_t_i_c_a_t_e.html">__IMAP_AUTHENTICATE</a> : <span class="keyword">public</span> <a class="code" href="classmail_1_1_i_m_a_p_command.html">IMAPCommand</a> {</div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160; </div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160; <span class="keywordtype">int</span> processCommand(coreutils::PString request, <a class="code" href="classmail_1_1_i_m_a_p_session.html">IMAPSession</a> &amp;session, std::stringstream &amp;data) { </div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160; data &lt;&lt; <span class="stringliteral">&quot;250 OK&quot;</span> &lt;&lt; <a class="code" href="_s_m_t_p_session_8h.html#a6cb23a858b0a21bdaa644b9181dc415f">CRLF</a>;</div><div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160; }</div><div class="line"><a name="l00014"></a><span class="lineno"> 14</span>&#160; </div><div class="line"><a name="l00015"></a><span class="lineno"> 15</span>&#160; };</div><div class="line"><a name="l00016"></a><span class="lineno"> 16</span>&#160; </div><div class="line"><a name="l00017"></a><span class="lineno"> 17</span>&#160;}</div><div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160;</div><div class="line"><a name="l00019"></a><span class="lineno"> 19</span>&#160;<span class="preprocessor">#endif</span></div><div class="ttc" id="_i_m_a_p_command_8h_html"><div class="ttname"><a href="_i_m_a_p_command_8h.html">IMAPCommand.h</a></div></div>
<div class="ttc" id="namespacemail_html"><div class="ttname"><a href="namespacemail.html">mail</a></div><div class="ttdef"><b>Definition:</b> __IMAP_APPEND.h:7</div></div>
<div class="ttc" id="classmail_1_1_____i_m_a_p___a_u_t_h_e_n_t_i_c_a_t_e_html"><div class="ttname"><a href="classmail_1_1_____i_m_a_p___a_u_t_h_e_n_t_i_c_a_t_e.html">mail::__IMAP_AUTHENTICATE</a></div><div class="ttdef"><b>Definition:</b> __IMAP_AUTHENTICATE.h:9</div></div>
<div class="ttc" id="classmail_1_1_i_m_a_p_command_html"><div class="ttname"><a href="classmail_1_1_i_m_a_p_command.html">mail::IMAPCommand</a></div><div class="ttdef"><b>Definition:</b> IMAPCommand.h:10</div></div>
<div class="ttc" id="_s_m_t_p_session_8h_html_a6cb23a858b0a21bdaa644b9181dc415f"><div class="ttname"><a href="_s_m_t_p_session_8h.html#a6cb23a858b0a21bdaa644b9181dc415f">CRLF</a></div><div class="ttdeci">#define CRLF</div><div class="ttdef"><b>Definition:</b> SMTPSession.h:7</div></div>
<div class="ttc" id="_i_m_a_p_session_8h_html"><div class="ttname"><a href="_i_m_a_p_session_8h.html">IMAPSession.h</a></div></div>
<div class="ttc" id="classmail_1_1_i_m_a_p_session_html"><div class="ttname"><a href="classmail_1_1_i_m_a_p_session.html">mail::IMAPSession</a></div><div class="ttdef"><b>Definition:</b> IMAPSession.h:6</div></div>
</div><!-- fragment --></div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.8.13
</small></address>
</body>
</html>

View File

@ -0,0 +1,111 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.13"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>BMAMail: /home/bradarant/barant/BMAMail/__IMAP_CHECK.h File Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectalign" style="padding-left: 0.5em;">
<div id="projectname">BMAMail
&#160;<span id="projectnumber">1.0.0</span>
</div>
<div id="projectbrief">E-Mail System</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.13 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search",false,'Search');
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
$(function() {
initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
</script>
<div id="main-nav"></div>
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
</div>
</div><!-- top -->
<div class="header">
<div class="summary">
<a href="#nested-classes">Classes</a> &#124;
<a href="#namespaces">Namespaces</a> </div>
<div class="headertitle">
<div class="title">/home/bradarant/barant/BMAMail/__IMAP_CHECK.h File Reference</div> </div>
</div><!--header-->
<div class="contents">
<div class="textblock"><code>#include &quot;<a class="el" href="_i_m_a_p_command_8h_source.html">IMAPCommand.h</a>&quot;</code><br />
<code>#include &quot;<a class="el" href="_i_m_a_p_session_8h_source.html">IMAPSession.h</a>&quot;</code><br />
</div><div class="textblock"><div class="dynheader">
Include dependency graph for __IMAP_CHECK.h:</div>
<div class="dyncontent">
<div class="center"><img src="_____i_m_a_p___c_h_e_c_k_8h__incl.png" border="0" usemap="#_2home_2bradarant_2barant_2_b_m_a_mail_2_____i_m_a_p___c_h_e_c_k_8h" alt=""/></div>
<map name="_2home_2bradarant_2barant_2_b_m_a_mail_2_____i_m_a_p___c_h_e_c_k_8h" id="_2home_2bradarant_2barant_2_b_m_a_mail_2_____i_m_a_p___c_h_e_c_k_8h">
<area shape="rect" id="node2" href="_i_m_a_p_command_8h.html" title="IMAPCommand.h" alt="" coords="129,95,255,121"/>
<area shape="rect" id="node5" href="_i_m_a_p_session_8h.html" title="IMAPSession.h" alt="" coords="254,169,367,196"/>
</map>
</div>
</div><div class="textblock"><div class="dynheader">
This graph shows which files directly or indirectly include this file:</div>
<div class="dyncontent">
<div class="center"><img src="_____i_m_a_p___c_h_e_c_k_8h__dep__incl.png" border="0" usemap="#_2home_2bradarant_2barant_2_b_m_a_mail_2_____i_m_a_p___c_h_e_c_k_8hdep" alt=""/></div>
<map name="_2home_2bradarant_2barant_2_b_m_a_mail_2_____i_m_a_p___c_h_e_c_k_8hdep" id="_2home_2bradarant_2barant_2_b_m_a_mail_2_____i_m_a_p___c_h_e_c_k_8hdep">
<area shape="rect" id="node2" href="_i_m_a_p_service_8h.html" title="/home/bradarant/barant\l/BMAMail/IMAPService.h" alt="" coords="18,95,189,136"/>
<area shape="rect" id="node3" href="main_8cpp.html" title="/home/bradarant/barant\l/BMAMail/main.cpp" alt="" coords="25,184,181,225"/>
</map>
</div>
</div>
<p><a href="_____i_m_a_p___c_h_e_c_k_8h_source.html">Go to the source code of this file.</a></p>
<table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
Classes</h2></td></tr>
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classmail_1_1_____i_m_a_p___c_h_e_c_k.html">mail::__IMAP_CHECK</a></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table><table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="namespaces"></a>
Namespaces</h2></td></tr>
<tr class="memitem:namespacemail"><td class="memItemLeft" align="right" valign="top"> &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacemail.html">mail</a></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table>
</div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.8.13
</small></address>
</body>
</html>

View File

@ -0,0 +1,4 @@
<map id="/home/bradarant/barant/BMAMail/__IMAP_CHECK.h" name="/home/bradarant/barant/BMAMail/__IMAP_CHECK.h">
<area shape="rect" id="node2" href="$_i_m_a_p_service_8h.html" title="/home/bradarant/barant\l/BMAMail/IMAPService.h" alt="" coords="18,95,189,136"/>
<area shape="rect" id="node3" href="$main_8cpp.html" title="/home/bradarant/barant\l/BMAMail/main.cpp" alt="" coords="25,184,181,225"/>
</map>

View File

@ -0,0 +1 @@
a2880e4fcfb4fa8de1a024671205822a

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

View File

@ -0,0 +1,4 @@
<map id="/home/bradarant/barant/BMAMail/__IMAP_CHECK.h" name="/home/bradarant/barant/BMAMail/__IMAP_CHECK.h">
<area shape="rect" id="node2" href="$_i_m_a_p_command_8h.html" title="IMAPCommand.h" alt="" coords="129,95,255,121"/>
<area shape="rect" id="node5" href="$_i_m_a_p_session_8h.html" title="IMAPSession.h" alt="" coords="254,169,367,196"/>
</map>

View File

@ -0,0 +1 @@
6caede9e0cd14de85fe7fb0dc70e152b

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Some files were not shown because too many files have changed in this diff Show More