An RFC 5322/2045 email address and MIME message parser written in pure MoonBit. Supports email address validation, MIME multipart parsing, and message serialization.
moon add Mr-Houjie/mbt-email///|
let msg = @Mr-Houjie/mbt-email.parse(input)git clone https://github.com/Mr-Houjie/mbt-email.git
cd mbt-email
moon build///|
let input = "From: alice@example.com\r\n" +
"To: bob@example.com\r\n" +
"Subject: Hello\r\n" +
"\r\n" +
"Hello, world!\r\n"
///|
let msg = @Mr-Houjie/mbt-email.parse(input)///|
let from = @Mr-Houjie/mbt-email.get_header(msg, "From")
///|
let subject = @Mr-Houjie/mbt-email.message_subject(msg)///|
let addrs = @Mr-Houjie/mbt-email.parse_address_list(
"Alice <a@example.com>, Bob <b@example.com>",
)///|
let msg = @Mr-Houjie/mbt-email.parse_mime(input)///|
let text = @Mr-Houjie/mbt-email.to_string(msg)moon run cmd/main| Function | Description |
|---|---|
| parse(input) | Parse raw email text into a Message |
| parse_mime(input) | Parse a MIME message with full multipart support |
| to_string(msg) | Serialize a Message back to RFC 5322 text |
| Function | Description |
|---|---|
| parse_address(input) | Parse a single user@domain address |
| parse_address_list(input) | Parse a comma-separated address list |
| parse_mailbox(input) | Parse a mailbox with optional display name |
| parse_mailbox_list(input) | Parse a mailbox list |
| validate_email_address(addr) / validate_domain / validate_local_part | Validate address components |
| address_to_string / mailbox_to_string | Format back to text |
| Function | Description |
|---|---|
| parse_content_type(value) | Parse a Content-Type header value |
| parse_content_disposition(value) | Parse a Content-Disposition value |
| collect_attachments(part) | Collect attachment MIME parts |
| part_filename(part) | Extract the filename of a part |
| plain_text(part) | Extract plain text from a MIME tree |
| message_content_type / message_boundary | Read a message's MIME info |
| Function | Description |
|---|---|
| decode_header_value(input) | Decode RFC 2047 encoded-words in a header |
| decode_encoded_word(input) | Decode a single encoded-word |
| decode_rfc2231_value / merge_extended_params | Decode RFC 2231 parameters |
| get_header / get_headers / has_header | Look up headers (case-insensitive) |
| Function | Description |
|---|---|
| parse_email_date(input) | Parse an RFC 5322 date-time |
| email_date_to_string / format_rfc5322_date | Format a date |
| to_timestamp / compare_dates | Date conversions |
| b64_encode_text / b64_decode_text / qp_encode_text / qp_decode | Transfer codecs |
| message_subject / message_from_mailboxes / message_cc_mailboxes | Message-level helpers |
| make_text_message / make_html_message / make_multipart_message | Build messages |
mbt-email/
├── lexer.mbt # Tokenizer (RFC 5322 / MIME tokens)
├── parser.mbt # Recursive-descent parser
├── ast.mbt # AST types (EmailAddress, Header, MimePart, Message)
├── serializer.mbt # AST → RFC 5322 text
├── address.mbt # Address & mailbox parsing
├── header.mbt # Header value decoding (RFC 2047 / 2231)
├── mime.mbt # Recursive multipart MIME parsing
├── codec.mbt # Base64 / Quoted-Printable codecs
├── datetime.mbt # RFC 5322 date-time
├── message.mbt # Message-level helpers
├── build.mbt # Message construction & serialization
├── utils.mbt # Utilities (UTF-8, HTML escaping, URL encoding)
└── cmd/main/ # CLI examplemoon buildmoon testpub struct EmailAddress {
local_part : String
domain : String
}pub struct EmailDate {
year : Int
month : Int
day : Int
hour : Int
minute : Int
second : Int
tz_hour : Int
tz_minute : Int
tz_sign : Int
}pub struct MessageId {
id : String
domain : String
}pub struct ReceivedInfo {
from_ : String
by : String
with_ : String
for_ : String
date : String
}pub enum Token {
HeaderName(String)
HeaderValue(String)
AtSign
Dot
Comma
Semicolon
Colon
Equals
LAngle
RAngle
RBracket
LParen
RParen
Slash
QuotedString(String)
Atom(String)
DomainLiteral(String)
Newline
EOF
Boundary(String)
}fn b64_decode_text(input : String) -> String?fn b64_encode_text(s : String) -> Stringfn canonical_charset(name : String) -> Stringfn collapse_ws(s : String) -> Stringfn count_encoded_words(input : String) -> Intfn days_in_month(year : Int, month : Int) -> Intfn decode_encoded_word(input : String) -> String?fn decode_header_value(input : String) -> Stringfn decode_rfc2231_value(input : String) -> String?fn email_date(year~ : Int, month~ : Int, day~ : Int, hour? : Int, minute? : Int, second? : Int, tz_hour? : Int, tz_minute? : Int, tz_sign? : Int) -> EmailDatefn encode_encoded_word_b(s : String) -> Stringfn encode_encoded_word_q(s : String) -> Stringfn encode_header_for_output(value : String) -> Stringfn eq_ignore_case(a : String, b : String) -> Boolfn fold_header_value(name : String, value : String) -> Stringfn generate_boundary(seed? : Int) -> Stringfn has_encoded_words(input : String) -> Boolfn hex_char_to_int(c : Char) -> Int?fn html_to_text(html : String) -> Stringfn html_unescape(s : String) -> Stringfn is_ascii_compatible_charset(name : String) -> Boolfn is_ascii_only(s : String) -> Boolfn is_printable_ascii(s : String) -> Boolfn make_html_message(from~ : String, to~ : String, subject~ : String, text_body~ : String, html_body~ : String) -> Messagefn make_text_message(from~ : String, to~ : String, subject~ : String, body~ : String, cc? : String) -> Messagefn percent_decode(input : String) -> String?fn qp_decode(input : String) -> String?fn qp_encode_text(s : String) -> Stringfn quote_header_string(s : String) -> Stringfn received_info(from_? : String, by? : String, with_? : String, for_? : String, date? : String) -> ReceivedInfofn sanitize_text(s : String) -> Stringfn simple_hash(s : String) -> Intfn starts_with_ignore_case(s : String, prefix : String) -> Boolfn strip_comments(input : String) -> Stringfn truncate(s : String, max_len : Int) -> Stringfn url_encode(s : String) -> Stringfn valid_header_name(name : String) -> Boolfn validate_domain(domain : String) -> Boolfn validate_local_part(local_part : String) -> BoolInstall
Download zipAn RFC 5322/2045 email address and MIME message parser written in pure MoonBit. Supports email address validation, MIME multipart parsing, and message serialization.