2016-02-16 1 views
2

Je suis coincé en train d'écrire un script JXA en utilisant l'éditeur de script d'Apple. Essentiellement, je veux passer par mon dossier de boîte de réception et déplacer les messages plus vieux que 44 jours à un dossier d'archives. Je suis capable de trouver le compte, et ma boîte de réception et d'archiver les "boîtes aux lettres", mais je ne peux pas pour la vie de moi comprendre comment déplacer le message sacrément dans une nouvelle boîte aux lettres.JXA Déplacer un message vers un autre dossier/boîte aux lettres

Voici ce que j'ai jusqu'à présent:

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??? 
    } 
} 

Je peux voir dans l'aide de dictionnaire dans l'éditeur de script que l'objet du message a une propriété de boîte aux lettres, mais aucun des éléments suivants semblent fonctionner:

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

toute aide serait grandement appréciée.

Répondre

3

A posé la question sur le Apple Discussion Board et j'ai obtenu une réponse.

Essentiellement, remplacer

// now what???

... avec ...

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

En fait, le poste là-bas avait une façon plus succincte de le faire, mais le travail ci-dessus aussi.

0

Yikes. Cette tâche devrait être un simple script de deux lignes [1]:

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

Quant à la façon de le traduire à JXA - eh bien, il y a des raisons que je recommande généralement coller à AppleScript, y compris la mise en œuvre non brisée, mieux (si toujours pas idéal), et une communauté établie d'utilisateurs experts qui sont toujours heureux d'expliquer et d'aider les nouveaux arrivants.

Ou, encore plus simple, il vous suffit de configurer une règle de messagerie et d'éviter d'avoir à créer un script complètement!


[1] En supposant que vous savez comment l'automatisation basée sur des événements Apple fonctionne réellement, ce qui 99,99% des programmeurs ne le font pas en raison de 1. propre documentation d'Apple ne complètement l'expliquer soit clairement ou correctement, et 2. Scripting Bridge et JXA paralysant et obscurcissant la merde hors de lui. Version courte: c'est pas OOP, c'est RPC plus simples requêtes relationnelles de première classe. (Un peu plus long, si l'explication est un peu incomplète here.)

+1

Voici comment traduire cet extrait AppleScript en JXA: 'var cutoffDate = new Date (Date.now() - 44 * 60 * 60 * 24 * 1000); Application ("Mail"). Move (Application ("Mail"). Inbox.messages.whose ({dateSent: {'<': cutoffDate}}), {à: Application ("Mail"). Mailbox ["Archive" ]) '. – bacongravy

+0

Pas vraiment joli, mais je suppose que l'on devrait être reconnaissant qu'il puisse l'exprimer du tout. BTW, il est préférable d'utiliser 'byName (...)', pas la notation de parenthèse, pour construire des spécificateurs par nom car JXA ne peut pas les distinguer de façon fiable des spécificateurs de propriété/éléments. (Contrairement à Python/Ruby/ObjC/etc, JS traite 'foo.bar' et' foo ['bar'] 'comme interchangeable.) Dans ce cas particulier, vous vous en tirerez, car les objets' mailbox' n'ont pas un attribut 'archive', mais l'utilisation de la méthode' byName' évite tout risque de trébucher les imprudents. – foo