###
7.3.2.5 `MMDFMessage`

class `MMDFMessage`( | [message])

  A message with MMDF-specific behaviors. Parameter message has the same meaning as with the `Message` constructor.

As with message in an mbox mailbox, MMDF messages are stored with the sender's address and the delivery date in an initial line beginning with "From ". Likewise, flags that indicate the state of the message are typically stored in Status: and X-Status: headers.

Conventional flags for MMDF messages are identical to those of mbox message and are as follows:

Flag | Meaning | Explanation
--- | --- | ---
R | Read | Read
O | Old | Previously detected by MUA
D | Deleted | Marked for subsequent deletion
F | Flagged | Marked as important
A | Answered | Replied to

The "R" and "O" flags are stored in the Status: header, and the "D", "F", and "A" flags are stored in the X-Status: header. The flags and headers typically appear in the order mentioned.

`MMDFMessage` instances offer the following methods, which are identical to those offered by `mboxMessage`:

`get_from`( | )

  Return a string representing the "From " line that marks the start of the message in an mbox mailbox. The leading "From " and the trailing newline are excluded.

`set_from`( | from_[, time_=None])

  Set the "From " line to from_, which should be specified without a leading "From " or trailing newline. For convenience, time_ may be specified and will be formatted appropriately and appended to from_. If time_ is specified, it should be a `struct_time` instance, a tuple suitable for passing to `time.strftime()`, or `True` (to use `time.gmtime()`).

`get_flags`( | )

  Return a string specifying the flags that are currently set. If the message complies with the conventional format, the result is the concatenation in the following order of zero or one occurrence of each of "`R`", "`O`", "`D`", "`F`", and "`A`".

`set_flags`( | flags)

  Set the flags specified by flags and unset all others. Parameter flags should be the concatenation in any order of zero or more occurrences of each of "`R`", "`O`", "`D`", "`F`", and "`A`".

`add_flag`( | flag)

  Set the flag(s) specified by flag without changing other flags. To add more than one flag at a time, flag may be a string of more than one character.

`remove_flag`( | flag)

  Unset the flag(s) specified by flag without changing other flags. To remove more than one flag at a time, flag maybe a string of more than one character.

When an `MMDFMessage` instance is created based upon a `MaildirMessage` instance, a "From " line is generated based upon the `MaildirMessage` instance's delivery date, and the following conversions take place:

Resulting state | `MaildirMessage` state
--- | ---
R flag | S flag
O flag | "cur" subdirectory
D flag | T flag
F flag | F flag
A flag | R flag

When an `MMDFMessage` instance is created based upon an `MHMessage` instance, the following conversions take place:

Resulting state | `MHMessage` state
--- | ---
R flag and O flag | no "unseen" sequence
O flag | "unseen" sequence
F flag | "flagged" sequence
A flag | "replied" sequence

When an `MMDFMessage` instance is created based upon a `BabylMessage` instance, the following conversions take place:

Resulting state | `BabylMessage` state
--- | ---
R flag and O flag | no "unseen" label
O flag | "unseen" label
D flag | "deleted" label
A flag | "answered" label

When an `MMDFMessage` instance is created based upon an `mboxMessage` instance, the "From " line is copied and all flags directly correspond:

Resulting state | `mboxMessage` state
--- | ---
R flag | R flag
O flag | O flag
D flag | D flag
F flag | F flag
A flag | A flag