last year I was asked to modify an existing cgiemail to 
work a bit differently... 
Instead I wrote a a workalike replacement (it was quicker) 
-- I still don't think anyone knows.

I here is a cleaned up version of what I am using 
I hope I did not introduce any tyops.



#! /private/bin/rebol -csq
rebol[
        Author: "Tom Conlin"
        Date: 2001-Jul-19
        File: %cgiemail.cgi
        purpose: {
            drop-in replacement for MIT's standard cgiemail 
            with a couple of tweaks.
            First does not use sendmail which was improperly 
            translating email addressed from a vitual hostname 
            to the machine name when it was not asked to.
            (caused problems in out particular case)
 
            Second I am also saving a log of each transaction 
            to a file. (because I was told to)
 
            the basic idea is that with this program
            you can validate and email arbitary forms
            by writing your forms using certain conventions
            and having a text template of the email you would
            like to be sent to various people when the form is submitted.
 
            
            their doc: 
            http://web.mit.edu/wwwdev/cgiemail/
            their source ~100k <snicker>: 
            http://www.mit.edu/afs/net.mit.edu/reference/source/web-cgi/
       }
]
;;; see: hhtp://www.rebol.com for free "rebol/core" interperter

print "Content-Type: text/html^/"

;;; Edit these to suit your enviroment

accept-domain: <domain-your-form-is-on> ;otherwise you may end up a
spammer
maintainer-email: <your-email-adress>
set-net [maintainer-email <mailhost.your.domain> none none none]

; only used if you are writing out a log 
lock-file: %/path-to-your-lockfile
output-file:    %/path-to-your-logfile


;;; TO-DO read a local config file that contains domains to accept
;;; template files from

;;; url-decode and parse the string into a block of name-value pairs
cgi: copy ""
either system/options/cgi/request-method = "POST"[
        ;;; read the block of name = value pairs
        ;;; see how long the string we need to read is
        len: load system/options/cgi/content-length

        ;;; make an empty string that is long enough
        ;;; read the string from stdin
        buffer: make string! (:len + 8)
        while [not zero? read-io system/ports/input buffer :len]
                [append  cgi buffer clear buffer]
        ]
        [   either system/options/cgi/request-method = "GET"
            [cgi: copy system/options/cgi/query-string]
            [print "implement command line testing already"]
        ]
        cgi: decode-cgi cgi
        keyval: copy []
        foreach x cgi [append/only keyval to-string :x ]

        ;;; check-that the template is from somwhere we have agreed to
read from
        ;;; this really needs to be done some better way
        if not find (select keyval "template") accept-domain[
            print "we are coming to get you now" q
        ]

        template: read to-url (select keyval "template")

        placeholders: copy []
        ;alfa: charset {#"A"=#"Z" #"a"-#"z"}

        mark: copy ""
        parse template [
                any [ (mark: copy  "")
                        to "[" copy mark thru "]"
                        (append placeholders mark)
                ]
                to end
        ]
        sort/compare placeholders func[a b][(length? a ) > (length? b )]

        ;;; replace the place holders in the template with the values from
the cgi
        foreach [k v] keyval [
                k: rejoin[ "[" :k "]" ]
                if all[ (equal? v "") (equal? copy/part k 10
"[required_") ][
                        v: rejoin[ {<font color="red">**} :k {</font>} ]
                ]
                replace/all template k v
        ]

        ;;; balk if a required field is missing
        if find template {<font color="red">**[required_}[
                template: copy next find template "^/^/"
                print
{<html>
        <head>
                <title>Failed</title>
        </head>
        <body>
                <h1> Required fields missing</h1>
                <b>Please go back and fill in all required fields</b><p>
}
                print replace/all template "^/" "<br>^/"
                print "</body></html>"
                quit
        ]
        ;;; remove leftover place holders
        ;;; such as those attached to unchecked checkboxes
        foreach ph placeholders[ replace/all template ph ""]



;;; strip the header info out of the template
;;; build a block of addressed to send to
addy: copy/part next find template ":"  find template "^/"
template: copy next find template "^/"
frm: load copy/part next find template ":"  find template "^/"
template: copy next find template "^/"
sbj: copy/part next find template ":"  find template "^/"
template: copy next find template "^/"
;;; clean off the top of the template
while [(pick template 1) = "^/" ][remove template]

foreach ad parse addy "," [
                ;;; build a mail header
                header: make system/standard/email [
                        To:     ad
                        From:   frm
                        Subject: sbj
           ]
           send/header to-email ad template header
]


;;; append a copy of the email to a logfile

;;; make sure only one cgi writes to the file at a time
while [not error? try[read lock-file]][wait 2]
write  lock-file ""
write/append  output-file rejoin ["# "now/date "--" now/time "^/"]
write/append  output-file template
delete lock-file

;;; output the happy ending version
print read to-url (select keyval "success")

-- 
To unsubscribe from this list, please send an email to
[EMAIL PROTECTED] with "unsubscribe" in the 
subject, without the quotes.

Reply via email to