diff options
Diffstat (limited to 'decoders/mail/mail_imap.h')
| -rw-r--r-- | decoders/mail/mail_imap.h | 123 |
1 files changed, 123 insertions, 0 deletions
diff --git a/decoders/mail/mail_imap.h b/decoders/mail/mail_imap.h new file mode 100644 index 0000000..b90aa06 --- /dev/null +++ b/decoders/mail/mail_imap.h @@ -0,0 +1,123 @@ +#pragma once + +#include "mail_global.h" + +#define MAILIMAP4_MODULE "[MAIL_IMAP4]" + +#define RESPONSE_FETCH_MAX_LEN 32 //取得FETCH响应第2个空格最大长度 + +#define CONT_TYPE_TEXT 1 +#define CONT_TYPE_MESSAGE 2 +#define CONT_TYPE_RFC822 3 +#define CONT_TYPE_OTHER 4 + +//解析BODYSTRUCTURE一行时的过程状态 +typedef enum +{ + STAT_BLOCK_IDLE=0, + STAT_BLOCK_START, + STAT_BLOCK_PROC, + STAT_BLOCK_END, +}STAT_BODYSTRUCT_t; + +//multipart块所有的字段顺序 +typedef enum +{ + MULTI_SUBTYPE=0, + MULTI_PARENTHESIS, //参数组合列表;从该字段往后都是扩展字段 + MULTI_DISPOSITION, + MULTI_LANGUAGE, + MULTI_LOCATION, + MULTI_NUM, +}MULTI_FIELD_t; + +//非multipart块所有的字段顺序 +typedef enum +{ + NOTMUL_TYPE=0, + NOTMUL_SUBTYPE, + NOTMUL_PARENTHESIS, + NOTMUL_ID, + NOTMUL_DESCR, /*5*/ + NOTMUL_ENCODE, + NOTMUL_SIZE, + NOTMUL_EVENLOP, //MESSAGE/RFC822独有,从该字段往后都是扩展字段 + NOTMUL_BODYSTRUCT, //MESSAGE/RFC822独有 + NOTMUL_LINES, //主类型NOTMUL_TYPE为"TEXT"或类型为MESSAGE/RFC822才有该字段; + NOTMUL_MD5, + NOTMUL_DISPOSITION, /*10*/ + NOTMUL_LANGUAGE, + NOTMUL_LOCATION, + NOTMUL_NUM, +}NOTMUL_FIELD_t; + +#define IMAP_OK_CMD_LEN 30 //IMAP协议FETCH响应结束的长度,如"B00964 OK Fetch completed" +#define IMAP_LABEL_OK_MAX_LEN 100 + +//邮件命令编号从20开始 +typedef enum IMAP_CMD_STATE +{ + IMAP_CMD_ANS=20, + IMAP_CMD_FETCH_ANS, //不需要进行复位的响应 + IMAP_CMD_DATA_END, + IMAP_CMD_MAYBE_END, //遇到")\r\n"的状态 + IMAP_CMD_NOT_END, //判断上一次')'结束标记IMAP_CMD_MAYBE_END不是真正的结束 + IMAP_CMD_DATA_CONTINUE, //按字节获取邮件的后续块 + IMAP_CMD_DATA_BORDER, //来的是一个块的开始,是BODY内容 + IMAP_CMD_DROP, //处理一个标号块时发现有附件名,回调业务层之后业务层给DROP + IMAP_CMD_UNKNOWN, +}IMAP_CMD_STATE_t; + +//为body/bodystructure解析设置的哈希节点 +typedef struct __mime_item +{ + stBufCache mime_header; //用于存储构造MIME头部 + char charset[MAIL_MAX_CHARSET_LEN]; + char filename_charset[MAIL_MAX_CHARSET_LEN]; + char *attach_filename; + char *boundary; + int filename_len; + int bound_len; + int trans_enc; //传输编码 + int is_multi; //是否是MULTIPART块 + int thread_id; +}mime_item_t; + +enum IMAP_COMMAND { + IMAP_COMMAND_UNKNOWN, + IMAP_COMMAND_CAPABILITY , + IMAP_COMMAND_NOOP , + IMAP_COMMAND_LOGOUT , + IMAP_COMMAND_Client , + IMAP_COMMAND_STARTTLS , + IMAP_COMMAND_AUTHENTICATE , + IMAP_COMMAND_LOGIN , + IMAP_COMMAND_Client , + IMAP_COMMAND_SELECT , + IMAP_COMMAND_EXAMINE , + IMAP_COMMAND_CREATE , + IMAP_COMMAND_DELETE , + IMAP_COMMAND_RENAME , + IMAP_COMMAND_SUBSCRIBE , + IMAP_COMMAND_UNSUBSCRIBE , + IMAP_COMMAND_LIST , + IMAP_COMMAND_LSUB , + IMAP_COMMAND_STATUS , + IMAP_COMMAND_APPEND , + IMAP_COMMAND_Client , + IMAP_COMMAND_CHECK , + IMAP_COMMAND_CLOSE , + IMAP_COMMAND_EXPUNGE , + IMAP_COMMAND_SEARCH , + IMAP_COMMAND_FETCH , + IMAP_COMMAND_STORE , + IMAP_COMMAND_COPY , + IMAP_COMMAND_UID, + IMAP_COMMAND_MAX, +}; + +int imap_identify(const char *payload, size_t payload_len, int is_c2s); +int imap_parser_process(struct pop3_parser *parser, struct session *sess, const char *payload, size_t payload_len, int is_c2s); + + + |
