LuaSocketでメール送信する

業務で使うアプリでは、メール送信をすることが非常に多いと思います。Luaでもメールを送信することができました。

とは、言っても、LuaSocketを使えば簡単なことでした。既に socket.smtp というモジュールがあるので、LuaSocketのサンプル(http://www.tecgraf.puc-rio.br/~diego/professional/luasocket/smtp.html)通りで英語のメールは簡単に送信成功しました。(マルチパートの添付ファイル付きメールを送信する例も載ってます)

LuaSocketのインストール

Keplerをインストールすれば、インストールされます。Keplerが入ってないLinuxでも何の迷いもなくコンパイルとインストールができました。

$ wget http://luaforge.net/frs/download.php/2664/luasocket-2.0.2.tar.gz
$ tar zxf luasocket-2.0.2.tar.gz
$ cd luasocket-2.0.2
$ make
$ su
# make install

日本語のメールを送信する

本文にマルチバイトを指定する

LuaSocketのマニュアルには、マルチバイトの本文を指定する方法は載ってませんでしたが、添付ファイルのエンコード方法を参考にしてみました。本文に日本語の文を指定するためには、ヘッダに、Content-Type と Content-Transfer-Encoding を指定しました。

ヘッダにマルチバイトを含める

こっちは、用意された機能があるかもしれないと思いましたが、base64 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('あわわわ') .. " <smeghead@example.com>",
To = headerencode('あわわわ') .. " <smeghead@example.com>",
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 = "<smeghead@example.com>",
rcpt = "<smeghead@example.com>",
source = smtp.message(mesgt),
server = 'localhost'
})

ltn12 とか mime モジュールあたりは、かなり抽象化されていて、どうゆう原理になってるかまでは理解していませんが、ちゃんと読んだらよい勉強になりそうです。

Leave a Comment

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.