aboutsummaryrefslogtreecommitdiff
path: root/src/smtp.lua
diff options
context:
space:
mode:
Diffstat (limited to 'src/smtp.lua')
-rw-r--r--src/smtp.lua64
1 files changed, 33 insertions, 31 deletions
diff --git a/src/smtp.lua b/src/smtp.lua
index 1708053..d6357d2 100644
--- a/src/smtp.lua
+++ b/src/smtp.lua
@@ -31,51 +31,51 @@ ZONE = "-0000"
31local metat = { __index = {} } 31local metat = { __index = {} }
32 32
33function metat.__index:greet(domain) 33function metat.__index:greet(domain)
34 socket.try(self.tp:check("2..")) 34 self.try(self.tp:check("2.."))
35 socket.try(self.tp:command("EHLO", domain or DOMAIN)) 35 self.try(self.tp:command("EHLO", domain or DOMAIN))
36 return socket.skip(1, socket.try(self.tp:check("2.."))) 36 return socket.skip(1, self.try(self.tp:check("2..")))
37end 37end
38 38
39function metat.__index:mail(from) 39function metat.__index:mail(from)
40 socket.try(self.tp:command("MAIL", "FROM:" .. from)) 40 self.try(self.tp:command("MAIL", "FROM:" .. from))
41 return socket.try(self.tp:check("2..")) 41 return self.try(self.tp:check("2.."))
42end 42end
43 43
44function metat.__index:rcpt(to) 44function metat.__index:rcpt(to)
45 socket.try(self.tp:command("RCPT", "TO:" .. to)) 45 self.try(self.tp:command("RCPT", "TO:" .. to))
46 return socket.try(self.tp:check("2..")) 46 return self.try(self.tp:check("2.."))
47end 47end
48 48
49function metat.__index:data(src, step) 49function metat.__index:data(src, step)
50 socket.try(self.tp:command("DATA")) 50 self.try(self.tp:command("DATA"))
51 socket.try(self.tp:check("3..")) 51 self.try(self.tp:check("3.."))
52 socket.try(self.tp:source(src, step)) 52 self.try(self.tp:source(src, step))
53 socket.try(self.tp:send("\r\n.\r\n")) 53 self.try(self.tp:send("\r\n.\r\n"))
54 return socket.try(self.tp:check("2..")) 54 return self.try(self.tp:check("2.."))
55end 55end
56 56
57function metat.__index:quit() 57function metat.__index:quit()
58 socket.try(self.tp:command("QUIT")) 58 self.try(self.tp:command("QUIT"))
59 return socket.try(self.tp:check("2..")) 59 return self.try(self.tp:check("2.."))
60end 60end
61 61
62function metat.__index:close() 62function metat.__index:close()
63 return socket.try(self.tp:close()) 63 return self.try(self.tp:close())
64end 64end
65 65
66function metat.__index:login(user, password) 66function metat.__index:login(user, password)
67 socket.try(self.tp:command("AUTH", "LOGIN")) 67 self.try(self.tp:command("AUTH", "LOGIN"))
68 socket.try(self.tp:check("3..")) 68 self.try(self.tp:check("3.."))
69 socket.try(self.tp:command(mime.b64(user))) 69 self.try(self.tp:command(mime.b64(user)))
70 socket.try(self.tp:check("3..")) 70 self.try(self.tp:check("3.."))
71 socket.try(self.tp:command(mime.b64(password))) 71 self.try(self.tp:command(mime.b64(password)))
72 return socket.try(self.tp:check("2..")) 72 return self.try(self.tp:check("2.."))
73end 73end
74 74
75function metat.__index:plain(user, password) 75function metat.__index:plain(user, password)
76 local auth = "PLAIN " .. mime.b64("\0" .. user .. "\0" .. password) 76 local auth = "PLAIN " .. mime.b64("\0" .. user .. "\0" .. password)
77 socket.try(self.tp:command("AUTH", auth)) 77 self.try(self.tp:command("AUTH", auth))
78 return socket.try(self.tp:check("2..")) 78 return self.try(self.tp:check("2.."))
79end 79end
80 80
81function metat.__index:auth(user, password, ext) 81function metat.__index:auth(user, password, ext)
@@ -85,7 +85,7 @@ function metat.__index:auth(user, password, ext)
85 elseif string.find(ext, "AUTH[^\n]+PLAIN") then 85 elseif string.find(ext, "AUTH[^\n]+PLAIN") then
86 return self:plain(user, password) 86 return self:plain(user, password)
87 else 87 else
88 socket.try(nil, "authentication not supported") 88 self.try(nil, "authentication not supported")
89 end 89 end
90end 90end
91 91
@@ -104,7 +104,9 @@ end
104 104
105function open(server, port) 105function open(server, port)
106 local tp = socket.try(tp.connect(server or SERVER, port or PORT, TIMEOUT)) 106 local tp = socket.try(tp.connect(server or SERVER, port or PORT, TIMEOUT))
107 return setmetatable({tp = tp}, metat) 107 -- make sure tp is closed if we get an exception
108 local try = socket.newtry(function() tp:close() end)
109 return setmetatable({ tp = tp, try = try}, metat)
108end 110end
109 111
110--------------------------------------------------------------------------- 112---------------------------------------------------------------------------
@@ -222,10 +224,10 @@ end
222-- High level SMTP API 224-- High level SMTP API
223----------------------------------------------------------------------------- 225-----------------------------------------------------------------------------
224send = socket.protect(function(mailt) 226send = socket.protect(function(mailt)
225 local con = open(mailt.server, mailt.port) 227 local s = open(mailt.server, mailt.port)
226 local ext = con:greet(mailt.domain) 228 local ext = s:greet(mailt.domain)
227 con:auth(mailt.user, mailt.password, ext) 229 s:auth(mailt.user, mailt.password, ext)
228 con:send(mailt) 230 s:send(mailt)
229 con:quit() 231 s:quit()
230 return con:close() 232 return s:close()
231end) 233end)