94 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
		
		
			
		
	
	
			94 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| 
								 | 
							
								R"-++**++-(
							 | 
						||
| 
								 | 
							
								local _M = {}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								if module then
							 | 
						||
| 
								 | 
							
								    mbox = _M
							 | 
						||
| 
								 | 
							
								end 
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function _M.split_message(message_s)
							 | 
						||
| 
								 | 
							
								    local message = {}
							 | 
						||
| 
								 | 
							
								    message_s = string.gsub(message_s, "\r\n", "\n")
							 | 
						||
| 
								 | 
							
								    string.gsub(message_s, "^(.-\n)\n", function (h) message.headers = h end)
							 | 
						||
| 
								 | 
							
								    string.gsub(message_s, "^.-\n\n(.*)", function (b) message.body = b end)
							 | 
						||
| 
								 | 
							
								    if not message.body then
							 | 
						||
| 
								 | 
							
								        string.gsub(message_s, "^\n(.*)", function (b) message.body = b end)
							 | 
						||
| 
								 | 
							
								    end
							 | 
						||
| 
								 | 
							
								    if not message.headers and not message.body then
							 | 
						||
| 
								 | 
							
								        message.headers = message_s
							 | 
						||
| 
								 | 
							
								    end
							 | 
						||
| 
								 | 
							
								    return message.headers or "", message.body or ""
							 | 
						||
| 
								 | 
							
								end
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function _M.split_headers(headers_s)
							 | 
						||
| 
								 | 
							
								    local headers = {}
							 | 
						||
| 
								 | 
							
								    headers_s = string.gsub(headers_s, "\r\n", "\n")
							 | 
						||
| 
								 | 
							
								    headers_s = string.gsub(headers_s, "\n[ ]+", " ")
							 | 
						||
| 
								 | 
							
								    string.gsub("\n" .. headers_s, "\n([^\n]+)", function (h) table.insert(headers, h) end)
							 | 
						||
| 
								 | 
							
								    return headers
							 | 
						||
| 
								 | 
							
								end
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function _M.parse_header(header_s)
							 | 
						||
| 
								 | 
							
								    header_s = string.gsub(header_s, "\n[ ]+", " ")
							 | 
						||
| 
								 | 
							
								    header_s = string.gsub(header_s, "\n+", "")
							 | 
						||
| 
								 | 
							
								    local _, __, name, value = string.find(header_s, "([^%s:]-):%s*(.*)")
							 | 
						||
| 
								 | 
							
								    return name, value
							 | 
						||
| 
								 | 
							
								end
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function _M.parse_headers(headers_s)
							 | 
						||
| 
								 | 
							
								    local headers_t = _M.split_headers(headers_s)
							 | 
						||
| 
								 | 
							
								    local headers = {}
							 | 
						||
| 
								 | 
							
								    for i = 1, #headers_t do
							 | 
						||
| 
								 | 
							
								        local name, value = _M.parse_header(headers_t[i])
							 | 
						||
| 
								 | 
							
								        if name then
							 | 
						||
| 
								 | 
							
								            name = string.lower(name)
							 | 
						||
| 
								 | 
							
								            if headers[name] then
							 | 
						||
| 
								 | 
							
								                headers[name] = headers[name] .. ", " .. value
							 | 
						||
| 
								 | 
							
								            else headers[name] = value end
							 | 
						||
| 
								 | 
							
								        end
							 | 
						||
| 
								 | 
							
								    end
							 | 
						||
| 
								 | 
							
								    return headers
							 | 
						||
| 
								 | 
							
								end
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function _M.parse_from(from)
							 | 
						||
| 
								 | 
							
								    local _, __, name, address = string.find(from, "^%s*(.-)%s*%<(.-)%>")
							 | 
						||
| 
								 | 
							
								    if not address then
							 | 
						||
| 
								 | 
							
								        _, __, address = string.find(from, "%s*(.+)%s*")
							 | 
						||
| 
								 | 
							
								    end
							 | 
						||
| 
								 | 
							
								    name = name or ""
							 | 
						||
| 
								 | 
							
								    address = address or ""
							 | 
						||
| 
								 | 
							
								    if name == "" then name = address end
							 | 
						||
| 
								 | 
							
								    name = string.gsub(name, '"', "")
							 | 
						||
| 
								 | 
							
								    return name, address
							 | 
						||
| 
								 | 
							
								end
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function _M.split_mbox(mbox_s)
							 | 
						||
| 
								 | 
							
								    mbox = {}
							 | 
						||
| 
								 | 
							
								    mbox_s = string.gsub(mbox_s, "\r\n", "\n") .."\n\nFrom \n"
							 | 
						||
| 
								 | 
							
								    local nj, i, j = 1, 1, 1
							 | 
						||
| 
								 | 
							
								    while 1 do
							 | 
						||
| 
								 | 
							
								        i, nj = string.find(mbox_s, "\n\nFrom .-\n", j)
							 | 
						||
| 
								 | 
							
								        if not i then break end
							 | 
						||
| 
								 | 
							
								        local message = string.sub(mbox_s, j, i-1)
							 | 
						||
| 
								 | 
							
								        table.insert(mbox, message)
							 | 
						||
| 
								 | 
							
								        j = nj+1
							 | 
						||
| 
								 | 
							
								    end
							 | 
						||
| 
								 | 
							
								    return mbox
							 | 
						||
| 
								 | 
							
								end
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function _M.parse(mbox_s)
							 | 
						||
| 
								 | 
							
								    local mbox = _M.split_mbox(mbox_s)
							 | 
						||
| 
								 | 
							
								    for i = 1, #mbox do
							 | 
						||
| 
								 | 
							
								        mbox[i] = _M.parse_message(mbox[i])
							 | 
						||
| 
								 | 
							
								    end
							 | 
						||
| 
								 | 
							
								    return mbox
							 | 
						||
| 
								 | 
							
								end
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function _M.parse_message(message_s)
							 | 
						||
| 
								 | 
							
								    local message = {}
							 | 
						||
| 
								 | 
							
								    message.headers, message.body = _M.split_message(message_s)
							 | 
						||
| 
								 | 
							
								    message.headers = _M.parse_headers(message.headers)
							 | 
						||
| 
								 | 
							
								    return message
							 | 
						||
| 
								 | 
							
								end
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								return _M
							 | 
						||
| 
								 | 
							
								)-++**++-";
							 |