There's at least 50 ways to do it because there's no "right" answer. You're losing semantic information when you go from HTML to plain text, so you have to be the judge of how lossy you want the transfer to be,
and what proxies you want to have in the text form for things that cannot be represented.
in reply to Re^2: Convert HTML Email message to plain text
in thread Convert HTML Email message to plain text
-- Randal L. Schwartz, Perl hacker
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in RFC 2119.