LlEmail/ja

From Second Life Wiki
Jump to navigation Jump to search

要約

関数: llEmail( string address, string subject, string message );

subjectmessageaddress に電子メールで送ります。

• string address
• string subject
• string message

メッセージ全体 (アドレス、タイトルやその他諸々のフィールド) は合計で 4096 バイトを超えてはなりません。

仕様

message の頭に電子メールを送信するプリムの情報が付加されます。

テンプレート
Object-Name: *prim*
Region: *simname* (*simpos.x*, *simpos.y*)
Local-Position: (*primpos.x*, *primpos.y*, *primpos.z*)

*message*
Object-Name: Object
Region: Gibson (254976, 256000)
Local-Position: (117, 129, 50)

実際のメッセージはここから始まります。

警告

  • この関数は 20.0 秒間、スクリプトを停止します。
  • オブジェクトが一定時間に送信できるemailメッセージの数には限界があります。
  • 1 人のエージェントが所有するオブジェクトから 1 時間に送信できるメッセージは 500 個までです。
  • 4096 バイトの制限には、タイトルと、自動的に挿入される文字列も含みます。実質的な最大サイズは約 3600 バイトになります。
  • (2008 年 9 月) 電子メールのスロットルが微妙に変更されました。 Prospero Linden 曰く、「今までは長いスロットルで、1 個のスクリプトが電子メールを送信した後 20 秒間スリープするようにしていました。新しいスロットルはユーザごとになります... ユーザの中には、スパムを送信するために、たくさんの違うスクリプトを使っていました。 (新しいスロットルは) Second Life の外に対して送信するときに適用されます。同じ地域内で送信するメッセージは (20 秒遅延の) スロットル調整はされていませんでした。そして、他の SIM に対して送信するメッセージも (20 秒遅延の) スロットル調整はされていなかったのではないかと *思って* います。」
  • バグ SVC-23 (2005 年から存在) により、地域が再起動されたりオブジェクトが地域の境界線をまたいだりするまでは、オブジェクトが電子メールを全く受信できないことがあります (スクリプトのリセットでも駄目です) 。送信された電子メールは再起動/地域間移動したあと、徐々に受信されていきます。このため、この関数を信頼できる SIM 間メッセージング手段と思ってはいけません。

サンプル

string email_address = "somebody@example.com"; // メッセージ受信者
 
default
{
    state_entry() {
 
        //電子メールを通常のメールアカウントに送信します
        llEmail( email_address, "Look it's an email subject line!", "Testing 1 2 3" );
    }
 
    touch_start( integer num_detected ) {
        integer i = 0;
 
        // 別の電子メールを送信して、誰がプリムに触ったかを知らせます
        do
            llEmail( email_address, "No touching!", "I was defiled by: " + llDetectedName(i) + "\nKey: " + (string) llDetectedKey(i) );
        while(++i < num_detected);
    }
}

便利なスニペット

email( string time, string address, string subj, string message, integer num_left )
{
    if(llGetSubString(address, -19, -1) == "@lsl.secondlife.com")//ヘッダをトリム
        message = llDeleteSubString(message, 0, llSubStringIndex(message, "\n\n") + 1);
}

注意点

  • この関数は遅延時間が長いため、 link_message で呼ばれたサブスクリプトで呼び出されることがよくあります。
  • Second Life のプリムに電子メールを送る場合、アドレスは [key]@lsl.secondlife.com になります。
    • llGetKey で返却されたキーが "a2e76fcd-9360-4f6d-a924-000000000003" ならば、電子メールアドレスは "a2e76fcd-9360-4f6d-a924-000000000003@lsl.secondlife.com" になるということです。
    • エージェントには固定電子メールアドレスがありません。 llInstantMessage または llOwnerSay を使用しましょう。

プリム間電子メール

LSL では電子メールを llEmail で送信し、 email イベントでそれを受信することができます。


email イベントは発生時に 5 つの情報を見せます。

• string time メッセージの送信時刻。 (string)llGetUnixTime 形式
• string address メッセージ送信者
• string subject メッセージのタイトル
• string message メッセージの本文
• integer num_left キューに残っているメッセージの数


送信されたメッセージを llEmail で受信するとき、先頭にあるヘッダからメッセージを切り出します。ヘッダと元のメッセージ本文は "\n\n" で区切られています。

integer divide = llSubStringIndex(message, "\n\n");
string header = llDeleteSubString(message, divide, -1);
message = llDeleteSubString(message, 0, divide + 1);

ヘッダ要素のうち 1 つだけを取得したい場合は、このようにします:

list lines = llParseStringKeepNulls(header, ["\n"], []);
string objname_line = llList2String(lines, 0);
string region_line = llList2String(lines, 1);
string localpos_line = llList2String(lines, 2);

純粋な地域名を取得したい場合は、このようにします:

string region_name = llStringTrim(
            (string)llDeleteSubList(
                llParseStringKeepNulls(
                    llDeleteSubString(region_line, 0, 12),
                    [], 
                    ["("]
                ), -2, -1), STRING_TRIM);

このアプリケーションでは電子メールを使って、オブジェクトが中央制御サーバに問い合わせを行い、オーナーが最新のバーションをもっているかを確認します。オブジェクトの中:

string version = "1"; //
string type = "lolcube";
default
{
    on_rez(integer start_param)
    {
        llEmail("5a634b27-f032-283f-2df2-55ead7724b23@lsl.secondlife.com",
            version,
            (string)llGetOwner() + "," + type);
    }
}

サーバ:

default
{
    state_entry()
    {
        llSetTimerEvent(15.0);
    }
    
    timer()
    {
        llGetNextEmail("", "");
    }
    
    email( string time, string address, string version, string message, integer num_left )
    {    
        if ((integer)version < 2)
        {
            list info = llCSV2List( llDeleteSubString(message, 0, llSubStringIndex(message, "\n\n") + 1));
            llGiveInventory(llList2Key(info,0), llList2String(info,1));
        }
        
        if(num_left)
            llGetNextEmail("","");
    }
}

関連項目

イベント

• email
• link message

関数

• llGetNextEmail
• llMessageLinked

記事

• IM to email
• Postcards

特記事項

All Issues

~ Search JIRA for related Issues
   Region incoming email queue for objects becomes suspended
   llEmail and llHTTPRequest do not handle non-ASCII characters
   Include "Content-Type: text/plain; charset=UTF-8" header in the messages forwarded from second life.

Signature

function void llEmail( string address, string subject, string message );
この翻訳は 原文 と比べて古いですか?間違いがありますか?読みにくいですか?みんなで 修正 していきましょう! (手順はこちら)
この項目はあなたにとって参考にならない項目ですか?もしかしたらLSL Wikiの関連した項目が参考になるかもしれません。