MimeEntity

一封邮件称为一个MimeEntity, 具体由两部分组成: Header 和 Body。 重要接口

class MimeEntity

{

public:

Header& header();                 //得到header

const Header& header() const;

Body& body();                    //得到body

const Body& body() const;

template<typename Iterator>

void load(Iterator, Iterator, int mask = imNone);

void load(std::istream&, int mask = imNone);  //从文件中读取并加载、解析成MimeEntity

bool hasField(const std::string&) const;       //判断header中是否有某个field

protected:

Header m_header;

Body m_body;

};

Header

Header类的继承体系如下:

struct Header:    public  Rfc822Header:    public std::deque<Field>

Header对象按出现出现顺序,将邮件的header部分的每个name-value pair都放入deque中

其中Rfc822Header包含如下name-value pair:

Sender, from, to, subject, replyto, cc, bcc, messageid

Header类中又新增了如下几个name-value pair:

mimeVersion, contentType, contentTransferEncoding, contentDisposition, contented

header类中的接口主要是存取上述name-value pair的

Field

Field是指Header部分中的name-value pair。 Name不区分大小写,因此name的类型是istring(istring从string类继承得到, 作比较操作时大小写不敏感, 存取字符串时进行了格式化)。

Field类主要成员如下:

struct Field

{

void name(const std::string&);

const istring& name() const;

void value(const std::string&);

std::string value() const;

private:

istring m_name;

FieldValue* m_pValue;

};

FieldValue

FieldValue是所有的Field的value字段的基类。因为不同的field, 其value有不同的类型, 比如:

date field, 其value是日期;

from field, 其value是address list;

content-type field, 其value是固定的字符串、有其特定含义。

有如下几个子类:

struct MessageId: public FieldValue

struct Mailbox: public FieldValue

struct MailboxList: public FieldValue, public std::vector<Mailbox>

struct Group: public FieldValue, public std::vector<Mailbox>        in rfc822

struct DateTime: public FieldValue

struct AddressList: public FieldValue, public std::vector<Address>

struct Address: public FieldValue

struct MimeVersion: public Version, public FieldValue

class ContentType: public FieldValue

struct ContentId: public FieldValue

struct ContentDisposition: public FieldValue

struct ContentDescription: public FieldValue

FieldParamList

有一些Field可能包含一些param, 这些param有特定的作用, 不能无视; 因此有些FieldValue的子类中包含数据成员 typedef std::list<FieldParam> FieldParamList;

如content-type field, 可能包含charset, boundary, name等; contentdisposition field可能包含filename, size等param

其中的FieldParam也是由name-value构成的pair、 name大小写不敏感。

Body

Body的继承体系是:

class Body: public Rfc822Body, typedef std::string Rfc822Body;

Body类的主要成员:

class Body: public Rfc822Body

{

public:

bool load(const std::string&);        //加载一个文本字符串, 解析成Body格式

template<typename Codec>

bool load(const std::string&, const Codec&);

template<typename Codec>

bool code(const Codec&);          //对Body施以编解码Codec指定的转换

void preamble(const std::string&);   //存取Body的前序

const std::string& preamble() const;

std::string& preamble();

void epilogue(const std::string&);    //存取Body的尾序

const std::string& epilogue() const;

std::string& epilogue();

MimeEntityList& parts();          //Body的主干部分是一个MimeEntity list!!!!

const MimeEntityList& parts() const;

protected:

MimeEntity* m_owner;

MimeEntityList m_parts;

std::string m_preamble, m_epilogue;

};

typedef std::list<MimeEntity*> MimeEntityList;

attachment也是一个MimeEntity, 针对各种具体的content-type, 有不同的MimeEntity子类

Codec

对Body、subject field, from field, filename param等进行编解码。

已提供两种编解码方式。

Base64::Encoder, Base64::Decoder, 在base64之间转换

QP::Encoder, QP::Decoder,        在quoted-printable之间转换

====charset=gb2312等之类的,需要自己转。因为协议中没有规定这块。?

IteratorParser

struct IteratorParser; 该类是主要的邮件内部解析类, 作用是将字符文本流的数据, 按照mime协议解析成对应的各部分

20110316==============================

cout << entity.body()  可能为空
但是body可能会有内容, 比如multipart
=========================
entity.body().length() == 0 时, body部分仍然可能是有内容的。。。。。

