我正在编写一个可以使用LuaSocket SMTP发送电子邮件的脚本。现在我想让我的脚本也能够阅读我的电子邮件。
我在支持IMAP的服务中有一个电子邮件帐户。
IMAP host and port: example.com:143
My E-Mail: doesnotexist@example.com
The password: notsaying
如何让我的脚本从该服务获取电子邮件,以便显示其内容?
修改
我从https://github.com/vrld/imap4.lua尝试了imap4,但似乎没有完成。
我试过这个example:
require 'luarocks.require'
local imap4 = require 'imap4'
local username = "doesnotexist@example.com"
local password = "notsaying"
local connection = imap4('example.com', 143)
print(table.concat(connection:capability(), ', '))
assert(connection:isCapable('IMAP4rev1'))
connection:login(username, password)
for mb, info in pairs(connection:lsub()) do
local stat = connection:status(mb, {'MESSAGES', 'RECENT', 'UNSEEN'})
print(mb, stat.MESSAGES, stat.RECENT, stat.UNSEEN)
end
local info = connection:examine('INBOX')
print(info.exist, info.recent)
for _,v in pairs(connection:fetch('UID BODY.PEEK[HEADER.FIELDS (From Date Subject)]', (info.exist-3)..':*')) do
print(v.id, v.UID, v.BODY.value)
end
connection:logout()
我只添加了用户名和密码,并更改了原始示例中的服务器和端口,并将最新的更改为4到3的提取。我也删除了注释,因为它们很多。除了那些我没有修改任何东西的东西,它基本上是相同的例子。
似乎使用我的凭据和正确的服务器和端口正确登录,但它有一些我无法调试的问题。
以上示例输出:
IMAP4rev1, CHILDREN, NAMESPACE
INBOX.Sent 3 0 0
INBOX 4 0 0
4 0
lua: example.lua:24: attempt to index field 'BODY' (a nil value)
stack traceback:
example.lua:24: in main chunk
[C]: ?
它显示我的收件箱中有4个电子邮件,我发送了3个电子邮件,这是正确的。
答案 0 :(得分:1)
此示例使用imap4库获取消息并使用pop3.message进行解析。
local imap4 = require "imap4"
local Message = require "pop3.message"
local connection = imap4('imap.qip.ru', 143)
assert(connection:isCapable('IMAP4rev1'))
connection:login('****', '****')
-- Select INBOX with read only permissions.
local info = connection:examine('INBOX')
print(info.exist, info.recent)
-- List info on the 4 most recent mails.
for _,v in pairs(connection:fetch('RFC822', (info.exist-4)..':*')) do
print("-------------------------")
local msg = Message(v.RFC822)
print("ID: ", msg:id())
print("subject: ", msg:subject())
print("to: ", msg:to())
print("from: ", msg:from())
print("from addr: ", msg:from_address())
print("reply: ", msg:reply_to())
print("reply addr: ", msg:reply_address())
print("trunc: ", msg:is_truncated())
for i,v in ipairs(msg:full_content()) do
if v.text then print(" ", i , "TEXT: ", v.type, #v.text)
else print(" ", i , "FILE: ", v.type, v.file_name or v.name, #v.data) end
end
end
-- close connection
connection:logout()
答案 1 :(得分:0)
首先尝试moeus的解决方案。如果您需要使用的服务器不支持RFC822或者通常不符合标准,那么只能打扰我的示例。
在这个答案中,我将简要解释为什么original example不起作用,并且在没有RFC822的情况下给出一个例子,因为我必须使用的服务器不理解RFC822,以及它应该有的许多其他关键字根据{{3}}
了解在示例中,我不得不改变:
connection:fetch('UID BODY.PEEK[HEADER.FIELDS (From Date Subject)]', (info.exist-3)..':*'))
为:
connection:fetch('(UID BODY.PEEK[HEADER.FIELDS (From Date Subject)])', (info.exist-3)..':*'))
请注意括号,这就是示例不起作用的原因。
Moteus对RFC822的回答对我不起作用,因为我必须使用的服务器是非标准的。以下是我如何使用它:
local imap4 = require "imap4"
local Message = require "pop3.message"
local connection = imap4('imap.qip.ru', 143)
assert(connection:isCapable('IMAP4rev1'))
connection:login('****', '****')
-- Select INBOX with read only permissions.
local info = connection:examine('INBOX')
print(info.exist, info.recent)
-- List info on the 4 most recent mails.
for _,v in pairs(connection:fetch('(UID BODY.PEEK[HEADER.FIELDS (Subject To From Date)])', (info.exist-4)..':*')) do
print("-------------------------")
local msg = Message(v.BODY.value)
print("ID: ", msg:id())
print("subject: ", msg:subject())
print("to: ", msg:to())
print("from: ", msg:from())
print("from addr: ", msg:from_address())
print("reply: ", msg:reply_to())
print("reply addr: ", msg:reply_address())
print("trunc: ", msg:is_truncated())
for i,v in ipairs(msg:full_content()) do
if v.text then print(" ", i , "TEXT: ", v.type, #v.text)
else print(" ", i , "FILE: ", v.type, v.file_name or v.name, #v.data) end
end
end
-- close connection
connection:logout()
与Moteus的示例不同,您必须单独获取文本。
您可以像这样获取邮件文本:
connection:fetch('(BODY.PEEK[TEXT])', id)