2011/04/08

スクリーンショットをメール送信する

NILScriptのMailユニットのSMTPクラスでは、添付ファイルの送信も可能です。
添付ファイルには、Fileオブジェクトの他、メモリ上のバイト列を指すPointerオブジェクトを指定することも可能です。
画像を扱うImageオブジェクトには、ファイルに書き込むことなくPNGやJPEGなどの画像ファイルのバイト列を生成してPointerオブジェクトで得るtoBytes()というメソッドが用意されているので、以下のようにデスクトップのスクリーンショットなどをファイルに保存することなくメール送信することが可能です。
try{
    var smtp=new (require('Mail').SMTP)({
        host:'vm01xp',
        user:'test',
        password:'asdf',
        pop:true,
    });
    var img=require('Image').Image.capture();
    var buf=img.toBytes('.png');
    smtp.send({
        subject:"ScreenShot",
        from:'test@example.com',
        to:'test@example.com',
        message:"test",
        files:{
            'image/png:ss.png':buf
        },
    });
}finally{
    free(smtp,buf,img);
}
「require('Image').Image.capture()」でデスクトップのスクリーンショットをImageオブジェクトとして取得し、img変数に代入します。
次に、img.toBytes('.png')でPNGファイルのバイト列を生成しています。
これらのオブジェクトは、最後にfree()関数で解放する必要があります。
そして、SMTPオブジェクトのsend()メソッドの引数で、filesメンバに添付したいファイルの情報を与えます。
添付するのがFileオブジェクトの場合は、FileオブジェクトそのものやFileオブジェクトの配列として指定するだけで、元のファイル名で添付できますが、Pointerオブジェクトの場合はファイル名を指定する必要があるので、上記のように「"content-type:filename":data」のような形式のオブジェクトにして指定します。
Content-Typeの部分を省略して「"filename":data」のようにすると、Content-Typeは「application/octet-stream」として添付されますが、メールソフトの添付画像表示機能などが効かなくなる場合があるので、形式が分かるならなるべく指定しておいた方がいいでしょう。

0 件のコメント:

コメントを投稿