[mel-base-devel] multipart messages and pop3

Jochen Schmidt jsc at crispylogics.com
Thu Apr 16 13:52:46 UTC 2009


Am 16.04.2009 um 14:28 schrieb Timothy Ritchey <tritchey at mac.com>:

> I'm having an issue extracting the parts of messages, particularly
> when trying to work with pop3 folders. I am wondering if I am doing
> something wrong. I am trying to extract any text/plain, or text/plain
> alternative from emails. The following works when I pass it an imaps
> folder, but mel:parts hangs when I pass it a pop3 folder. When I break
> it, it is hanging out in compute-bodystructure-using-folder, waiting
> on a stream.
>
> Am I grabbing messages the right way?

It could well be a bug - I've not tested it, but actually it may be a  
better idea to fetch the messages from the POP3 server into a local  
maildir folder and then use that for further processing. POP3 is quite  
braindead and doesn't really lean to well accessing messages randomly.  
Due to the lazy caching nature of mel-base there would probably be  
multiple fetches of a single mail in POP3.

What you try to do seems to be what mel-base does in FIND-VIEWABLE- 
PART (see multiparts.lisp).

ciao
Jochen

>
> (defun find-plain-text (message)
>   (let ((parts (mel:parts message))
>    (body "Unable to process email contents"))
>     (dolist (p parts)
>       (multiple-value-bind (a b) (mel:content-type p)
>    (if (and (equal a :TEXT) (equal b :PLAIN))
>        (let ((b (mel:part-body-string p)))
>          (handler-case
>          (setf body (mel:decode-quoted-printable b))
>        (t ()
>          (setf body b))))
>      (progn
>        (when (and (equal a :MULTIPART) (equal b :ALTERNATIVE))
>          (find-plain-text p))))))
>     body))
>
> (defun check-email (folder)
>   (let* ((messages (mel:messages folder)))
>     (dolist (message messages)
>       (format t "~a~%" (find-plain-text message)))))
>
> I can call the following on the same message from the pop3 folder, and
> get the raw contents fine.
>
> (defmethod body (message)
>   (with-output-to-string (str)
>     (with-open-stream (stream (mel:message-body-stream message))
>       (loop for c = (read-char stream nil nil)
>     while c do (write-char c str)))))
>
> Any help would be appreciated.
>
> - T
>
>
> _______________________________________________
> mel-base-devel mailing list
> mel-base-devel at common-lisp.net
> http://common-lisp.net/cgi-bin/mailman/listinfo/mel-base-devel

--
Jochen Schmidt
CRISPYLOGICS
Uhlandstr. 9, 90408 Nürnberg

Fon: +49 (0)911 517 999-82
Fax: +49 (0)911 517 999-83

mailto:info at crispylogics.com
http://www.crispylogics.com



More information about the mel-base-devel mailing list