610 lines
16 KiB
Lua
610 lines
16 KiB
Lua
-- The old and deprecated interface, provided for compatibility.
|
|
|
|
function check(account, mbox)
|
|
_check_required(account, 'table')
|
|
_check_required(mbox, 'string')
|
|
|
|
_check_required(account.server, 'string')
|
|
_check_required(account.username, 'string')
|
|
_check_required(account.password, 'string')
|
|
|
|
if (ifcore.login(account) ~= true) then
|
|
return
|
|
end
|
|
|
|
local _, exist, recent, unseen = ifcore.status(account, mbox)
|
|
|
|
if (type(options) == 'table' and options.info == true) then
|
|
print(string.format("%d messages, %d recent, %d unseen, in %s@%s/%s.",
|
|
exist, recent, unseen, account.username,
|
|
account.server, mbox))
|
|
end
|
|
|
|
return exist, recent, unseen
|
|
end
|
|
|
|
|
|
function match(account, mbox, criteria)
|
|
_check_required(account, 'table')
|
|
_check_required(mbox, 'string')
|
|
_check_required(criteria, 'table')
|
|
|
|
_check_required(account.server, 'string')
|
|
_check_required(account.username, 'string')
|
|
_check_required(account.password, 'string')
|
|
|
|
if (ifcore.login(account) ~= true) then
|
|
return
|
|
end
|
|
|
|
if (_cached_select(account, mbox) ~= true) then
|
|
return {}
|
|
end
|
|
|
|
local charset = ''
|
|
if (type(options) == 'table' and type(options.charset) == 'string') then
|
|
charset = options.charset
|
|
end
|
|
|
|
local _, results = ifcore.search(account, _make_query(criteria), charset)
|
|
|
|
if (type(options) == 'table' and options.close == true) then
|
|
_cached_close(account)
|
|
end
|
|
|
|
if (results == nil) then
|
|
return {}
|
|
end
|
|
|
|
local t = {}
|
|
for n in string.gmatch(results, '%d+') do
|
|
table.insert(t, tonumber(n))
|
|
end
|
|
|
|
return t
|
|
end
|
|
|
|
|
|
function flag(account, mbox, mode, flags, messages)
|
|
_check_required(account, 'table')
|
|
_check_required(mbox, 'string')
|
|
_check_required(mode, 'string')
|
|
_check_required(flags, 'table')
|
|
_check_required(messages, 'table')
|
|
|
|
_check_required(account.server, 'string')
|
|
_check_required(account.username, 'string')
|
|
_check_required(account.password, 'string')
|
|
|
|
local r = flag_aux(account, mbox, mode, flags, messages)
|
|
|
|
if (type(options) == 'table' and options.info == true and
|
|
messages ~= nil and r == true) then
|
|
print(string.format("%d messages flagged in %s@%s/%s.",
|
|
#messages, account.username,
|
|
account.server, mbox))
|
|
end
|
|
|
|
return r
|
|
end
|
|
|
|
function flag_aux(account, mbox, mode, flags, messages)
|
|
if (#messages == 0) then
|
|
return
|
|
end
|
|
|
|
if (mode ~= 'add' and mode ~= 'remove' and mode ~= 'replace') then
|
|
error('"add", "remove" or "replace" expected for mode', 3)
|
|
end
|
|
|
|
|
|
if (ifcore.login(account) ~= true) then
|
|
return
|
|
end
|
|
|
|
if (_cached_select(account, mbox) ~= true) then
|
|
return
|
|
end
|
|
|
|
local f = ''
|
|
if (#flags ~= 0) then
|
|
if (flags.keywords ~= true) then
|
|
for k, v in ipairs(flags) do
|
|
if (string.lower(v) == 'answered' or
|
|
string.lower(v) == 'deleted' or
|
|
string.lower(v) == 'draft' or
|
|
string.lower(v) == 'flagged' or
|
|
string.lower(v) == 'seen') then
|
|
f = f .. '\\' .. v .. ' '
|
|
end
|
|
end
|
|
f = string.gsub(f, '(.+) ', '%1')
|
|
else
|
|
f = table.concat(flags, ' ')
|
|
end
|
|
end
|
|
|
|
local m = _make_range(messages)
|
|
n = #m
|
|
local r = false
|
|
for i = 1, n, 50 do
|
|
j = i + 49
|
|
if (n < j) then
|
|
j = n
|
|
end
|
|
r = ifcore.store(account, table.concat(m, ',', i, j), mode, f)
|
|
if r == false then
|
|
break
|
|
end
|
|
end
|
|
|
|
if (type(options) == 'table' and options.close == true) then
|
|
_cached_close(account)
|
|
end
|
|
|
|
return r
|
|
end
|
|
|
|
|
|
function copy(srcaccount, srcmbox, dstaccount, dstmbox, messages)
|
|
_check_required(srcaccount, 'table')
|
|
_check_required(srcmbox, 'string')
|
|
_check_required(dstaccount, 'table')
|
|
_check_required(dstmbox, 'string')
|
|
_check_required(messages, 'table')
|
|
|
|
_check_required(srcaccount.server, 'string')
|
|
_check_required(srcaccount.username, 'string')
|
|
_check_required(srcaccount.password, 'string')
|
|
|
|
_check_required(dstaccount.server, 'string')
|
|
_check_required(dstaccount.username, 'string')
|
|
_check_required(dstaccount.password, 'string')
|
|
|
|
local r = copy_aux(srcaccount, srcmbox, dstaccount, dstmbox, messages)
|
|
|
|
if (type(options) == 'table' and options.info == true and
|
|
messages ~= nil and r == true) then
|
|
print(string.format("%d messages copied from %s@%s/%s to %s@%s/%s.",
|
|
#messages, srcaccount.username,
|
|
srcaccount.server, srcmbox, dstaccount.username,
|
|
dstaccount.server, dstmbox))
|
|
end
|
|
|
|
return r
|
|
end
|
|
|
|
function copy_aux(srcaccount, srcmbox, dstaccount, dstmbox, messages)
|
|
if (#messages == 0) then
|
|
return
|
|
end
|
|
|
|
if (ifcore.login(srcaccount) ~= true) then
|
|
return
|
|
end
|
|
|
|
local r = false
|
|
if (srcaccount == dstaccount) then
|
|
if (_cached_select(srcaccount, srcmbox) ~= true) then
|
|
return
|
|
end
|
|
|
|
local m = _make_range(messages)
|
|
n = #m
|
|
for i = 1, n, 50 do
|
|
j = i + 49
|
|
if (n < j) then
|
|
j = n
|
|
end
|
|
r = ifcore.copy(srcaccount, table.concat(m, ',', i, j), dstmbox)
|
|
if r == false then
|
|
break
|
|
end
|
|
end
|
|
|
|
if (type(options) == 'table' and options.close == true) then
|
|
_cached_close(srcaccount)
|
|
end
|
|
else
|
|
local fast = fetchfast(srcaccount, srcmbox, messages)
|
|
local msgs = fetchmessage(srcaccount, srcmbox, messages)
|
|
|
|
if (ifcore.login(dstaccount) ~= true) then
|
|
return
|
|
end
|
|
|
|
for i in pairs(fast) do
|
|
for k, v in ipairs(fast[i]['flags']) do
|
|
if (string.lower(v) == '\\recent') then
|
|
table.remove(fast[i]['flags'], k)
|
|
end
|
|
end
|
|
|
|
r = ifcore.append(dstaccount, dstmbox, msgs[i],
|
|
table.concat(fast[i]['flags'], ' '), fast[i]['date'])
|
|
end
|
|
end
|
|
|
|
return r
|
|
end
|
|
|
|
|
|
function delete(account, mbox, messages)
|
|
_check_required(account, 'table')
|
|
_check_required(mbox, 'string')
|
|
_check_required(messages, 'table')
|
|
|
|
_check_required(account.server, 'string')
|
|
_check_required(account.username, 'string')
|
|
_check_required(account.password, 'string')
|
|
|
|
local r = flag_aux(account, mbox, 'add', { 'Deleted' }, messages)
|
|
|
|
if (type(options) == 'table' and options.info == true and
|
|
messages ~= nil and r == true) then
|
|
print(string.format("%d messages deleted in %s@%s/%s.",
|
|
#messages, account.username,
|
|
account.server, mbox))
|
|
end
|
|
|
|
return r
|
|
end
|
|
|
|
|
|
function move(srcaccount, srcmbox, dstaccount, dstmbox, messages)
|
|
_check_required(srcaccount, 'table')
|
|
_check_required(srcmbox, 'string')
|
|
_check_required(dstaccount, 'table')
|
|
_check_required(dstmbox, 'string')
|
|
_check_required(messages, 'table')
|
|
|
|
_check_required(srcaccount.server, 'string')
|
|
_check_required(srcaccount.username, 'string')
|
|
_check_required(srcaccount.password, 'string')
|
|
|
|
_check_required(dstaccount.server, 'string')
|
|
_check_required(dstaccount.username, 'string')
|
|
_check_required(dstaccount.password, 'string')
|
|
|
|
local rc = copy_aux(srcaccount, srcmbox, dstaccount, dstmbox, messages)
|
|
local rf = false
|
|
if (rc == true) then
|
|
rf = flag_aux(srcaccount, srcmbox, 'add', { 'Deleted' }, messages)
|
|
end
|
|
|
|
if (type(options) == 'table' and options.info == true and
|
|
messages ~= nil and rc == true and rf == true) then
|
|
print(string.format("%d messages moved from %s@%s/%s to %s@%s/%s.",
|
|
#messages, srcaccount.username,
|
|
srcaccount.server, srcmbox, dstaccount.username,
|
|
dstaccount.server, dstmbox))
|
|
end
|
|
|
|
return rc == true and rf == true
|
|
end
|
|
|
|
|
|
function fetchheader(account, mbox, messages)
|
|
_check_required(account, 'table')
|
|
_check_required(mbox, 'string')
|
|
_check_required(messages, 'table')
|
|
|
|
_check_required(account.server, 'string')
|
|
_check_required(account.username, 'string')
|
|
_check_required(account.password, 'string')
|
|
|
|
if (#messages == 0) then
|
|
return
|
|
end
|
|
|
|
if (ifcore.login(account) ~= true) then
|
|
return
|
|
end
|
|
|
|
if (_cached_select(account, mbox) ~= true) then
|
|
return
|
|
end
|
|
|
|
local results = {}
|
|
for i, v in ipairs(messages) do
|
|
local _, header = ifcore.fetchheader(account, tostring(v))
|
|
|
|
if (header ~= nil) then
|
|
results[tonumber(v)] = header
|
|
end
|
|
end
|
|
|
|
if (type(options) == 'table' and options.close == true) then
|
|
_cached_close(account)
|
|
end
|
|
|
|
return results
|
|
end
|
|
|
|
function fetchbody(account, mbox, messages)
|
|
_check_required(account, 'table')
|
|
_check_required(mbox, 'string')
|
|
_check_required(messages, 'table')
|
|
|
|
_check_required(account.server, 'string')
|
|
_check_required(account.username, 'string')
|
|
_check_required(account.password, 'string')
|
|
|
|
if (#messages == 0) then
|
|
return
|
|
end
|
|
|
|
if (ifcore.login(account) ~= true) then
|
|
return
|
|
end
|
|
|
|
if (_cached_select(account, mbox) ~= true) then
|
|
return
|
|
end
|
|
|
|
local results = {}
|
|
for i, v in ipairs(messages) do
|
|
local _, body = ifcore.fetchbody(account, tostring(v))
|
|
|
|
if (body ~= nil) then
|
|
results[tonumber(v)] = body
|
|
end
|
|
end
|
|
|
|
if (type(options) == 'table' and options.close == true) then
|
|
_cached_close(account)
|
|
end
|
|
|
|
return results
|
|
end
|
|
|
|
function fetchmessage(account, mbox, messages)
|
|
_check_required(account, 'table')
|
|
_check_required(mbox, 'string')
|
|
_check_required(messages, 'table')
|
|
|
|
_check_required(account.server, 'string')
|
|
_check_required(account.username, 'string')
|
|
_check_required(account.password, 'string')
|
|
|
|
if (#messages == 0) then
|
|
return
|
|
end
|
|
|
|
if (ifcore.login(account) ~= true) then
|
|
return
|
|
end
|
|
|
|
if (_cached_select(account, mbox) ~= true) then
|
|
return
|
|
end
|
|
|
|
local results = {}
|
|
for i, v in ipairs(messages) do
|
|
local _, header = ifcore.fetchheader(account, tostring(v))
|
|
local _, body = ifcore.fetchbody(account, tostring(v))
|
|
|
|
if (header ~= nil and body ~= nil) then
|
|
results[tonumber(v)] = header .. body
|
|
end
|
|
end
|
|
|
|
if (type(options) == 'table' and options.close == true) then
|
|
_cached_close(account)
|
|
end
|
|
|
|
return results
|
|
end
|
|
|
|
fetchtext = fetchmessage
|
|
|
|
function fetchfields(account, mbox, fields, messages)
|
|
_check_required(account, 'table')
|
|
_check_required(mbox, 'string')
|
|
_check_required(fields, 'table')
|
|
_check_required(messages, 'table')
|
|
|
|
_check_required(account.server, 'string')
|
|
_check_required(account.username, 'string')
|
|
_check_required(account.password, 'string')
|
|
|
|
if (#messages == 0) then
|
|
return
|
|
end
|
|
|
|
if (ifcore.login(account) ~= true) then
|
|
return
|
|
end
|
|
|
|
if (_cached_select(account, mbox) ~= true) then
|
|
return
|
|
end
|
|
|
|
local results = {}
|
|
for i, v in ipairs(messages) do
|
|
local _, headerfields = ifcore.fetchfields(account, tostring(v),
|
|
table.concat(fields, ' '))
|
|
|
|
if (headerfields ~= nil) then
|
|
results[tonumber(v)] = headerfields
|
|
end
|
|
end
|
|
|
|
if (type(options) == 'table' and options.close == true) then
|
|
_cached_close(account)
|
|
end
|
|
|
|
return results
|
|
end
|
|
|
|
fetchheaders = fetchfields
|
|
|
|
function fetchfast(account, mbox, messages)
|
|
_check_required(account, 'table')
|
|
_check_required(mbox, 'string')
|
|
_check_required(messages, 'table')
|
|
|
|
_check_required(account.server, 'string')
|
|
_check_required(account.username, 'string')
|
|
_check_required(account.password, 'string')
|
|
|
|
if (#messages == 0) then
|
|
return
|
|
end
|
|
|
|
if (ifcore.login(account) ~= true) then
|
|
return
|
|
end
|
|
|
|
if (_cached_select(account, mbox) ~= true) then
|
|
return
|
|
end
|
|
|
|
local results = {}
|
|
for i, v in ipairs(messages) do
|
|
local _, flags, date, size = ifcore.fetchfast(account, tostring(v))
|
|
if (flags ~= nil and date ~= nil and size ~= nil ) then
|
|
local f = {}
|
|
for s in string.gmatch(flags, '%S+') do
|
|
table.insert(f, s)
|
|
end
|
|
results[tonumber(v)] = {}
|
|
results[tonumber(v)]['flags'] = f
|
|
results[tonumber(v)]['date'] = date
|
|
results[tonumber(v)]['size'] = size
|
|
end
|
|
end
|
|
|
|
if (type(options) == 'table' and options.close == true) then
|
|
_cached_close(account)
|
|
end
|
|
|
|
return results
|
|
end
|
|
|
|
|
|
function list(account, name)
|
|
_check_required(account, 'table')
|
|
_check_optional(name, 'string')
|
|
|
|
_check_required(account.server, 'string')
|
|
_check_required(account.username, 'string')
|
|
_check_required(account.password, 'string')
|
|
|
|
if (name == nil) then
|
|
name = ''
|
|
else
|
|
if (type(options) == 'table' and options.namespace == true) then
|
|
if (name == '/') then
|
|
name = ''
|
|
end
|
|
if (name ~= '') then
|
|
name = name .. '/'
|
|
end
|
|
end
|
|
end
|
|
|
|
if (ifcore.login(account) ~= true) then
|
|
return
|
|
end
|
|
|
|
local _, mboxs, folders = ifcore.list(account, '', name .. '%')
|
|
|
|
local m = {}
|
|
for s in string.gmatch(mboxs, '%C+') do
|
|
table.insert(m, s)
|
|
end
|
|
|
|
local f = {}
|
|
for s in string.gmatch(folders, '%C+') do
|
|
if s ~= name and s ~= name .. '/' then
|
|
table.insert(f, s)
|
|
end
|
|
end
|
|
|
|
return m, f
|
|
end
|
|
|
|
function lsub(account, name)
|
|
_check_required(account, 'table')
|
|
_check_optional(name, 'string')
|
|
|
|
_check_required(account.server, 'string')
|
|
_check_required(account.username, 'string')
|
|
_check_required(account.password, 'string')
|
|
|
|
if (name == nil) then
|
|
name = ''
|
|
else
|
|
if (type(options) == 'table' and options.namespace == true) then
|
|
if (name == '/') then
|
|
name = ''
|
|
end
|
|
if (name ~= '') then
|
|
name = name .. '/'
|
|
end
|
|
end
|
|
end
|
|
|
|
if (ifcore.login(account) ~= true) then
|
|
return
|
|
end
|
|
|
|
local _, mboxs, folders = ifcore.lsub(account, '', name .. '%')
|
|
|
|
local m = {}
|
|
for s in string.gmatch(mboxs, '%C+') do
|
|
table.insert(m, s)
|
|
end
|
|
|
|
local f = {}
|
|
for s in string.gmatch(folders, '%C+') do
|
|
if s ~= name and s ~= name .. '/' then
|
|
table.insert(f, s)
|
|
end
|
|
end
|
|
|
|
return m, f
|
|
end
|
|
|
|
|
|
function ping(account)
|
|
_check_required(account, 'table')
|
|
|
|
_check_required(account.server, 'string')
|
|
_check_required(account.username, 'string')
|
|
_check_required(account.password, 'string')
|
|
|
|
if (ifcore.login(account) ~= true) then
|
|
return
|
|
end
|
|
|
|
local r = ifcore.noop(account)
|
|
|
|
return r
|
|
end
|
|
|
|
|
|
function _cached_select(account, mbox)
|
|
if (account.mailbox == nil or account.mailbox ~= mbox) then
|
|
if (ifcore.select(account, mbox) == true) then
|
|
account.mailbox = mbox
|
|
return true
|
|
else
|
|
return false
|
|
end
|
|
else
|
|
return true
|
|
end
|
|
end
|
|
|
|
function _cached_close(account)
|
|
account.mailbox = nil
|
|
return ifcore.close(account)
|
|
end
|
|
|
|
|
|
date_before = form_date
|
|
get_pass = get_password
|
|
daemon_mode = become_daemon
|