Thursday, 6 December 2012

Email server

An email server isn't an obscure software, is just a software that sort and deliver email. Yes, you are right, an email server in rebol is extremely easy, look here:
REBOL [
    Title: "Jobbot Email Server"
    Date: 8-Sep-1999
    File: %jobbot.r
    Author: "Carl Sassenrath"
    Purpose: {
        The email server we use for processing job related
        email.
    }
]
test-mode: off               ; test mode (no send/save)

;---Setup options and controls:
archive:   %msgs               ; directory to hold msgs
counter:   %msgcount.txt       ; message counter
sender:   jobs@rebol.com
manager:   carl@rebol.com
target:   [brenda@rebol.net carl@rebol.com]
insiders: [; don't send thank you to these people
    brenda@rebol.net
    brenda@rebol.com
    jobs@rebol.com
    carl@rebol.com
    carl@rebol.net
]
mailbox: open [;--- Setup mailbox message port object:
    scheme: 'pop
    host: "mail.rebol.net"
    user: "jobs"
    pass: load %theword.r
]
set-net [jobs@rebol.com mail.rebol.net]
if test-mode [;replace functions to prevent actual operation
    save: func [file data] [print ["saving file:" file]]
    send: func [to msgs] [print ["sending to:" to "From:" from]]
    resend: func [to from msg] [
        print ["resending to:" to "From:" from newline ];msg]
        ;confirm "Next?"
    ]
]
quit-mail: func [] [close mailbox quit]
thanks: {I got your message.
Thank you for contacting us at REBOL Technologies. We will
review your message soon.
-Jobbot
}

process-msg: func [raw-mail] [
    mail: import-email raw-mail
    if any [
        find first mail/from "MAILER-DAEMON"
        find first mail/from "postmaster"
        find first mail/from jobs@rebol
        find first mail/from list@rebol
        not any [
            find mail/to jobs@rebol.com
            find mail/to jobs@rebol.net
        ]
    ][probe mail/to exit]
    save counter count: count + 1
    save archive/:count raw-mail
    print [count "From:" mail/from "Subject:" mail/subject "Date:" mail/date]
    print who: first either mail/reply-to [mail/reply-to][mail/from]
    sub: insert find/tail raw-mail "Subject:" reduce [" #" count ": "]
    insert find sub newline reduce [newline "X-Tag: jobbot processed"]
    either find insiders who [print "internal" ][send who thanks ]
    foreach user target [resend user manager raw-mail]
]
do-jobbot: func [] [
    print now
    count: load counter
    if tail? mailbox [print "no mail" quit-mail]
    print [length? mailbox "new messages"]
    while [not tail? mailbox] [
        process-msg msg: first mailbox
        either test-mode [mailbox: next mailbox][remove mailbox]
    ]
    print [count "messages to date"]
    quit-mail
]
do-jobbot

No comments:

Post a Comment