[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