一封邮件称为一个MimeEntity, 具体由两部分组成: Header 和 Body。 重要接口
class MimeEntity
{
public:
Header& header(); //得到header
const Header& header() const;
Body& body(); //得到body
const Body& body() const;
template
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类的继承体系如下:
struct Header: public Rfc822Header: public std::deque
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是指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是所有的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
struct Group: public FieldValue, public std::vector
struct DateTime: public FieldValue
struct AddressList: public FieldValue, public std::vector
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
有一些Field可能包含一些param, 这些param有特定的作用, 不能无视; 因此有些FieldValue的子类中包含数据成员 typedef std::list
如content-type field, 可能包含charset, boundary, name等; contentdisposition field可能包含filename, size等param
其中的FieldParam也是由name-value构成的pair、 name大小写不敏感。
Body的继承体系是:
class Body: public Rfc822Body, typedef std::string Rfc822Body;
Body类的主要成员:
class Body: public Rfc822Body
{
public:
bool load(const std::string&); //加载一个文本字符串, 解析成Body格式
template
bool load(const std::string&, const Codec&);
template
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
attachment也是一个MimeEntity, 针对各种具体的content-type, 有不同的MimeEntity子类
对Body、subject field, from field, filename param等进行编解码。
已提供两种编解码方式。
Base64::Encoder, Base64::Decoder, 在base64之间转换
QP::Encoder, QP::Decoder, 在quoted-printable之间转换
====charset=gb2312等之类的,需要自己转。因为协议中没有规定这块。?
struct IteratorParser; 该类是主要的邮件内部解析类, 作用是将字符文本流的数据, 按照mime协议解析成对应的各部分
20110316==============================
cout << entity.body() 可能为空
但是body可能会有内容, 比如multipart
=========================
entity.body().length() == 0 时, body部分仍然可能是有内容的。。。。。