REBOL [
    Title: "esend - smtp client"
    Author: "RT, G. Scott Jones"
    Email: gjones05@m...
    Date: 21-Apr-2001
    File: %esend.r
    Version: 0.1.0
    Purpose: "A modified version of 'send for ESMTP"
    History: [
        0.1.0 [21-Apr-2001 "Modified RT 'send" "GSJ"]
    ]
    Comment: {The bulk of this code is simply a copy
  of Rebol Technolgies' code in /Core 2.5.0.3.1.
  The only changes I made are as follows.  I changed
  the name of the function in order to distinquish this
  version of 'send that uses an extended smtp scheme from
  the original.  The additional change is that 'esend uses
  'esmtp scheme, which is located in a separate file.  I
  chose to use separate function name and scheme inorder
  to avoid incompatibilty or confusion with Rebol
  Techologies' current or future implementations.  This
  version is known to work with Microsoft Exchange Server
  5.5, using base 64 encoded authentication.
  --Scott Jones (21-Apr-2001)
 }
    Usage: {Place this file in your REBOL directory, along with a
  copy of esmtp.r.  At either the interpreter prompt or the
  user.r file, type:
   do %esmtp.r ;separate file
   do %esend.r
  Then use 'esend as you would use 'send.  The first time
  the function is used, you will be prompted for the smtp
  authentication username and password.  These values are
  stored in clear text in the current REBOL session for
  later usage, but the values are not saved to disk for
  security reasons.
 }
    library: [
        level: none 
        platform: none 
        type: 'protocol 
        domain: [email protocol] 
        tested-under: none 
        support: none 
        license: none 
        see-also: none
    ]
]

esend: func [
 {Send a message to an address (or block of addresses)}
 address [email! block!] "An address or block of addresses"
 message "Text of message. First line is subject."
 /only "Send only one message to multiple addresses"
 /header "Supply your own custom header"
 header-obj [object!] "The header to use"
/local smtp-port content do-send
][
 do-send: func [port data] [
  foreach item reduce data [
   if string? item [replace/all item "^/." "^/.."]]
   insert port reduce data
 ]
 smtp-port: open [scheme: 'esmtp]
 if email? address [address: reduce [address]]
 message: content: either string? message [copy message] [mold message]
 if not header [
  header-obj: make system/standard/email [
   subject: copy/part message any [find message newline 50]
  ]
 ]
 if none? header-obj/from [
  if none? header-obj/from: system/user/email [net-error "Email header not set: no from address"]
 ]
 if none? header-obj/to [header-obj/to: make string! 20]
 if none? header-obj/date [header-obj/date: to-idate now]
 either only [
  do-send smtp-port ["MAIL FROM: <" header-obj/from ">"]
  foreach addr address [
   if email? addr [
    do-send smtp-port ["RCPT TO: <" addr ">"]
   ]
  ]
  insert insert message net-utils/export header-obj newline
  do-send smtp-port ["DATA" message]
 ][
  foreach addr address [
   if email? addr [
    do-send smtp-port ["MAIL FROM: <" header-obj/from ">"]
    do-send smtp-port ["RCPT TO: <" addr ">"]
    head insert clear header-obj/to addr
    remove/part message content
    content: insert message net-utils/export header-obj
    content: insert content newline
    do-send smtp-port ["DATA" message]
   ]
  ]
 ]
 close smtp-port
]