aardio 文档

aardio 范例: mail.tm 临时邮箱

如果要在这里调用

import win.ui;
import fonts.fontAwesome;
/*DSG{{*/
var winform = win.form(text="mail.tm 临时邮箱";right=759;bottom=550;bgcolor=0xFFFFFF)
winform.add(
btnRefresh={cls="plus";text='\uF021';left=700;top=18;right=740;bottom=52;bgcolor=0xB8A217;color=0xFFFFFF;font=LOGFONT(h=-16;name='FontAwesome');z=4};
btnRegister={cls="plus";text="注册邮箱";left=20;top=18;right=140;bottom=52;bgcolor=0xD47800;color=0xFFFFFF;font=LOGFONT(h=-14);iconStyle={align="left";font=LOGFONT(h=-14;name='FontAwesome');padding={left=12}};iconText='\uF0E0';textPadding={left=35};z=1};
editContent={cls="richedit";left=20;top=413;right=740;bottom=530;edge=1;multiline=1;readonly=1;vscroll=1;z=8};
editEmail={cls="edit";left=150;top=20;right=681;bottom=50;edge=1;readonly=1;z=2};
editToken={cls="edit";left=150;top=56;right=600;bottom=86;edge=1;readonly=1;z=9};
listview={cls="listview";left=20;top=157;right=740;bottom=362;edge=1;fullRow=1;z=6};
staticContent={cls="static";text="邮件内容:";left=20;top=375;right=100;bottom=395;font=LOGFONT(h=-14);transparent=1;z=7};
staticList={cls="static";text="邮件列表:";left=20;top=107;right=100;bottom=127;font=LOGFONT(h=-14);transparent=1;z=5};
staticStatus={cls="static";text="状态:未注册";left=639;top=70;right=740;bottom=90;align="right";color=0x808080;transparent=1;z=3};
staticToken={cls="static";text="令牌:";left=49;top=62;right=140;bottom=88;align="right";transparent=1;z=10}
)
/*}}*/

// 注册并监听邮箱
winform.btnRegister.oncommand = function(){ 
    winform.btnRegister.disabledText = ['\uF254','\uF251','\uF252','\uF253','\uF250']

    thread.invoke(
        function(winform, mailState){
            // 调用 mail.tm 接口注册临时邮箱
            import web.rest.jsonClient;

            var http = web.rest.jsonClient();
            var mailApi = http.api("https://api.mail.tm/");

            // 获取可用域名
            var domainList, err = mailApi.domains.get();
            if(!domainList) return winform.msgboxErr(err); 

            var domain = domainList["hydra:member"][1].domain;
            var email = "aardio_" + time.stamp(true/*返回字符串*/,true/*秒*/) + "@" + domain;
            var password = "PWD_"+string.random(15);

            // 注册账号
            var account, err = mailApi.accounts.post(
                address = email;
                password = password;
            );
            if(!account)return winform.msgboxErr(err||"注册失败,可能是注册太频繁了!");

            // 获取 token
            var tokenData, err = mailApi.token.post(
                address = email;
                password = password;
            );
            if(!tokenData) return winform.msgboxErr(err);

            // 设置 token
            http.setAuthToken(tokenData.token);

            winform.editToken.text = tokenData.token;
            winform.editEmail.text = email + ":" + password;

            winform.btnRegister.disabledText =  "已注册"; 

            winform.staticStatus.text = "监听中...";
            winform.staticStatus.color = 0x28A745;

            // 使用 mercure 协议监听 mail.tm 新邮件(实际上就是 SSE 流)
            var eventSource = http.api("https://mercure.mail.tm/.well-known/mercure");

            // 参数 2 指定 SSE 回调函数就会自动切换到 SSE 模式
            var ok,err = eventSource.get(
                { topic = "/accounts/" + account.id}
                , function(sseMessage){
                    var data = sseMessage.data;

                    //data 可能是数值(新邮件数)或对象(邮件信息)
                    if(data[["@context"]]=="/contexts/Message"){
                        var mail = data;

                        winform.listview.addItem([
                            mail.from.address,
                            mail.subject || mail.intro,
                            time.iso8601(mail.createdAt).format("%Y/%m/%d %H:%M:%S"), 
                            mail.id
                        ]);

                        /*
                        http 对象已进入流模式,
                        如果要在这里调用 https://api.mail.tm/messages/{id}/get 
                        则需要创建新的 web.rest.jsonClient
                        */
                    }
                }
            );

        }, winform, mailState
    )
}

// 手动刷新
winform.btnRefresh.oncommand = function(){

    winform.btnRefresh.disabledText = ['\uF254','\uF251','\uF252','\uF253','\uF250']
    winform.listview.clear(); 

    thread.invoke(
        function(winform){

            // 调用 mail.tm 接口获取邮件列表

            import web.rest.jsonClient;
            var http = web.rest.jsonClient();
            http.setAuthToken(winform.editToken.text);

            var mailApi = http.api("https://api.mail.tm/");
            var messages, err = mailApi.messages.get();

            if(messages){

                var list = messages["hydra:member"];
                for(i=1; #list){
                    var mail = list[i]; 
                    winform.listview.addItem([
                        mail.from.address,
                        mail.subject || mail.intro,
                        time.iso8601(mail.createdAt).format("%Y/%m/%d %H:%M:%S"),
                        mail.id
                    ]);
                }
                winform.staticStatus.text = "邮件: " + #list;
            }

            winform.btnRefresh.disabledText = null;
        }, winform
    )
}

// 查看邮件详情
winform.listview.onSelChanged = function(selected,item,subItem,nmListView){ 
    if(!item) return;

    var msgId = winform.listview.getItemText(item,4);
    winform.editContent.text = "正在加载...";

    thread.invoke(
        function(winform,msgId){
            // 调用 mail.tm 接口获取邮件详情

            import web.rest.jsonClient;

            var http = web.rest.jsonClient();
            http.setAuthToken(winform.editToken.text);

            var mailApi = http.api("https://api.mail.tm/");
            var detail, err = mailApi.messages[msgId].get();

            if(detail){   
                // detail.text 是邮件的文本格式(字符串),detail.html 则是数组
                winform.editContent.text = detail.text  || "(无内容)";
            } 

        }, winform,msgId
    )
}

winform.listview.columns = [
    ["发件人", 180],
    ["主题", -1],
    ["时间", 150],
    ["ID",0]
]

winform.btnRegister.skin({
    background={default=0xFF0078D4;hover=0xFF1084D8;active=0xFF005A9E;disabled=0xFFCCCCCC};
    color={default=0xFFFFFFFF}
})

winform.btnRefresh.skin({
    background={default=0xFF17A2B8;hover=0xFF1AB3CB;active=0xFF117A8B;disabled=0xFFCCCCCC};
    color={default=0xFFFFFFFF}
})

winform.show();
win.loopMessage();
Markdown 格式