信箱剖析 |
|
假設你儲存了目前目錄(或 PackagePath 中的其他地方)中的原始碼,名稱為 mboxparser.lua
。在程式碼中,輸入
parse = require "mboxparser"
主要函式,parse.mbox
,接收以字串形式儲存的信箱檔案內容,並傳回一個表格,每個訊息只有一個項目。每個項目有下列結構
message = { headers = { [["name_1"]] = "value_1", [["name_2"]] = "value_2", ... ... [["name_n"]] = "value_n", }, body = "message body" }
因此,如果信箱有下列內容
From whoever@tecgraf.puc-rio.br Thu Nov 22 13:59:05 2001 Date: Thu, 22 Nov 2001 13:59:04 -0200 (EDT) From: Whoever Smith <whoever@tecgraf.puc-rio.br> To: Other Smith <other@tecgraf.puc-rio.br> Subject: This is a test message Content-Type: TEXT/PLAIN; charset=US-ASCII Hi, This is the message body. Regards, Diego.
對它使用 parse.mbox
的話,會傳回下列表格
messages = { { headers = { from = "Whoever Smith <whoever@tecgraf.puc-rio.br>", subject = "This is a test message", to = "Other Smith <other@tecgraf.puc-rio.br>", date = "Thu, 22 Nov 2001 13:59:04 -0200 (EDT)", ["content-type"] = "TEXT/PLAIN; charset=US-ASCII", }, body = "Hi, This is the message body. Regards, Diego.", } }
local Public = {} local strfind, strlower, gsub = string.find, string.lower, string.gsub local strsub, tinsert = string.sub, table.insert function Public.headers(headers_s) local headers = {} headers_s = "\n" .. headers_s .. "$$$:\n" local i, j = 1, 1 local name, value, _ while 1 do j = strfind(headers_s, "\n%S-:", i+1) if not j then break end _, _, name, value = strfind(strsub(headers_s, i+1, j-1), "(%S-):(.*)") value = gsub(value or "", "\r\n", "\n") value = gsub(value, "\n%s*", " ") name = strlower(name) if headers[name] then headers[name] = headers[name] .. ", " .. value else headers[name] = value end i, j = j, i end headers["$$$"] = nil return headers end function Public.message(message_s) message_s = gsub(message_s, "^.-\n", "") local _, headers_s, body _, _, headers_s, body = strfind(message_s, "^(.-\n)\n(.*)") headers_s = headers_s or "" body = body or "" return { headers = Public.headers(headers_s), body = body } end function Public.mbox(mbox_s) local mbox = {} mbox_s = "\n" .. mbox_s .. "\nFrom " local i, j = 1, 1 while 1 do j = strfind(mbox_s, "\nFrom ", i + 1) if not j then break end tinsert(mbox, Public.message(strsub(mbox_s, i + 1, j - 1))) i, j = j, i end return mbox end return Public
原始 Lua 4 程式碼是由 DiegoNehab 建立的,且用來測試 LuaSocket
[1] 1.4 SMTP 程式碼。Lua 5 版本是由 DirkLaurie 製作的。