mimetic notes

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的类型是istringistringstring类继承得到, 作比较操作时大小写不敏感, 存取字符串时进行了格式化)。

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是所有的Fieldvalue字段的基类。因为不同的field value有不同的类型, 比如:

date field value是日期;

from field valueaddress 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, sizeparam

其中的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

Bodysubject 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部分仍然可能是有内容的。。。。。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值