邮件解析笔记

一、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.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值