LuaSocketでメール送信する
2008/08/03
業務で使うアプリでは、メール送信をすることが非常に多いと思います。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 モジュールあたりは、かなり抽象化されていて、どうゆう原理になってるかまでは理解していませんが、ちゃんと読んだらよい勉強になりそうです。