LuaSocket

in-house 툴에서 주어진 데이터를 확인하고 결과 내용을 메일로 전송할 일이 생겼는데, 간단한 툴이기 때문에 그냥 100% 루아로만 작성해보고 싶었다. 그래서 lua 자체로 메일 보내는 기능을 찾아봤는데, LuaSocket을 이용하면 쉽게 보낼 수 있더라. 별도로 다운받아서 빌드해 사용할 수도 있지만 Lua For Windows를 설치하면 자동으로 같이 설치된다.

사용법은 정말 별것이 없다. SMTP 소개 페이지에 있는 샘플 코드 복사해다가 실행시키면 그냥 실행됨 –_-)b 다만 메일에 한글을 쓰려고 하니 제대로 동작하지 않는다. – 그것이 이 글을 적는 이유이기도 하다 – utf-8 인코딩으로 텍스트를 보내고 싶다면 아래 코드를 참고하면 된다.

local smtp = require("socket.smtp")
local ltn12 = require("ltn12")
local mime = require("mime")

local function headerencode(src)
    return "=?UTF-8?B?" ..
        ltn12.source.chain(
            ltn12.source.string(src),
            ltn12.filter.chain(
                mime.encode("base64"),
                mime.wrap()
            )
        )() ..
        "?="
end

local mesgt = {
    headers = {
        From = headerencode('あわわわ') .. " ",
        To = headerencode('あわわわ') .. " ",
        Subject = headerencode("日本語の件名"),
        ['Content-Type'] = 'text/plain; charset="UTF-8";',
        ['Content-Transfer-Encoding'] = 'base64',
    },
    body = ltn12.source.chain(
        ltn12.source.string("日本語の本文も送信できます."),
        ltn12.filter.chain(
            mime.encode("base64"),
            mime.wrap()
        )
    )
}

assert(smtp.send{
    from = "",
    rcpt = "",
    source = smtp.message(mesgt),
    server = 'localhost'
})

코드는 여기에서 가져와서 indentation만 수정했음.

lua 자체에서 메일 보내는게 어려우면 python이나 powershell로 단계적으로 넘어가려고 했는데, 이 정도면 충분히 만족 :)

Posted by leafbird 트랙백 0 : 댓글 0

댓글을 달아 주세요

사용자 삽입 이미지


코드는 lua_tinker의 샘플에 있는 코드를 토대로 내가 조금 수정했다.

예전에는 콘솔에서 프롬프트를 출력하고 대화형 IO 처리를 하기 위해서 적지 않은 분량의 코드를 직접 작성했는데
이제는 lua_interpreter 갖다 붙이고, 도움말 출력 코드도 직접 작성하는 대신 위에 있는 저 lua 함수를 쓰고나니 이제 콘솔 인터페이스는 전혀 신경쓸것 없이 메인 로직만 작성하면 그만이다.

devnote 블로그에서 console IO 처리를 위한 코드를 올려 두었었는데, 이제 아무짝에도 쓸모없겠군 +_+...
Posted by leafbird 트랙백 0 : 댓글 0

댓글을 달아 주세요

[lua] objinfo

2008. 3. 8. 12:05 from 프로그래밍 팁/lua
lua_tinker 0.5b 예제(sample3.lua) 에 나왔던 유틸리티 함수.


-- 어떠한 객체의 metatable을 통해 등록된 클래스와 그 함수들을 살펴보는 함수
-------------------------------------------------------------------------------
function objinfo(obj)

    local meta = getmetatable(obj)
    if meta ~= nil then
        metainfo(meta)
    else
        print("no object infomation !!")
    end
end

function metainfo(meta)

    if meta ~= nil then
        local name = meta["__name"]
        if name ~= nil then
            metainfo(meta["__parent"])
            print("<"..name..">")
            for key,value in pairs(meta) do 
                if not string.find(key, "__..") then 
                    if type(value) == "function" then
                        print("\t[f] "..name..":"..key.."()")
                    elseif type(value) == "userdata" then
                        print("\t[v] "..name..":"..key)
                    end
                end
            end
        end
    end
end
-------------------------------------------------------------------------------
Posted by leafbird 트랙백 0 : 댓글 0

댓글을 달아 주세요