【问题标题】:JXA Move a message to a different folder/mailboxJXA 将消息移动到不同的文件夹/邮箱
【发布时间】:2016-02-19 23:10:41
【问题描述】:

我一直在使用 Apple 的脚本编辑器编写 JXA 脚本。本质上,我想浏览我的收件箱文件夹并将超过 44 天的邮件移动到存档文件夹。我能够找到该帐户、我的收件箱和存档“邮箱”,但我终其一生都无法弄清楚如何将糟糕的邮件移至新邮箱。

这是我目前所拥有的:

var staleTime = 44;
var countMessages = 0;
var Mail = new Application("Mail")
var accounts = Mail.accounts();
var account;
var found = false;

for (i = 0; i < accounts.length && !found; ++i) {
    if (accounts[i].name().indexOf("xchange") > -1) {
        account = accounts[i];
        found = true;
    }
}

var mailboxes = account.mailboxes();
var inbox;
var archive;

for (i = 0; i < mailboxes.length; ++i) {
    if(mailboxes[i].name().indexOf("nbox") > -1) {
        inbox = mailboxes[i];
    }
    if(mailboxes[i].name().indexOf("rchive") > -1 &&
       mailboxes[i].name().indexOf("CDE") == -1) {
       archive = mailboxes[i];
    }
}

// console.log("mailbox name is: " + inbox.name());

var messages = m inbox.messages();
var fortyFourDaysAgo = new Date();
fortyFourDaysAgo.setDate(fortyFourDaysAgo.getDate() - staleTime);

for (i = 0; i < messages.length; ++i) {
    var dateSent = messages[i].dateSent();
    if(dateSent < fortyFourDaysAgo) {
        // now what???
    }
}

我可以在脚本编辑器的字典帮助中看到 Message 对象具有邮箱属性,但以下似乎都不起作用:

messages[i].mailbox = archive;
messages[i].mailbox(archive);

任何帮助将不胜感激。

【问题讨论】:

    标签: javascript applescript javascript-automation


    【解决方案1】:

    Apple Discussion Board上提问,得到了答案。

    本质上,替换

    // now what???

    ...与...

    Mail.move(messages[i], {to: archive});

    其实那边的帖子有更简洁的做法,不过上面的也行。

    【讨论】:

      【解决方案2】:

      哎呀。这个任务应该是一个简单的两行脚本[1]:

      set cutoffDate to (current date) - 44 * days
      tell application "Mail" to move (every message of inbox whose date sent < cutoffDate) to mailbox "Archive"
      

      至于如何将其转换为 JXA – 嗯,我通常建议坚持使用 AppleScript 的原因,包括完整的实现、更好(如果仍然不理想)的文档,以及一个由专家用户组成的社区,他们总是乐于解释和帮助新人。

      或者,甚至更简单,只需设置一个邮件规则并完全避免编写脚本!


      [1] 假设您知道 Apple 基于事件的自动化实际上是如何工作的,但 99.99% 的程序员不知道这是因为 1. Apple 自己的文档完全无法清楚或正确地解释它,以及 2. Scripting Bridge 和 JXA削弱和混淆它的废话。简短版本:它不是 OOP,它是 RPC 加上简单的一流关系查询。 (稍微长一点,如果解释有点不完整here。)

      【讨论】:

      • 以下是将 AppleScript sn-p 转换为 JXA 的方法:var cutoffDate = new Date(Date.now() - 44 * 60 * 60 * 24 * 1000); Application("Mail").move(Application("Mail").inbox.messages.whose({ dateSent: { '&lt;': cutoffDate } }), {to: Application("Mail").mailbox["Archive"])
      • 不完全漂亮,但我想应该感谢它可以表达它。顺便说一句,最好使用byName(...),而不是括号符号来构造按名称说明符,因为 JXA 无法可靠地将它们与属性/元素说明符区分开来。 (与 Python/Ruby/ObjC/etc 不同,JS 将 foo.barfoo['bar'] 视为可互换的。)在这种特殊情况下,您将摆脱它,因为 mailbox 对象没有 archive 属性,但是使用byName 方法可以避免任何绊倒粗心的风险。
      猜你喜欢
      • 2010-12-27
      • 2021-03-09
      • 2022-01-21
      • 2019-12-13
      • 1970-01-01
      • 2019-07-11
      • 1970-01-01
      • 2015-01-23
      • 2011-08-31
      相关资源
      最近更新 更多