如何使用Lua阅读电子邮件?
2014-6-18 12:16:34
收藏:0
阅读:186
评论:2
我正在编写一个脚本,可以使用LuaSocket SMTP发送电子邮件。现在,我想让我的脚本也能够读取我的电子邮件。
我在一个支持IMAP的服务中有一个电子邮件帐户。
IMAP主机和端口:example.com:143
我的电子邮件:doesnotexist@example.com
密码:不告诉你
如何使我的脚本从该服务获取电子邮件,以便我可以显示其内容?
编辑:
我尝试了https://github.com/vrld/imap4.lua中的imap4,但似乎没有完成。
我尝试了这个示例:
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封,这是正确的。
点赞
用户88888888
首先尝试 Moteus 的解决方案。仅在您需要使用的服务器不支持 RFC822 或通常不符合标准时才使用我的示例。
在本答案中,我将简要解释为什么 原始示例 不起作用,并且给出一个没有 RFC822 的示例,因为我必须使用的服务器不理解 RFC822 和许多其他应该根据 IMAP 4 标准 理解的关键字。
在示例中,我必须更改:
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)
2014-06-18 12:45:43
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
这个例子使用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('****', '****') -- 以只读权限选择 INBOX。 local info = connection:examine('INBOX') print(info.exist, info.recent) -- 列出最近 4 封邮件的信息。 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 -- 关闭连接 connection:logout()