aboutsummaryrefslogtreecommitdiff
path: root/src/smtp.lua
diff options
context:
space:
mode:
authorDiego Nehab <diego@tecgraf.puc-rio.br>2003-03-20 00:24:44 +0000
committerDiego Nehab <diego@tecgraf.puc-rio.br>2003-03-20 00:24:44 +0000
commit53857360bb1ca9cd2080b69d930763ae59db9b06 (patch)
tree6c1bc6d6462695cf9048801b2244f7fd0cd21ad5 /src/smtp.lua
parent7da19138e37c4e0123860f1fecbceb80c3d2627d (diff)
downloadluasocket-53857360bb1ca9cd2080b69d930763ae59db9b06.tar.gz
luasocket-53857360bb1ca9cd2080b69d930763ae59db9b06.tar.bz2
luasocket-53857360bb1ca9cd2080b69d930763ae59db9b06.zip
Finish port to Lua 5. Everything is working fine.
Still doesn't work in Windows.
Diffstat (limited to 'src/smtp.lua')
-rw-r--r--src/smtp.lua21
1 files changed, 11 insertions, 10 deletions
diff --git a/src/smtp.lua b/src/smtp.lua
index 774dddb..5da9a6f 100644
--- a/src/smtp.lua
+++ b/src/smtp.lua
@@ -8,7 +8,7 @@
8----------------------------------------------------------------------------- 8-----------------------------------------------------------------------------
9 9
10local Public, Private = {}, {} 10local Public, Private = {}, {}
11SMTP = Public 11socket.smtp = Public
12 12
13----------------------------------------------------------------------------- 13-----------------------------------------------------------------------------
14-- Program constants 14-- Program constants
@@ -47,7 +47,7 @@ end
47----------------------------------------------------------------------------- 47-----------------------------------------------------------------------------
48function Private.try_receive(...) 48function Private.try_receive(...)
49 local sock = arg[1] 49 local sock = arg[1]
50 local data, err = call(sock.receive, arg) 50 local data, err = sock.receive(unpack(arg))
51 if err then sock:close() end 51 if err then sock:close() end
52 return data, err 52 return data, err
53end 53end
@@ -81,13 +81,13 @@ function Private.get_answer(control)
81 local line, err = Private.try_receive(control) 81 local line, err = Private.try_receive(control)
82 local answer = line 82 local answer = line
83 if err then return nil, err end 83 if err then return nil, err end
84 _,_, code, sep = strfind(line, "^(%d%d%d)(.)") 84 _,_, code, sep = string.find(line, "^(%d%d%d)(.)")
85 if not code or not sep then return nil, answer end 85 if not code or not sep then return nil, answer end
86 if sep == "-" then -- answer is multiline 86 if sep == "-" then -- answer is multiline
87 repeat 87 repeat
88 line, err = Private.try_receive(control) 88 line, err = Private.try_receive(control)
89 if err then return nil, err end 89 if err then return nil, err end
90 _,_, lastcode, sep = strfind(line, "^(%d%d%d)(.)") 90 _,_, lastcode, sep = string.find(line, "^(%d%d%d)(.)")
91 answer = answer .. "\n" .. line 91 answer = answer .. "\n" .. line
92 until code == lastcode and sep == " " -- answer ends with same code 92 until code == lastcode and sep == " " -- answer ends with same code
93 end 93 end
@@ -108,7 +108,7 @@ function Private.check_answer(control, success)
108 local answer, code = Private.get_answer(control) 108 local answer, code = Private.get_answer(control)
109 if not answer then return nil, code end 109 if not answer then return nil, code end
110 if type(success) ~= "table" then success = {success} end 110 if type(success) ~= "table" then success = {success} end
111 for i = 1, getn(success) do 111 for i = 1, table.getn(success) do
112 if code == success[i] then 112 if code == success[i] then
113 return code, answer 113 return code, answer
114 end 114 end
@@ -157,7 +157,7 @@ end
157-- answer: complete server reply or error message 157-- answer: complete server reply or error message
158----------------------------------------------------------------------------- 158-----------------------------------------------------------------------------
159function Private.send_mail(sock, sender) 159function Private.send_mail(sock, sender)
160 local param = format("FROM:<%s>", sender or "") 160 local param = string.format("FROM:<%s>", sender or "")
161 local err = Private.send_command(sock, "MAIL", param) 161 local err = Private.send_command(sock, "MAIL", param)
162 if err then return nil, err end 162 if err then return nil, err end
163 return Private.check_answer(sock, 250) 163 return Private.check_answer(sock, 250)
@@ -198,7 +198,7 @@ function Private.send_data(sock, headers, body)
198 local code, answer = Private.check_answer(sock, 354) 198 local code, answer = Private.check_answer(sock, 354)
199 if not code then return nil, answer end 199 if not code then return nil, answer end
200 -- avoid premature end in message body 200 -- avoid premature end in message body
201 body = gsub(body or "", "\n%.", "\n%.%.") 201 body = string.gsub(body or "", "\n%.", "\n%.%.")
202 -- mark end of message body 202 -- mark end of message body
203 body = body .. "\r\n.\r\n" 203 body = body .. "\r\n.\r\n"
204 err = Private.send_headers(sock, headers) 204 err = Private.send_headers(sock, headers)
@@ -220,8 +220,9 @@ function Private.send_rcpt(sock, rcpt)
220 local err 220 local err
221 local code, answer = nil, "No recipient specified" 221 local code, answer = nil, "No recipient specified"
222 if type(rcpt) ~= "table" then rcpt = {rcpt} end 222 if type(rcpt) ~= "table" then rcpt = {rcpt} end
223 for i = 1, getn(rcpt) do 223 for i = 1, table.getn(rcpt) do
224 err = Private.send_command(sock, "RCPT", format("TO:<%s>", rcpt[i])) 224 err = Private.send_command(sock, "RCPT",
225 string.format("TO:<%s>", rcpt[i]))
225 if err then return nil, err end 226 if err then return nil, err end
226 code, answer = Private.check_answer(sock, {250, 251}) 227 code, answer = Private.check_answer(sock, {250, 251})
227 if not code then return code, answer end 228 if not code then return code, answer end
@@ -242,7 +243,7 @@ function Private.open(server)
242 -- default server 243 -- default server
243 server = server or Public.SERVER 244 server = server or Public.SERVER
244 -- connect to server and make sure we won't hang 245 -- connect to server and make sure we won't hang
245 local sock, err = connect(server, Public.PORT) 246 local sock, err = socket.connect(server, Public.PORT)
246 if not sock then return nil, err end 247 if not sock then return nil, err end
247 sock:timeout(Public.TIMEOUT) 248 sock:timeout(Public.TIMEOUT)
248 -- initial server greeting 249 -- initial server greeting