mimetic notes相关推荐

  1. 【 Notes 】ML ALGORITHMS of TOA - Based Positioning

    这篇博文和NLS方法博文行文思路类似:[ Notes ]NLS ALGORITHMS of TOA - Based Positioning ML方法是NLS方法的一个推广版本,具体接着看: Assum ...

  2. Scipy Lecture Notes学习笔记(一)Getting started with Python for science 1.2. The Python language

    Scipy Lecture Notes学习笔记(一)Getting started with Python for science 1.2. The Python language 1.2.2. 基本 ...

  3. 在Notes客户端如何打开隐藏视图

    问题描述: 在Domino 数据库中, 数据库设计者可以将视图设置为隐藏视图, 当视图被设置为隐藏视图后, 用户在打开数据库时无法看到这一视图. 那么, 用户是否可以在Notes 客户端中打开隐藏视图 ...

  4. Notes客户端重新配置批处理

    把以下代码拷贝到记事本,并保持为:Notes客户端初始化设置.bat 格式 @echo off cd "d:\lotus\notes\data" del desktop6.ndk ...

  5. boost learn notes

    <?xml version="1.0" encoding="utf-8"?> boost learn notes boost learn notes ...

  6. Lotus Notes常见问题答疑

    Lotus Domino/Notes是目前最为流行的文档数据库系统之一,作为群件系统,它利用自身强大的功能使其在企业.政府办公自动化方面的应用越来越广.以下总结了一些Notes开发和管理的常见问题,希 ...

  7. 在Linux系统下如何运行notes客户端

    由于IBM公司还没有Linux版本的notes客户端,所以在Linux下运行notes客户端比较困难.现在通过CrossOver Office软件可以实现这个任务. 大多使用Linux的人都对WINE ...

  8. Lotus Notes中文档查询的研究与实践

    一.引言 近几年,网络技术得到飞速的发展,由此带动其它领域的相应快速发展,如WWW技术.办公自动化技术等,这些技术把以计算机网络为传输手段的信息交换技术大大向前推进一步,使人们收集.传输和共享信息的方 ...

  9. Lotus Notes应用经验谈

    LOTUS公司发布的群件产品-LOTUS NOTES是办公系统软件的成功应用案例之一,它凝结了企业级电子邮件.分布式文档数据库与快速应用开发等三位一体的强大技术,完全集成了INTERNET技术,提供给 ...

最新文章

  1. 高可用 Prometheus 架构实践中的踩坑集锦
  2. 数字测图原理与方法的实习日志_【技术】消费级无人机倾斜摄影测量1:500测图方法及精度研究...
  3. lesson5 元组
  4. virtualbox cannot access the kernel driver的解决办法
  5. LPWA技术:发展物联网的最佳选择
  6. linux里面i386 i686 i486 i586代表什么?是什么意思
  7. git安装包国内镜像下载地址,速度快
  8. 基于JAVA+SpringMVC+Mybatis+MYSQL的医院在线预约挂号系统
  9. sql操作mysql数据库_一些常用的操作MySQL数据库的sql语句
  10. Bailian4097 报站【暴力】
  11. oracle xp安装详细步骤
  12. 如何提升Java应用程序性能
  13. 英特尔发布全新英特尔® INDE 2015工具套件
  14. 【机器学习-周志华】学习笔记-第十章
  15. web前端基础知识 - CSS语言和功能
  16. 流量卡之家:物联网和人工智能如何实现环境可持续性
  17. mysql 查询当前时间到毫秒_MySQL 关于毫秒和微秒的处理,MySQL获取毫秒!
  18. 完整版代码(亲测可用),给网站加上访客统计—你是第位访客
  19. 微信朋友圈+html+字体颜色,微信新功能 酷炫的彩色微信名字 朋友圈彩色昵称设置方法...
  20. android:ListView的局部刷新

热门文章

  1. 什么是数据产品经理?需要什么能力?有哪些相关书籍可以读?
  2. iClient for Leaflet通过点击实现切换地图中心点定位
  3. 【图的同构识别】算法设计与分析实验2
  4. 光学系统的几种F数及与相对孔径的关系
  5. 女朋友存了好多网上的男明星的照片,我准备用python全部换成我的脸
  6. 全国职业院校技能大赛网络建设与运维赛项赛题(二)
  7. LeetCode刷题笔记 动态规划 背包问题
  8. itk registration 13
  9. 【递归】整数划分(C++)
  10. 【PR】来,一起做一个简单的剪辑视频吧