diff options
Diffstat (limited to 'doc/scriptexamples/mail.kvs')
-rw-r--r-- | doc/scriptexamples/mail.kvs | 159 |
1 files changed, 159 insertions, 0 deletions
diff --git a/doc/scriptexamples/mail.kvs b/doc/scriptexamples/mail.kvs new file mode 100644 index 00000000..94fb70e2 --- /dev/null +++ b/doc/scriptexamples/mail.kvs @@ -0,0 +1,159 @@ +# This is a really basic mail sender script +# It uses exec and a telnet slave process +# You will probably need to hack it a bit since +# most mail servers will simply refuse to +# send so spam-looking mail :D + +# Ah... remember that spamming creates bad karma. + + +# exec a telnet slave. +# Since we want to make sure that it does not run for too long, +# we give it 60 seconds to complete the operations + +exec -x -k=60000 -t -e ("telnet my.mail.server.com 25") +{ + # We keep the state in the %:state extended scope variable + + if($0 == "started") + { + # This is the first event triggered + # Initialize our variables... + echo [process started] + %:state = 0 + # This is the source address as specified in the MAIL command + %:from = "<me@me.com>" + %:rcpt = "<me@me.com>" + # This is the From field + %:sender = "\"Me\" <me@me.com>" + %:receiver = "\"Me\" <me@me.com>" + %:body = "Hello, this is a test mesage for the small KVIrc mail script$cr$lf" + %:body .= "I hope that you have fun writing in kvs :)))" + %:subject = "This is a test subject" + # Returning an empty string does not write to stdin + return + } + + if($0 == "stderr") + { + # This is our stderr handler.. just in case something goes wrong + echo "[stderr] $1" + return + } + + if($0 == "terminated") + { + echo "[process terminated]" + return + } + + # Ok.. this must be a stdout data event + # Echo the line to the user + echo "[stdout] $1" + + # And make our little state machine work + switch(%:state) + { + case(0): + { + # We're waiting for 220 (ready) + if($str.match("220*",$1)) + { + # Send the HELO and go to next state + %:state++ + echo "Sending HELO..." + return "HELO myhostname$cr$lf"; + } + } + break + case(1): + { + # Waiting for 250 (after the HELO) + if($str.match("250*",$1)) + { + # Send the MAIL command + %:state++ + echo "Sending MAIL..." + return "MAIL From: %:from$cr$lf" + } else { + # The server replied with something that is not a 250... + # Fail :/ + echo "HELO command not accepted: $1" + halt + } + } + break; + case(2): + { + # Waiting for another 250 (MAIL accepted) + if($str.match("250*",$1)) + { + # ... + %:state++ + echo "Sending RCPT..." + return "RCPT To: %:rcpt$cr$lf" + } else { + echo "MAIL command not accepted: $1" + halt + } + } + break; + case(3): + { + # Waiting for another 250 (RCPT accepted) + if($str.match("250*",$1)) + { + %:state++ + echo "Sending DATA..." + return "DATA$cr$lf" + } else { + echo "RCPT not accepted: $1" + halt + } + } + break; + case(4): + { + # Waiting for 354 (ok, go on) + if($str.match("354*",$1)) + { + # You will probably need to hack in the Date: field :) + %:state++ + echo "Sending body..." + %x = "From: %:sender$cr$lf" + %x .= "To: %:receiver$cr$lf" + %x .= "Subject: %:subject$cr$lf" + %x .= "Reply-To: %:sender$cr$lf" + %x .= "Date: Thu, 8 Apr 2004 05:28:01 +0200$cr$lf" + %x .= "X-Mailer: KVIrc funky KVS script$cr$lf" + %x .= "$cr$lf" + %x .= "%:body$cr$lf$cr$lf" + %x .= ".$cr$lf" + return %x + } else { + echo "DATA not accepted: $1" + halt + } + } + break; + case(5): + { + # We don't wait anymore :) + %:state++ + echo "Sending QUIT..." + return "QUIT$cr$lf" + } + break; + default: + { + # Usually the mail server closes the connection + %:state++ + if(%:state > 10) + { + # But if it does not in few messages + # Then force the process to die + halt + } + } + } +}
\ No newline at end of file |