diff options
Diffstat (limited to 'src/smtp.lua')
-rw-r--r-- | src/smtp.lua | 50 |
1 files changed, 26 insertions, 24 deletions
diff --git a/src/smtp.lua b/src/smtp.lua index 7ae99a5..dc80c35 100644 --- a/src/smtp.lua +++ b/src/smtp.lua | |||
@@ -7,15 +7,9 @@ | |||
7 | ----------------------------------------------------------------------------- | 7 | ----------------------------------------------------------------------------- |
8 | 8 | ||
9 | ----------------------------------------------------------------------------- | 9 | ----------------------------------------------------------------------------- |
10 | -- Load SMTP from dynamic library | 10 | -- Load required modules |
11 | -- Comment these lines if you are loading static | ||
12 | ----------------------------------------------------------------------------- | ||
13 | local open = assert(loadlib("smtp", "luaopen_smtp")) | ||
14 | local smtp = assert(open()) | ||
15 | |||
16 | ----------------------------------------------------------------------------- | ||
17 | -- Load other required modules | ||
18 | ----------------------------------------------------------------------------- | 11 | ----------------------------------------------------------------------------- |
12 | local smtp = requirelib("smtp") | ||
19 | local socket = require("socket") | 13 | local socket = require("socket") |
20 | local ltn12 = require("ltn12") | 14 | local ltn12 = require("ltn12") |
21 | local tp = require("tp") | 15 | local tp = require("tp") |
@@ -23,10 +17,10 @@ local tp = require("tp") | |||
23 | ----------------------------------------------------------------------------- | 17 | ----------------------------------------------------------------------------- |
24 | -- Setup namespace | 18 | -- Setup namespace |
25 | ----------------------------------------------------------------------------- | 19 | ----------------------------------------------------------------------------- |
26 | -- make all module globals fall into smtp namespace | 20 | _LOADED["smtp"] = smtp |
27 | setmetatable(smtp, { __index = _G }) | ||
28 | setfenv(1, smtp) | ||
29 | 21 | ||
22 | -- timeout for connection | ||
23 | TIMEOUT = 60 | ||
30 | -- default server used to send e-mails | 24 | -- default server used to send e-mails |
31 | SERVER = "localhost" | 25 | SERVER = "localhost" |
32 | -- default port | 26 | -- default port |
@@ -94,9 +88,7 @@ function metat.__index:send(mailt) | |||
94 | end | 88 | end |
95 | 89 | ||
96 | function open(server, port) | 90 | function open(server, port) |
97 | print(server or SERVER, port or PORT) | 91 | local tp = socket.try(tp.connect(server or SERVER, port or PORT, TIMEOUT)) |
98 | local tp, error = tp.connect(server or SERVER, port or PORT) | ||
99 | if not tp then return nil, error end | ||
100 | return setmetatable({tp = tp}, metat) | 92 | return setmetatable({tp = tp}, metat) |
101 | end | 93 | end |
102 | 94 | ||
@@ -121,7 +113,10 @@ local function send_multipart(mesgt) | |||
121 | coroutine.yield('content-type: multipart/mixed; boundary="' .. | 113 | coroutine.yield('content-type: multipart/mixed; boundary="' .. |
122 | bd .. '"\r\n\r\n') | 114 | bd .. '"\r\n\r\n') |
123 | -- send preamble | 115 | -- send preamble |
124 | if mesgt.body.preamble then coroutine.yield(mesgt.body.preamble) end | 116 | if mesgt.body.preamble then |
117 | coroutine.yield(mesgt.body.preamble) | ||
118 | coroutine.yield("\r\n") | ||
119 | end | ||
125 | -- send each part separated by a boundary | 120 | -- send each part separated by a boundary |
126 | for i, m in ipairs(mesgt.body) do | 121 | for i, m in ipairs(mesgt.body) do |
127 | coroutine.yield("\r\n--" .. bd .. "\r\n") | 122 | coroutine.yield("\r\n--" .. bd .. "\r\n") |
@@ -130,7 +125,10 @@ local function send_multipart(mesgt) | |||
130 | -- send last boundary | 125 | -- send last boundary |
131 | coroutine.yield("\r\n--" .. bd .. "--\r\n\r\n") | 126 | coroutine.yield("\r\n--" .. bd .. "--\r\n\r\n") |
132 | -- send epilogue | 127 | -- send epilogue |
133 | if mesgt.body.epilogue then coroutine.yield(mesgt.body.epilogue) end | 128 | if mesgt.body.epilogue then |
129 | coroutine.yield(mesgt.body.epilogue) | ||
130 | coroutine.yield("\r\n") | ||
131 | end | ||
134 | end | 132 | end |
135 | 133 | ||
136 | -- yield message body from a source | 134 | -- yield message body from a source |
@@ -183,12 +181,12 @@ end | |||
183 | -- set defaul headers | 181 | -- set defaul headers |
184 | local function adjust_headers(mesgt) | 182 | local function adjust_headers(mesgt) |
185 | local lower = {} | 183 | local lower = {} |
186 | for i,v in (mesgt or lower) do | 184 | for i,v in (mesgt.headers or lower) do |
187 | lower[string.lower(i)] = v | 185 | lower[string.lower(i)] = v |
188 | end | 186 | end |
189 | lower["date"] = lower["date"] or | 187 | lower["date"] = lower["date"] or |
190 | os.date("!%a, %d %b %Y %H:%M:%S ") .. (mesgt.zone or ZONE) | 188 | os.date("!%a, %d %b %Y %H:%M:%S ") .. (mesgt.zone or ZONE) |
191 | lower["x-mailer"] = lower["x-mailer"] or socket.version | 189 | lower["x-mailer"] = lower["x-mailer"] or socket.VERSION |
192 | -- this can't be overriden | 190 | -- this can't be overriden |
193 | lower["mime-version"] = "1.0" | 191 | lower["mime-version"] = "1.0" |
194 | mesgt.headers = lower | 192 | mesgt.headers = lower |
@@ -198,18 +196,22 @@ function message(mesgt) | |||
198 | adjust_headers(mesgt) | 196 | adjust_headers(mesgt) |
199 | -- create and return message source | 197 | -- create and return message source |
200 | local co = coroutine.create(function() send_message(mesgt) end) | 198 | local co = coroutine.create(function() send_message(mesgt) end) |
201 | return function() return socket.skip(1, coroutine.resume(co)) end | 199 | return function() |
200 | local ret, a, b = coroutine.resume(co) | ||
201 | if ret then return a, b | ||
202 | else return nil, a end | ||
203 | end | ||
202 | end | 204 | end |
203 | 205 | ||
204 | --------------------------------------------------------------------------- | 206 | --------------------------------------------------------------------------- |
205 | -- High level SMTP API | 207 | -- High level SMTP API |
206 | ----------------------------------------------------------------------------- | 208 | ----------------------------------------------------------------------------- |
207 | send = socket.protect(function(mailt) | 209 | send = socket.protect(function(mailt) |
208 | local smtp = socket.try(open(mailt.server, mailt.port)) | 210 | local con = open(mailt.server, mailt.port) |
209 | smtp:greet(mailt.domain) | 211 | con:greet(mailt.domain) |
210 | smtp:send(mailt) | 212 | con:send(mailt) |
211 | smtp:quit() | 213 | con:quit() |
212 | return smtp:close() | 214 | return con:close() |
213 | end) | 215 | end) |
214 | 216 | ||
215 | return smtp | 217 | return smtp |