?? smtp.cpp
字號:
// ========================================================
// ePlug SMTP protocol implementation
//
// Design and implementation by:
// - Floris van den Berg
// ========================================================
#include <string>
#include "..\ETransport.h"
#include "mail.h"
// --------------------------------------------------------
struct ProtocolData {
TRANSPORT_HANDLE plug;
char data[8192];
int data_size;
int data_pos;
};
// --------------------------------------------------------
static void *DLL_CALLCONV
ProtocolCreate(TRANSPORT_HANDLE plug) {
ProtocolData *prot_data = new ProtocolData;
memset(prot_data, 0, sizeof(ProtocolData));
prot_data->plug = plug;
return prot_data;
}
static bool DLL_CALLCONV
ProtocolReceive(void *self, unsigned char *data, int size) {
ProtocolData *prot_data = (ProtocolData *)self;
EpInheritedRecv(prot_data->plug, data, size);
/*
// copy the data into the buffer
memcpy(prot_data->data + prot_data->data_size, data, size);
prot_data->data_size += size;
// search for 0x0D's. if found we found a valid SMTP reply
int i = 0;
int pos = 0;
// strip any pending 0x0A and 0x0D chars
while (pos < prot_data->data_size) {
if ((prot_data->data[pos] != 0x0A) && (prot_data->data[pos] != 0x0D))
break;
++pos;
}
// search for the next 0x0A or 0x0D
while (pos + i < prot_data->data_size) {
if ((prot_data->data[pos + i] == 0x0A) || (prot_data->data[pos + i] == 0x0D)) {
int char_before_delimiter = (pos + i) - 4;
// search a bit further for more 0x0As or 0x0Ds
while (pos + i < prot_data->data_size) {
if ((prot_data->data[pos + i] != 0x0A) && (prot_data->data[pos + i] != 0x0D))
break;
++i;
}
// grab the first number from the buffer
char number_ascii[4] = { 0, 0, 0, 0 };
memcpy(number_ascii, prot_data->data + pos, 3);
// grab the message data
char msg_data[8192];
memset(msg_data, 0, 8192);
memcpy(msg_data, prot_data->data + pos + 4, char_before_delimiter);
// allocate an ePlug event
EpEvent pm_event;
pm_event.reference_id = 0;
pm_event.protocol = CLSID_SMTP_PROTOCOL;
pm_event.size = strlen(msg_data) + 1;
pm_event.data = (unsigned char *)msg_data;
pm_event.timeout = 0;
// post an event for the reply number
switch (atoi(number_ascii)) {
case 211 :
pm_event.msg = SMTP_REPLY_SYSTEM_STATUS;
break;
case 214 :
pm_event.msg = SMTP_REPLY_HELP_MESSAGE;
break;
case 220 :
pm_event.msg = SMTP_REPLY_SERVICE_READY;
break;
case 221 :
pm_event.msg = SMTP_REPLY_SERVICE_CLOSING;
break;
case 250 :
pm_event.msg = SMTP_REPLY_REQUESTED_MAIL_COMPLETED;
break;
case 251 :
pm_event.msg = SMTP_REPLY_USER_FORWARDED;
break;
case 354 :
pm_event.msg = SMTP_REPLY_START_MAIL_INPUT;
break;
case 421 :
pm_event.msg = SMTP_REPLY_SERVICE_NOT_AVAILABLE;
break;
case 450 :
pm_event.msg = SMTP_REPLY_MAILBOX_BUSY;
break;
case 451 :
pm_event.msg = SMTP_REPLY_LOCAL_ERROR_IN_PROCESSING;
break;
case 452 :
pm_event.msg = SMTP_REPLY_INSUFFICIENT_STORAGE;
break;
case 500 :
pm_event.msg = SMTP_REPLY_COMMAND_UNREGOGNIZED;
break;
case 501 :
pm_event.msg = SMTP_REPLY_INVALID_PARAMETERS;
break;
case 502 :
pm_event.msg = SMTP_REPLY_COMMAND_NOT_IMPLEMENTED;
break;
case 503 :
pm_event.msg = SMTP_REPLY_MAILBOX_UNAVAILABLE;
break;
case 504 :
pm_event.msg = SMTP_REPLY_PARAMETER_NOT_IMPLEMENTED;
break;
case 550 :
pm_event.msg = SMTP_REPLY_MAILBOX_UNAVAILABLE;
break;
case 551 :
pm_event.msg = SMTP_REPLY_USER_NOT_LOCAL;
break;
case 552 :
pm_event.msg = SMTP_REPLY_EXCEEDED_STORAGE_ALLOCATION;
break;
case 553 :
pm_event.msg = SMTP_REPLY_MAILBOX_NAME_NOT_ALLOWED;
break;
case 554 :
pm_event.msg = SMTP_REPLY_TRANSACTION_FAILED;
break;
};
// post event
EpDispatchEvent(prot_data->plug, &pm_event);
// move message from queue
memcpy(prot_data->data, prot_data->data + i, prot_data->data_size - i);
prot_data->data_size -= i;
i = 0;
break;
} else {
++i;
}
}
*/
return true;
}
static bool DLL_CALLCONV
ProtocolSend(void *self, EpAction *action){
ProtocolData *prot_data = (ProtocolData *)self;
switch(action->msg) {
case SMTP_MAIL_FROM :
{
std::string s = std::string("MAIL FROM:<") + std::string((char *)action->data) + std::string(">\r\n");
EpCompleteAction(prot_data->plug, (unsigned char *)s.c_str(), s.length());
break;
}
};
return true;
}
static void DLL_CALLCONV
ProtocolDestroy(void *self) {
delete (ProtocolData *)self;
}
// --------------------------------------------------------
SMTP_API CLSID DLL_CALLCONV
EpSMTPProtocolInit(Protocol *protocol) {
protocol->create = ProtocolCreate;
protocol->destroy = ProtocolDestroy;
protocol->receive = ProtocolReceive;
protocol->send = ProtocolSend;
return CLSID_SMTP_PROTOCOL;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -