diff options
author | Diego Nehab <diego@tecgraf.puc-rio.br> | 2003-03-20 00:24:44 +0000 |
---|---|---|
committer | Diego Nehab <diego@tecgraf.puc-rio.br> | 2003-03-20 00:24:44 +0000 |
commit | 53857360bb1ca9cd2080b69d930763ae59db9b06 (patch) | |
tree | 6c1bc6d6462695cf9048801b2244f7fd0cd21ad5 /src/smtp.lua | |
parent | 7da19138e37c4e0123860f1fecbceb80c3d2627d (diff) | |
download | luasocket-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.lua | 21 |
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 | ||
10 | local Public, Private = {}, {} | 10 | local Public, Private = {}, {} |
11 | SMTP = Public | 11 | socket.smtp = Public |
12 | 12 | ||
13 | ----------------------------------------------------------------------------- | 13 | ----------------------------------------------------------------------------- |
14 | -- Program constants | 14 | -- Program constants |
@@ -47,7 +47,7 @@ end | |||
47 | ----------------------------------------------------------------------------- | 47 | ----------------------------------------------------------------------------- |
48 | function Private.try_receive(...) | 48 | function 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 |
53 | end | 53 | end |
@@ -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 | ----------------------------------------------------------------------------- |
159 | function Private.send_mail(sock, sender) | 159 | function 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 |