ソラマメブログ

2008年06月20日

【スクリプト】llEmailとemailでのメール本文ついて

もしかしたらバグ?と思われる事があったので書いておきます。

まずなんでもいいのでオブジェクトを2つ用意し、「送信ボックス」と「返信ボックス」とします。
スクリプトは単純で送信ボックスをタッチすると返信ボックスにメールをします。返信ボックスはメールが着たら、そのアドレス宛に返信するというものです。

送信ボックスのスクリプト
//==================================================
// lottery machine
// 1.0.0
// 2008/06/18
// created by sasapy Beck

// Define
    string mail_address = "69e2ef7b-6ca3-84a0-c9bb-21a5646fc445@lsl.secondlife.com"; // 送信先のメールアドレス
    string SUBJECT = "LOTTERY"; // メール題名
    string send_message = "sasapy test message"; // メール本文

    float WAIT_TIME = 5.0; // タイマー(sec)

//--------------------------------------------------
// Main
    default
    {

// Touch Event
        touch_start(integer total_number)
        {
            llOwnerSay("Send Email");
            llEmail(mail_address, SUBJECT, send_message); // メール送信
            llSetTimerEvent(WAIT_TIME); // メール受信チェックタイマー起動
        }

// Timer Event
// メール受信チェックタイマー
        timer()
        {
            llOwnerSay("Timer");
            llGetNextEmail("", SUBJECT); // メール読み出し
        }

// E-Mail Event
// 景品の受け渡し終了の確認
        email(string time, string address, string subj, string message, integer num_left)
        {
            llOwnerSay("time : " + time);
            llOwnerSay("address : " + address);
            llOwnerSay("subj : " + subj);
            llOwnerSay("message : " + message);
            llOwnerSay("num_left : " + (string)num_left);
            llSetTimerEvent(0.0); // タイマー停止
        }
    }
//==================================================

返信ボックスのスクリプト
//==================================================
// premium_box (email版)
// 1.0.0
// 2008/06/19
// created by sasapy Beck

// Define
    string SUBJECT = "LOTTERY"; // メール題名
    string send_message = "recieve sasapy test message"; // メール本文

    float WAIT_TIME = 5.0; // メール受信チェックタイマー用

//--------------------------------------------------
// Main
    default
    {
        state_entry()
        {
            llOwnerSay(" My key : " + (string)llGetKey()); // 送信アドレスを取得するためにキーを表示
            llSetTimerEvent(WAIT_TIME); // メール受信チェックタイマー起動
        }

// Timer Event
        timer()
        {
            llGetNextEmail("", SUBJECT); // メール読み出し
        }

// E-Mail Event
        email(string time, string address, string subj, string message, integer num_left)
        {
            llOwnerSay("time : " + time);
            llOwnerSay("address : " + address);
            llOwnerSay("subj : " + subj);
            llOwnerSay("message : " + message);
            llOwnerSay("num_left : " + (string)num_left);

            llEmail(address, SUBJECT, send_message); // メール送信
        }
    }
//==================================================

この二つを並べて実験しているときは問題なかったのですが、送信ボックスを別のSIMに持っていきREZして試してみたところ、最初の1回だけ返信されてきたメールの本文が空になってしまいます。

スクリプト中でllOwnerSayして、emailイベントのパラメータを表示していますので、そのログも載せます。

//==================================================
[4:50] You: ここからテスト
[4:51] You: 返信ボックスと同じ土地にいます
[4:51] You: 送信ボックスをREZする
[4:51] You: 送信ボックスにタッチする
[4:51] mail send: Send Email
[4:51] mail recieve: time : 1213962696
[4:51] mail recieve: address : 57bbe59e-aa14-8d5f-678d-3d805cdf3b7c@lsl.secondlife.com
[4:51] mail recieve: subj : LOTTERY
[4:51] mail recieve: message : Object-Name: mail send
Region: Wet Hoof (288512, 280832)
Local-Position: (204, 233, 20)

