summaryrefslogtreecommitdiff
path: root/decoders/mail/mail_imap.h
diff options
context:
space:
mode:
Diffstat (limited to 'decoders/mail/mail_imap.h')
-rw-r--r--decoders/mail/mail_imap.h123
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);
+
+
+