I am trying to detach an attachment (.jpg image) from an e-mail using the 
script detach.r from the REBOL script library. Unfortunately, I am getting an 
error, as follows...

>> detach msg/content
starting decoding process...
** Script Error: find expected series argument of type
: series port bitset.
** Where: if boundary: find/tail boundary {boundary="}

In the 'msg/content, there is no {boundary="} statement. Instead, there is a {--
Message-Boundary-11825} statement.

My question is: Is my Pegasus e-mail client sending some non-standard 
"boundary" indicator? Is there any way to set this up so that the script will 
work with most e-mail clients?

I can't find any other information in the REBOL docs or examples about 
detaching e-mail attachments.

Thanks. Detailed msg/content and detach.r script information follows...

The msg/content looks as follows...

>> write %content.txt msg/content

--Message-Boundary-11825
Content-type: text/plain; charset=US-ASCII
Content-transfer-encoding: 7BIT
Content-description: Mail message body



--Message-Boundary-11825
Content-type: text/plain; charset=US-ASCII
Content-disposition: inline
Content-description: Attachment information.

The following section of this message contains a file attachment
prepared for transmission using the Internet MIME message format.
If you are using Pegasus Mail, or any another MIME-compliant system,
you should be able to save it or view it from within your mailer.
If you cannot, please ask your system administrator for assistance.

   ---- File information -----------
     File:  international.JPG
     Date:  9 Jun 2000, 14:24
     Size:  4072 bytes.
     Type:  JPEG-image

--Message-Boundary-11825
Content-type: Image/JPEG; name="international.JPG"
Content-disposition: attachment; filename="international.JPG"
Content-transfer-encoding: BASE64

/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9
PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhC
Y2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wAAR
CABbAGQDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAA
AgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkK
FhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWG
h4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl
5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREA
AgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYk
NOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOE
hYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk
5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD0CiiigAqOeeG2haa4ljhiX7zyMFUduSaw
tT1fUGnvrSwSKM23DScyytmMN8keACcsAMt+HNZi293L500kIuHti/nx3jGeY5OSiAfIuY2H
C8EkKemapRE3Y7IuBIseGywJB2nHGO/Qdenfn0NMiaUiQzpGgDHZtctlexOQMH25+tcXdalq
UcKaZpkj2yWASKZwqSPgkJEBkgEsMMegHr2qLUdZ1S31i0tZ7iNYy8RlYWz7sNuOwYLg9MfK
evQ8Gl3KSO4llzC4hliEu07C/Kg9sgHpWDdajdWqpZSzia4wZAwwXcDJBwhUAbgBzgEDaeua
bC51W0tZ45kiGEleIqH+bCuFJI46g9M9CCO8tppF5KEbULhSsRHkxI3mAcMMlyoOcNj1+Xkn
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
u5sZbHc4wPyp9FAgooooAKKKKAP/2Q==

--Message-Boundary-11825--


REBOL [
    Title:   "Save email attachments to disk"
    Date:    9-June-1999
    File:    %detach.r
    Author:  "Sterling Newton"
    Purpose: "Detach mail attachments"
    Usage:   "Detach message"
    Category: [email file util 4]
]

find-filename: func [headers [object!] /local file] [
    if error? try [file: to-file headers/content-description] [
        if error? try [
            file: to-file any [
                find/tail headers/content-type {name="}
                find/tail headers/content-disposition {name="}
            ]
            head remove back tail file
        ] [none]
    ]
    file
]

detach: func [
    {takes in the whole email text and returns a block of filenames 
and decoded base64 attachments present in the email}
    email [string!] 
    /local boundary body attached headers file
][
   print "starting decoding process..."
   headers: import-email email
   boundary: headers/content-type
   if boundary: find/tail boundary {boundary="} [
        remove back tail boundary
        print ["Boundary string:" boundary]
   ]
   either boundary [
        attached: make block! 2
        body: headers/content
        while [body: find/tail body boundary] [
            print ["Found message attachment; remaining length:" length? body]
            headers: parse-header system/standard/email skip body 1
            ; end of the message attachments?
            if find/match body "--" [print "attachents finished" break]
            file: copy/part headers/content find body: headers/content "^/--"
            either all [
                not error? try [headers/content-transfer-encoding] 
                find headers/content-transfer-encoding "base64"
            ] [ 
                print "about to decode..."
                insert file "64#{" append file "}"
                print ["Adding attachment; encoded length:" length? file]
                seek: file
                while [seek: find seek "^/"] [remove seek]
                append attached reduce [find-filename headers to-string load file]
            ] [ ; not base64 encoded... just add it directly
                append attached reduce [find-filename headers file]
            ]
        ]
        attached
    ] [none]
]

Reply via email to