Compilable SMTP
This commit is contained in:
1 parent
6c844983d9
commit
e1f33291f7
70 files changed
+308
-362
No files matched your search
+53
-58
@@ -1,5 +1,4 @@
|
||||
#include "__SMTP_DATA.h"
|
||||
#include "SMTPSession.h"
|
||||
#include "SMTPServer.h"
|
||||
#include "Log.h"
|
||||
#include <chrono>
|
||||
@@ -9,63 +8,60 @@
|
||||
|
||||
namespace mail {
|
||||
|
||||
int __SMTP_DATA::processCommand(coreutils::ZString &request, core::TCPSession &session) {
|
||||
|
||||
SMTPSession &s = dynamic_cast<SMTPSession &>(session);
|
||||
SMTPServer &server = session.server;
|
||||
int __SMTP_DATA::processCommand(coreutils::ZString &request, SMTPSession &session, SMTPServer &server) {
|
||||
|
||||
switch(session.mode) {
|
||||
|
||||
case WAIT_FOR_DATA:
|
||||
|
||||
switch(session.state) {
|
||||
|
||||
case RCPT:
|
||||
s.out << "354 Enter the mail message terminated by <CRLF>.<CRLF>" << CRLF;
|
||||
s.mailData.str("");
|
||||
s.mode = RECEIVE_DATA;
|
||||
server.commands.grabInput(&session, *this);
|
||||
// setTimer(120.0f);
|
||||
break;
|
||||
|
||||
case MAIL:
|
||||
s.out << "503 Please use RCPT first" << CRLF;
|
||||
break;
|
||||
|
||||
default:
|
||||
s.out << "503 Please use MAIL first" << CRLF;
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
switch(session.state) {
|
||||
|
||||
case RCPT:
|
||||
session.out << "354 Enter the mail message terminated by <CRLF>.<CRLF>" << CRLF;
|
||||
session.mailData.str("");
|
||||
session.mode = RECEIVE_DATA;
|
||||
grabInput(session);
|
||||
// setTimer(120.0f);
|
||||
break;
|
||||
|
||||
case RECEIVE_DATA:
|
||||
if(request.str() != ".")
|
||||
s.mailData << request.str() << CRLF;
|
||||
else {
|
||||
s.mode = WAIT_FOR_DATA;
|
||||
s.state = READY;
|
||||
server.commands.clearGrab(&session);
|
||||
// if(filterMessage(session.mailData)) {
|
||||
if(s.recipientList.size() > 0) {
|
||||
if(s.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 << ".";
|
||||
s.out << "250 OK Queued message " << ID << CRLF;
|
||||
}
|
||||
else
|
||||
s.out << "550 Mail message too big" << CRLF;
|
||||
} else
|
||||
s.out << "550 Mail message was empty" << CRLF;
|
||||
} else
|
||||
s.out << "250 OK Queued message " << CRLF;
|
||||
// } else
|
||||
// data << "550 Message is probably spam" << CRLF;
|
||||
}
|
||||
break;
|
||||
}
|
||||
return 1;
|
||||
|
||||
case MAIL:
|
||||
session.out << "503 Please use RCPT first" << CRLF;
|
||||
break;
|
||||
|
||||
default:
|
||||
session.out << "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;
|
||||
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 << ".";
|
||||
session.out << "250 OK Queued message " << ID << CRLF;
|
||||
}
|
||||
else
|
||||
session.out << "550 Mail message too big" << CRLF;
|
||||
} else
|
||||
session.out << "550 Mail message was empty" << CRLF;
|
||||
} else
|
||||
session.out << "250 OK Queued message " << CRLF;
|
||||
// } else
|
||||
// data << "550 Message is probably spam" << CRLF;
|
||||
}
|
||||
break;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
std::string __SMTP_DATA::generateMailFileName() {
|
||||
@@ -80,17 +76,16 @@ namespace mail {
|
||||
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());
|
||||
std::string newName = fileName + recipient;
|
||||
link(fileName.c_str(), newName.c_str());
|
||||
}
|
||||
|
||||
unlink(fileName.c_str());
|
||||
|
||||
return fileName;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user