[mel-base-devel] multipart messages and pop3
Timothy Ritchey
tritchey at mac.com
Thu May 14 04:17:54 UTC 2009
I've been able to pretty easily move files from a pop folder to a
local maildir:
(mel:move-folder folder tmp-folder)
(mel:map-recent-messages
(lambda (m) (format t "~a~%" (find-plain-text m))) tmp-folder)
The map-recent-messages gets through all of the messages in new, and
they are printed out okay, but then brings up the error below. As best
I can tell, it is trying to move the messages to the cur directory. I
am running a recent sbcl on OS X. Running map-messages gets me the
same error, but with a slightly different backtrace. Does anyone have
any ideas about what might be going on?
Cheers,
Tim R.
The value "1242273934.8901_1.localhost"
is not of type
(SIMPLE-ARRAY BASE-CHAR (*)).
[Condition of type TYPE-ERROR]
Restarts:
0: [RETRY] Retry SLIME REPL evaluation request.
1: [ABORT] Return to SLIME's top level.
2: [TERMINATE-THREAD] Terminate this thread (#<THREAD "new-repl-
thread" RUNNING {133154B9}>)
Backtrace:
0: ((SB-PCL::FAST-METHOD MEL.INTERNAL:FLAGP-USING-FOLDER
(MEL.FOLDERS.MAILDIR:MAILDIR-FOLDER T (EQL :RECENT))) ..)
1: ((SB-PCL::FAST-METHOD MEL.INTERNAL:UNMARK-MESSAGE-USING-FOLDER
(MEL.FOLDERS.MAILDIR:MAILDIR-FOLDER T (EQL :RECENT))) ..)
2: ((LAMBDA (SB-PCL::.PV. SB-PCL::.NEXT-METHOD-CALL. SB-PCL::.ARG0.
SB-PCL::.ARG1. SB-PCL::.ARG2.)) ..)
3: (SB-IMPL::%MAP-FOR-EFFECT-ARITY-1 #<FUNCTION (LAMBDA #)
{124D2DBD}> (#<MEL.PUBLIC:MIME-MESSAGE {1190C5C1}>))
4: ((SB-PCL::FAST-METHOD MEL.PUBLIC:MAP-RECENT-MESSAGES :AROUND (T
MEL.PUBLIC:BASIC-FOLDER)) ..)
5: (SB-INT:SIMPLE-EVAL-IN-LEXENV (CHECK-EMAIL) #<NULL-LEXENV>)
On Apr 16, 2009, at 9:52 AM, Jochen Schmidt wrote:
> 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