There's an entrenched misconseption about what SMTP is.
Some libraries for popular programming languages (starting with PHP and
its mail() function) tried to blur the distinction between constructing
an e-mail message (what the MIME set of RFCs deals with) and sending it
to an SMTP server. The latter is a protocol for message *exchange,* and
it does no assumptions about what it transfers until that data is
properly formatted (SMTP is an ASCII-based protocol, so there are
concepts of lines, end-of-line sequences, maximum line length and the
way to signal to the server the data stream is over). You can use SMTP
to transfer anything which fits, with SOAP payloads being one popular
example (in the past).
I understand your frustration with the problem at hand, but Go is not
to blame here. In the light of what I explained, if we're to put
explanatory material on SMTP vs MIME in the smtp package docs, by the
same rule, we'll also need to discuss stream-oriented I/O in the io
package docs, discuss the semantics of datagrams when presenting the
functions for working with UDP in the net package and so on and so on.
Clearly, this is out of the scope of reference material.
So please read some background introductory material on MIME and SMTP,
and it will greatly help you to understand why the smtp package is
organised the way it is.