您的位置:首页 > 其它

5.8.2 格式处理流程

2016-04-07 14:32 148 查看
cleanup_service先调用cleanup_open初始化CLEANUP_STATE结构体,我们来看一下queue_name和handle字段的初始化:

state->queue_name= mystrdup(MAIL_QUEUE_INCOMING);

state->handle= mail_stream_file(state->queue_name,MAIL_CLASS_PUBLIC, var_queue_service,0);

MAIL_QUEUE_INCOMING宏即字符串“incoming”,cleanup模块将数据直接放入incoming队列中。handle字段为3.8.3中的MAIL_STREAM流,这里cleanup模块与文件系统交互,所以使用mail_stream_file生成流。而mail_stream_file不只会打开文件流,还通过cleanup_service->cleanup_open->mail_stream_file->mail_stream_finish_file->mail_trigger->fifo_trigger的调用链完成了触发qmgr模块的工作。这个“触发”向qmgr模块写入了宏TRIGGER_REQ_WAKEUP:

mail_trigger(info->class,info->service, wakeup, sizeof(wakeup));

第三个参数wakeup即

static charwakeup[] = {TRIGGER_REQ_WAKEUP};

#defineTRIGGER_REQ_WAKEUP 'W' /* wakeup */

qmgr模块的回调函数qmgr_trigger_event对这个情况不处理,即qmgr模块回调函数qmgr_trigger_event的

caseTRIGGER_REQ_WAKEUP:

处理项为空。

cleanup_service接着调用回调函数cleanup_envelope_process重写邮件:

CLEANUP_RECORD(state,type, vstring_str(buf), VSTRING_LEN(buf));

该宏执行对邮件文本格式化的回调函数:

#defineCLEANUP_RECORD(s, t, b, l) ((s)->action((s),(t), (b), (l)))

cleanup_envelope_process调用cleanup_addr_recipient,cleanup_addr_sender,cleanup_message_headerbody等函数分别对发件人、收件人、邮件正文进行重写。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: