一、libetpan邮件解析结构体
如下:
struct mailmime {
/* parent information */
int mm_parent_type;
struct mailmime * mm_parent;
clistiter * mm_multipart_pos;
int mm_type;
const char * mm_mime_start;
size_t mm_length;
struct mailmime_fields * mm_mime_fields;
struct mailmime_content * mm_content_type;
struct mailmime_data * mm_body;
union {
/* single part */
struct mailmime_data * mm_single; /* XXX - was body */
/* multi-part */
struct {
struct mailmime_data * mm_preamble;
struct mailmime_data * mm_epilogue;
clist * mm_mp_list;
} mm_multipart;
/* message */
struct {
struct mailimf_fields * mm_fields;
struct mailmime * mm_msg_mime;
} mm_message;
} mm_data;
};
三种聚合类型
分别是:
enum {
MAILMIME_NONE,
MAILMIME_SINGLE,
MAILMIME_MULTIPLE,
MAILMIME_MESSAGE
};
1、单一部分(MAILMIME_SINGLE)
内容就是一个普通的实体(例如:纯文本 text/plain
,HTML text/html
,或者一个附件 application/pdf
)等,没有再嵌套子部分。
例如:
Content-Type: text/plain; charset="utf-8"
Hello, this is a simple email.
2、多部分(MAILMIME_MULTIPLE)
多部分 表示这是一个 容器,里面有多个子 MIME 部分,每个部分都有自己的 Content-Type
常见的 multipart 类型:
-
multipart/alternative
→ 同一内容的不同表现形式(纯文本 + HTML)。 -
multipart/mixed
→ 正文 + 附件。 -
multipart/related
→ HTML 正文 + 内嵌图片。
例如如下是一个混合部分:
Content-Type: multipart/mixed; boundary="XYZ"
--XYZ
Content-Type: text/plain
Hello, this is the text version.
--XYZ
Content-Type: text/html
<html><body><b>Hello</b>, this is the HTML version.</body></html>
--XYZ
Content-Type: application/pdf
Content-Disposition: attachment; filename="file.pdf"
...binary pdf data...
--XYZ--
分别有 纯文本、带格式文本和附件pdf部分。
3、嵌套消息/完整的消息 (message/rfc822) (MAILMIME_MESSAGE)
表示当前 MIME 部分本身是一个完整的邮件消息(RFC 822 格式),相当于在邮件里再嵌了一封邮件。常见于:转发邮件、邮件投递失败报告 (DSN)。
Content-Type: message/rfc822
From: someone@example.com
To: you@example.com
Subject: Forwarded mail
This is the forwarded message.