//
// Copyright (c) 2008, Brian Frank and Andy Frank
// Licensed under the Academic Free License version 3.0
//
// History:
// 2 May 08 Brian Frank Creation
//
**
** TextPart is used to model email parts with a text MIME type.
** The default is "text/plain".
**
@Serializable
class TextPart : EmailPart
{
**
** Text body of the email part.
**
Str text := ""
**
** Construct with default type of "text/plain".
**
new make()
{
headers["Content-Type"] = "text/plain"
headers["Content-Transfer-Encoding"] = "8bit"
}
**
** Validate this part - throw Err if not configured correctly:
** - text must be non-null
** - Content-Type must be defined
** - if Content-Type charset not defined, defaults to utf-8
** - Content-Transfer-Encoding must be 8bit unless using us-ascii
**
override Void validate()
{
super.validate
// check text
if ((Obj?)text == null) throw NullErr("text null in ${Type.of(this).name}")
// check content-type header
ct := headers["Content-Type"]
if (ct == null) throw Err("Must define Content-Type header")
// set charset to utf-8 if not explicit
mime := MimeType.fromStr(ct)
if (mime.params["charset"] == null)
headers["Content-Type"] = mime.toStr + "; charset=utf-8"
// require 8bit transfer unless us-ascii
if (headers["Content-Transfer-Encoding"] != "8bit")
{
if (MimeType.fromStr(ct).params["charset"] != "us-ascii")
throw Err("Content-Transfer-Encoding must be 8bit if not using charset=us-ascii")
}
}
**
** Encode as a MIME message according to RFC 822.
**
override Void encode(OutStream out)
{
// ensure valid and configure defaults
validate
// get charset
mime := MimeType.fromStr(headers["Content-Type"])
charset := Charset.fromStr(mime.params["charset"])
// write headers
super.encode(out)
// write text lines
out.charset = charset
in := text.in
in.eachLine |Str line|
{
if (line == ".") line = ". "
out.print(line).print("\r\n")
}
out.charset = Charset.utf8
out.print("\r\n")
}
}