summaryrefslogtreecommitdiff
path: root/lib/net/smtp.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/net/smtp.rb')
-rw-r--r--lib/net/smtp.rb128
1 files changed, 128 insertions, 0 deletions
diff --git a/lib/net/smtp.rb b/lib/net/smtp.rb
new file mode 100644
index 0000000000..9f534c20c0
--- /dev/null
+++ b/lib/net/smtp.rb
@@ -0,0 +1,128 @@
+#
+# smtp.rb version 1.0.1
+#
+# author Minero Aoki <aamine@dp.u-netsurf.ne.jp>
+#
+
+require 'net/session'
+
+
+module Net
+
+ class SMTPSession < Session
+
+ def proto_initialize
+ @proto_type = SMTPCommand
+ @port = 25
+ end
+
+ def sendmail( mailsrc, fromaddr, toaddrs )
+ @proto.mailfrom( fromaddr )
+ @proto.rcpt( toaddrs )
+ @proto.data
+ @proto.sendmail( mailsrc )
+ end
+
+
+ private
+
+
+ def do_start( helodom = nil )
+ unless helodom then
+ helodom = ENV[ 'HOSTNAME' ]
+ end
+ @proto.helo( helodom )
+ end
+
+ def do_finish
+ @proto.quit
+ end
+
+ end
+
+ SMTP = SMTPSession
+
+
+
+ class SMTPCommand < Command
+
+ def helo( fromdom )
+ @socket.writeline( 'HELO ' << fromdom )
+ check_reply( SuccessCode )
+ end
+
+
+ def mailfrom( fromaddr )
+ @socket.writeline( 'MAIL FROM:<' + fromaddr + '>' )
+ check_reply( SuccessCode )
+ end
+
+
+ def rcpt( toaddrs )
+ toaddrs.each do |i|
+ @socket.writeline( 'RCPT TO:<' + i + '>' )
+ check_reply( SuccessCode )
+ end
+ end
+
+
+ def data
+ @socket.writeline( 'DATA' )
+ check_reply( ContinueCode )
+ end
+
+
+ def sendmail( mailsrc )
+ @socket.write_pendstr( mailsrc )
+ check_reply( SuccessCode )
+ end
+
+
+ private
+
+
+ def do_quit
+ @socket.writeline( 'QUIT' )
+ check_reply( SuccessCode )
+ end
+
+
+ def get_reply
+ arr = read_reply
+ stat = arr[0][0,3]
+
+ cls = UnknownCode
+ case stat[0]
+ when ?2 then cls = SuccessCode
+ when ?3 then cls = ContinueCode
+ when ?4 then cls = ServerBusyCode
+ when ?5 then
+ case stat[1]
+ when ?0 then cls = SyntaxErrorCode
+ when ?5 then cls = FatalErrorCode
+ end
+ end
+
+ return cls.new( stat, arr.join('') )
+ end
+
+
+ def read_reply
+ arr = []
+
+ while (str = @socket.readline)[3] == ?- do # ex: "210-..."
+ arr.push str
+ end
+ arr.push str
+
+ return arr
+ end
+
+ end
+
+
+ unless Session::Version == '1.0.1' then
+ $stderr.puts "WARNING: wrong version of session.rb & smtp.rb"
+ end
+
+end