101 lines
2.6 KiB
C++
101 lines
2.6 KiB
C++
#include "SendMail.h"
|
|
#include <chrono>
|
|
|
|
namespace mail {
|
|
|
|
SendMail::SendMail(core::EPoll &ePoll, std::string from, std::string recipient, std::string mailFileName)
|
|
: core::TCPSession2(ePoll, "Send Mail Agent"), from(from), recipient(recipient), mailFileName(mailFileName),
|
|
mailData(mailFileName), Timer(ePoll, 0.00f), ePoll(ePoll) {
|
|
|
|
core::IPAddress mxAddress("127.0.0.1", 9025);
|
|
|
|
connect(mxAddress);
|
|
ePoll.registerSocket((TCPSession2 *)(this));
|
|
|
|
coreutils::Log(coreutils::LOG_DEBUG_1) << "SendMail initiated...";
|
|
|
|
}
|
|
|
|
SendMail::~SendMail() {
|
|
ePoll.unregisterSocket((TCPSession2 *)(this));
|
|
coreutils::Log(coreutils::LOG_DEBUG_1) << "SendMail destructing...";
|
|
}
|
|
|
|
void SendMail::onTimeout() {
|
|
state = stateOnTimeout;
|
|
coreutils::Log(coreutils::LOG_DEBUG_1) << "onTimeout...";
|
|
protocol(buffer);
|
|
TCPSession2::send();
|
|
}
|
|
|
|
void SendMail::protocol(coreutils::ZString &data) {
|
|
|
|
coreutils::Log(coreutils::LOG_DEBUG_1) << "[" << data << "..." << state;
|
|
|
|
switch (state) {
|
|
|
|
case CONNECT:
|
|
// read recipient
|
|
// parse email for name and domain name
|
|
// open tcpsocket with connect
|
|
// wait for greeting
|
|
if(data.asInteger() == 220) {
|
|
out << "EHLO " << from << CRLF;
|
|
state = READY;
|
|
}
|
|
break;
|
|
|
|
case READY:
|
|
buffer = data;
|
|
setTimer(.05);
|
|
stateOnTimeout = READYX;
|
|
break;
|
|
|
|
case READYX:
|
|
if(buffer.asInteger() == 250) {
|
|
out << "MAIL FROM:<" << from << ">" << CRLF;
|
|
state = MAIL;
|
|
}
|
|
break;
|
|
|
|
case MAIL:
|
|
if(data.asInteger() == 250) {
|
|
out << "RCPT TO:<" << recipient << ">" << CRLF;
|
|
state = RCPT;
|
|
}
|
|
break;
|
|
|
|
case RCPT:
|
|
if(data.asInteger() == 250) {
|
|
out << "DATA" << CRLF;
|
|
state = DATA;
|
|
}
|
|
break;
|
|
|
|
case DATA:
|
|
if(data.asInteger() == 354) {
|
|
while(!mailData.eof()) {
|
|
mailData.readLine();
|
|
out << mailData.asZString() << CRLF;
|
|
}
|
|
out << "." << CRLF;
|
|
state = SENT;
|
|
}
|
|
break;
|
|
|
|
case SENT:
|
|
if(data.asInteger() == 250) {
|
|
out << "QUIT" << CRLF;
|
|
}
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
std::vector<coreutils::MString>& SendMail::extractRecipientList() {
|
|
return recipientList;
|
|
}
|
|
|
|
}
|