sasapy test message
[4:51] mail recieve: num_left : 0
[4:52] mail send: Timer
[4:52] mail send: time : 1213962701
[4:52] mail send: address : 69e2ef7b-6ca3-84a0-c9bb-21a5646fc445@lsl.secondlife.com
[4:52] mail send: subj : LOTTERY
[4:52] mail send: message : Object-Name: mail recieve
Region: Wet Hoof (288512, 280832)
Local-Position: (204, 231, 20)

recieve sasapy test message
[4:52] mail send: num_left : 0
[4:52] You: 送信→受信・返信→受信顔料
[4:52] You: 完了
[4:52] You: もう一度タッチする
[4:53] mail send: Send Email
[4:53] mail recieve: time : 1213962781
[4:53] mail recieve: address : 57bbe59e-aa14-8d5f-678d-3d805cdf3b7c@lsl.secondlife.com
[4:53] mail recieve: subj : LOTTERY
[4:53] mail recieve: message : Object-Name: mail send
Region: Wet Hoof (288512, 280832)
Local-Position: (204, 233, 20)

sasapy test message
[4:53] mail recieve: num_left : 0
[4:53] mail send: Timer
[4:53] mail send: time : 1213962785
[4:53] mail send: address : 69e2ef7b-6ca3-84a0-c9bb-21a5646fc445@lsl.secondlife.com
[4:53] mail send: subj : LOTTERY
[4:53] mail send: message : Object-Name: mail recieve
Region: Wet Hoof (288512, 280832)
Local-Position: (204, 231, 20)

recieve sasapy test message
[4:53] mail send: num_left : 0

[4:53] You: 完了
[4:53] You: 送信ボックスをTAKEする
[4:54] You: 別SIMへ移動
[4:54] Teleport completed from http://slurl.com/secondlife/Wet%20Hoof/206/236/21
[4:54] Connecting to in-world Voice Chat...
[4:54] Connected
[4:54] You: サンドボックスにきました
[4:55] You: 送信ボックスをREZします
[4:55] You: タッチします
[4:55] mail send: Send Email
[4:55] mail send: Timer
[4:55] mail send: time : 1213962929
[4:55] mail send: address : 69e2ef7b-6ca3-84a0-c9bb-21a5646fc445@lsl.secondlife.com
[4:55] mail send: subj : LOTTERY
[4:55] mail send: message :
[4:55] mail send: num_left : 0
[4:56] You: メールが戻ってきました
[4:56] You: 返信ボックスのOwnerSayが表示されない(のは気にしないで)
[4:56] You: 戻ってきた本文が空です
[4:56] You: もう一度タッチ
[4:56] mail send: Send Email
[4:57] mail send: Timer
[4:57] mail send: time : 1213963018
[4:57] mail send: address : 69e2ef7b-6ca3-84a0-c9bb-21a5646fc445@lsl.secondlife.com
[4:57] mail send: subj : LOTTERY
[4:57] mail send: message : Object-Name: mail recieve
Region: Wet Hoof (288512, 280832)
Local-Position: (204, 231, 20)

recieve sasapy test message
[4:57] mail send: num_left : 0

[4:57] You: 今度は本文があります
[4:57] You: 送信ボックスをTAKEします
[4:57] You: もう一度REZします
[4:58] You: タッチします
[4:58] mail send: Send Email
[4:58] mail send: Timer
[4:58] mail send: time : 1213963087
[4:58] mail send: address : 69e2ef7b-6ca3-84a0-c9bb-21a5646fc445@lsl.secondlife.com
[4:58] mail send: subj : LOTTERY
[4:58] mail send: message :
[4:58] mail send: num_left : 0
[4:58] You: 本文がありません
[4:58] You: もう一度タッチします
[4:58] mail send: Send Email
[4:59] mail send: Timer
[4:59] mail send: time : 1213963126
[4:59] mail send: address : 69e2ef7b-6ca3-84a0-c9bb-21a5646fc445@lsl.secondlife.com
[4:59] mail send: subj : LOTTERY
[4:59] mail send: message : Object-Name: mail recieve
Region: Wet Hoof (288512, 280832)
Local-Position: (204, 231, 20)

