let rec parse_message s =
try
let pos_sep = Str.search_forward re_nl_nl s 0 in
let headers = parse_header (String.sub s 0 pos_sep) in
let body = String.sub s (pos_sep + 2) (String.length s - pos_sep - 2) in
let encoding = find_header "content-transfer-encoding:" headers in
let ctype = find_header "content-type:" headers in
if Str.string_match re_multipart ctype 0 then begin
let boundary =
try
Str.matched_group 2 ctype
with Not_found -> try
Str.matched_group 3 ctype
with Not_found ->
assert false in
let re_bound =
Str.regexp ("--" ^ Str.quote boundary ^ "[ \t\n]*") in
match Str.split_delim re_bound body with
[] ->
{ headers = headers;
body = decode encoding body;
parts = [] }
| blurb :: parts ->
{ headers = headers;
body = decode encoding blurb;
parts = List.map parse_message parts }
end else
{ headers = headers;
body = decode encoding body;
parts = [] }
with Not_found ->
{ headers = [];
body = s;
parts = [] }