caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
* [Caml-list] Netmime: splitting email attachments
@ 2004-01-20 13:12 Johann Spies
  2004-01-21 15:21 ` Gerd Stolpmann
  0 siblings, 1 reply; 2+ messages in thread
From: Johann Spies @ 2004-01-20 13:12 UTC (permalink / raw)
  To: caml-list

I have asked a similar question on ocaml_beginners, but did not get
any reaction.

I want to split attachments containing messages I want to feed to
SA-learn into different files.  I have spent hours now to try and
understand the documentation of netmime and family of classes/modules.
I would appreciate some help please. Fortunately I saw one or two
examples in the documentation which helped me so far.

I have come so far:

# let readmessage f = Netmime.read_mime_message (new Netstream.input_stream (new Netchannels.input_channel (open_in f)));;
val readmessage : string -> Netmime.complex_mime_message = <fun>
# let ss = readmessage "/tmp/aa" ;;
val ss : Netmime.complex_mime_message =
  (<obj>,
  `Parts
    [(<obj>, `Body <obj>); (<obj>, `Body <obj>); (<obj>, `Body <obj>);
     (<obj>, `Body <obj>); (<obj>, `Body <obj>)])
# let a,b = ss;;
val a : Netmime.mime_header = <obj>
val b : Netmime.complex_mime_body =
  `Parts
    [(<obj>, `Body <obj>); (<obj>, `Body <obj>); (<obj>, `Body <obj>);
     (<obj>, `Body <obj>); (<obj>, `Body <obj>)]

What I want to do is to save each of the "Parts" in "b" in a seperate
file.  But I don't know how to proceed to get the contents of the
list.  In other words how do I get the tuples in "b" as strings? 

Regards
Johann

-- 
Johann Spies          Telefoon: 021-808 4036
Informasietegnologie, Universiteit van Stellenbosch

     "Neither is there salvation in any other; for there is 
      none other name under heaven given among men, whereby 
      we must be saved."               Acts 4:12 

-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [Caml-list] Netmime: splitting email attachments
  2004-01-20 13:12 [Caml-list] Netmime: splitting email attachments Johann Spies
@ 2004-01-21 15:21 ` Gerd Stolpmann
  0 siblings, 0 replies; 2+ messages in thread
From: Gerd Stolpmann @ 2004-01-21 15:21 UTC (permalink / raw)
  To: Johann Spies; +Cc: caml-list

Am Die, 2004-01-20 um 14.12 schrieb Johann Spies:
> I have asked a similar question on ocaml_beginners, but did not get
> any reaction.
> 
> I want to split attachments containing messages I want to feed to
> SA-learn into different files.  I have spent hours now to try and
> understand the documentation of netmime and family of classes/modules.
> I would appreciate some help please. Fortunately I saw one or two
> examples in the documentation which helped me so far.
> 
> I have come so far:
> 
> # let readmessage f = Netmime.read_mime_message (new Netstream.input_stream (new Netchannels.input_channel (open_in f)));;
> val readmessage : string -> Netmime.complex_mime_message = <fun>
> # let ss = readmessage "/tmp/aa" ;;
> val ss : Netmime.complex_mime_message =
>   (<obj>,
>   `Parts
>     [(<obj>, `Body <obj>); (<obj>, `Body <obj>); (<obj>, `Body <obj>);
>      (<obj>, `Body <obj>); (<obj>, `Body <obj>)])
> # let a,b = ss;;
> val a : Netmime.mime_header = <obj>
> val b : Netmime.complex_mime_body =
>   `Parts
>     [(<obj>, `Body <obj>); (<obj>, `Body <obj>); (<obj>, `Body <obj>);
>      (<obj>, `Body <obj>); (<obj>, `Body <obj>)]
> 
> What I want to do is to save each of the "Parts" in "b" in a seperate
> file.  But I don't know how to proceed to get the contents of the
> list.  In other words how do I get the tuples in "b" as strings? 

The core of a solution for your problem:

let parts = 
  match b with `Parts l -> l | _ -> failwith "No attachments found";;

List.iter
  (function
     (head, `Body body) ->
        let ch_rd = body # open_value_rd() in
        let ch_wr = new Netchannels.output_channel (open_out "filename") in
        ch_wr # output_channel ch_rd;
        ch_wr # close_out();
        ch_rd # close_in();
    | _ ->
        (* Nested multipart message *)
        ()
  )
  parts

It is assumed that you are only interested in the bodies of the parts,
and not in the headers (otherwise one would use write_mime_message to
create the files). Of course, there is still the problem how to get the
filenames, which is a constant here.

Last but not least, there is the phenomenon of nested multipart
messages. By default, read_mime_message performs a deep analysis of the
message, and returns nested parts as nested values. You can change that
with the argument ~multipart_style:`Flat, which leaves inner multipart
parts unparsed.

Hope this helps,

Gerd
-- 
------------------------------------------------------------
Gerd Stolpmann * Viktoriastr. 45 * 64293 Darmstadt * Germany 
gerd@gerd-stolpmann.de          http://www.gerd-stolpmann.de
------------------------------------------------------------

-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2004-01-21 15:21 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2004-01-20 13:12 [Caml-list] Netmime: splitting email attachments Johann Spies
2004-01-21 15:21 ` Gerd Stolpmann

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).