recieve sasapy test message
[4:59] mail send: num_left : 0
[4:59] You: 今度は本文があります
[4:59] You: 送信ボックスをTAKEします
[4:59] You: 元の場所にテレポします
[4:59] Teleport completed from http://slurl.com/secondlife/Sandbox%20Island/128/18/27
[4:59] Connecting to in-world Voice Chat...
[5:00] Connected
[5:00] You: 元の場所に戻ってきました
[5:00] You: 送信ボックスをREZします
[5:00] You: タッチします
[5:00] mail send: Send Email
[5:00] mail recieve: time : 1213963244
[5:00] mail recieve: address : e6128ef6-1e7b-d240-4571-ce3a464f85f4@lsl.secondlife.com
[5:00] mail recieve: subj : LOTTERY
[5:00] mail recieve: message : Object-Name: mail send
Region: Wet Hoof (288512, 280832)
Local-Position: (205, 232, 20)

sasapy test message
[5:00] mail recieve: num_left : 0
[5:01] mail send: Timer
[5:01] mail send: time : 1213963245
[5:01] mail send: address : 69e2ef7b-6ca3-84a0-c9bb-21a5646fc445@lsl.secondlife.com
[5:01] mail send: subj : LOTTERY
[5:01] mail send: message : Object-Name: mail recieve
Region: Wet Hoof (288512, 280832)
Local-Position: (204, 231, 20)

recieve sasapy test message
[5:01] mail send: num_left : 0
[5:01] You: 本文はちゃんとあります
//==================================================

今のところ、違うSIMに行ってREZして1回目は100%起こっています。



この記事へのトラックバックURL

http://sasapy.slmame.com/t279634
この記事へのコメント
6月21日のiNNXオフィスアワー(http://blog.innx.co.jp/)にて、この問題を検証していただきました。取り上げていただきありがとうございました。
現象が起こることを確認し、さらに検証を進めた結果、Fakeさん(http://fake.dj/secondlife/txp/)が現象の起こるきっかけを発見してくれました。

「オブジェクトでメールを受信する場合、llGetNextEmailする前に送られてきたメールの本文が空になる」
(※送信するオブジェクトと違うSIMの場合のみ)

ということです。

似たような事例がJIRAにもあがっているみたいですので、いずれ対応されるでしょう。

とりあえずスクリプトの対応策としては、メールの送受信をする場合は、ダミーで先にllGetNextEmailをしておくということになります(例えばdefaultのstate_entry内なので)。
Posted by ささぴささぴ at 2008年06月23日 09:54
ちょっと変わった手法をお教えします^^
タイムイベントでllGetNextEmailを使うことを皆さんしていらっしゃるのですが
メールの取りこぼしの無い方法をご紹介します。
単純にstate_entryやon_rezにてllGetNextEmailをしておくことは
変わりないのですが、emailイベントの最後にllGetNextEmailを記述して
置けば、メールの受信があったら最後に次のメールを受け付けるという
ロジックになりますので
タイムイベントは無しで必ず1個llGetNextEmailを起動させておくという
ちょっちエレガントな方法になりますよ^^
今まで人に教えませんでしたが、ご参考までw
Posted by mayuko Nishimayuko Nishi at 2008年07月25日 15:50
ああああ、ごめんなさーい><
勘違いしてました><
メールと共に受け取るにはllGetNextEmailをタイマーで動かすのが
定石できたぁ><
メールキューの書き出しと勘違いしてましたぁあああ
スミマセーン><
Posted by mayuko Nishimayuko Nishi at 2008年07月25日 17:09
mayuko Nishiさん、わざわざありがとうございます。

で、訂正していただいたとおりllGetNextEmailを実行すると、その時にメールが着ていればイベントが発生するというもので、メールが来ていなければイベントは起こりませんし、その後にメールが来てもやはりイベントは起こりません。

で、テスト用のサンプルスクリプトを載せたので細かい処理はしていませんが、実際のメール受信イベントでは、イベント発生時のパラメーターに残りメール数が入ってきますので、それをチェックして0でなければ再度llGetNextEmailを行うようにしています。
Posted by ささぴ at 2008年07月25日 20:47