Denna delen av 99 uppdateras inte längre utan har arkiverats inför framtiden som ett museum.
Här kan du läsa mer om varför.
Mac-nyheter hittar du på Macradion.com och forumet hittar du via Applebubblan.

Applescript, skicka mail och radera

Tråden skapades och har fått 12 svar. Det senaste inlägget skrevs .
1

Hejsan, jag håller på med ett litet applescript där en del av funktionen skall vara att skicka iväg ett mail. Som det är just nu fungerar allt frid och fröjd med "send new_message", där "new_message" så klart är mailet som jag skapat i scriptet.

Nu är grejen att jag verkligen inte behöver ha det mailet sparat efter att det är skickat, jag vill alltså skicka det och så snart det är sänt ska det tas bort. Någon som har ett förslag på lösning av detta?

Nix, det räcker inte riktigt till
Måste komma på ett sätt att sköta rubbet via applescriptet...:tveksam:

Varje meddelande har ett unikt ämne däremot, går det att använda sig av på något vis?

Senast redigerat 2007-04-09 00:47

Varje meddelande har även ett ID. Koll längst ner på denna sida för en lista med properties.

Arkivera email till FileMaker

Använd det för att skicka kommandot delete.

Ursprungligen av Taz_1999:

Varje meddelande har även ett ID. Koll längst ner på denna sida för en lista med properties.

Arkivera email till FileMaker

Använd det för att skicka kommandot delete.

Tackar så mycket, det där kan nog sätta mig på rätt väg. Om jag förstår det hela rätt så måste jag loopa igenom alla mail i sent-mappen?

Jag har förresten ett litet problem till.
Jag skulle vilja att mailet skickas och att Mail sedan avslutas

send new_message
quit

fungerar inget vidare.

Finns det något sätt att "pausa" scriptkörningen till dess att mailet är skickat?

Jag kan tips om två gamla trådar så länge:

Applescript för att skapa mail till viss person i Microsoft Entourage

Syntaxen skiljer sig alltå mellan olika program man scriptar, så därför får man öppna ordlistan för respektive program i vilken du hittar alla kommandon, syntaxen för dem vilka objekt man kan "prata med" och vilka properties de har. (Inuti Manusredigare: Arkiv > Öppna Ordlista > Mail) Du skulle kunna få ideer frånhur scriptet ovan fungerar för ditt eget kanske?

I denna diskussion så hittar du en loop som loopar igenom alla markerade meddelanden (i Mail) och gör något med vart och ett av dem:

Applescript för att radera vissa ord ur ärenderaden i mail tex ordet spam

Kanske du kan använda detta för att söka fram de meddelanden som du vill radera efter att du skickat dem?

Mera specifika svar på dina frågor följer här:

Om du måste loopa igenom alla mail i sent-mappen? Det vet jag inte för jag vet inte hur ditt script ser ut, eller vad det skall göra och i vilken ordning och hur det startas och hur många mail som skickas och varför. *hint, hint*

Vänteloopar i Applescript går att bygga på flera olika sätt, ibland kan man helt enkelt kolla med en repeat while och sedan läsa av någon lämplig property, ibland så finns ingen bra property så då får man läsa av någon annan property eller göra något annat test för att se att applikationen går att prata med igen.

Entourage har tex "connection in progress" (en property för application, ledsen för svengelskan) och Mail har en "background activity count"

En vänteloop i Mail skulle kanske kunna se ut så här, jag har testat denna kod lite hastigt.

tell application "Mail"
-- din kod för att skicka mailet passar bra här
repeat until background activity count = 0
end repeat
quit
end tell

Det finns flera metoder att få till en wait-funktion, men jag skippar dem så länge.

Tack för länkarna, ska ta och läsa igenom dem noggrannare snart

Ursprungligen av Taz_1999:

Syntaxen skiljer sig alltå mellan olika program man scriptar, så därför får man öppna ordlistan för respektive program i vilken du hittar alla kommandon, syntaxen för dem vilka objekt man kan "prata med" och vilka properties de har. (Inuti Manusredigare: Arkiv > Öppna Ordlista > Mail)

Tack så mycket för det där Har undrat som tusan efter hur man ska veta exakt vad man kan göra med applikationerna Nu vet jag...

Ursprungligen av Taz_1999:

Om du måste loopa igenom alla mail i sent-mappen? Det vet jag inte för jag vet inte hur ditt script ser ut, eller vad det skall göra och i vilken ordning och hur det startas och hur många mail som skickas och varför. *hint, hint*

Nyfiken? Jag lovar att hojta till när allt är klart
I stort ser det ut såhär:

  • Gör lite allmän goja

  • Kolla om Mail körs

  • Kasta ihop ett mail

  • Skicka mailet

  • Avsluta Mail ifall det inte låg igång från början

  • Städa upp

Det jag skulle vilja peta in där innan Mail avslutas är alltså att det mailet som precis skickades ska tas bort. Att direkt kunna påverka det mail man precis skickade verkar inte gå, tråkigt nog.

Ditt tips om pausningen av scriptet under tiden mailet skickades fungerade fint

Detta startar mail om det inte är igång
tell application "Mail"
activate
end tell

Detta lagrar undan om mail är igång och efteråt så avslutas mail om det startes.

tell application "System Events"
set MailRunningCount to count (every process whose creator type is "emal")
end tell

tell application "Mail"
activate

-- Koden för att skicka mailet passa bra här:

-- Om Mail inte var igång, så avslutas det nu.
if MailRunningCount = 0
quit
end if

end tell

Så hur tog jag reda på det här då? Jo, det finns två program som är bra att känna till när man håller på med Applescript, så öppna ordlistorna för dessa och lattja lite med dem.

Jag öppnade ordlistan för (efter att ha googlat lite) "System Events" och sökte och provade lite, du kan göra samma sak genom att skapa ett nytt fönster och skriv detta i det:

tell application "System Events"

end tell

Mellan de två raderna kan du sedan skriva: get every application process , sedan köra och och då får du något som liknar detta i resultatfönstret: {application process "loginwindow" of application "System Events", application process "Dock" of application "System Events", application process "Finder" of application "System Events", application process "iTunesHelper" of application "System Events" ....

För att testa något nytt kan du söka fram "process" under Process suite" i ordlistan så ser du lite av syntaxen och vilka properties som en process har, tex "creator type", så kopiera en snutt från resultatet ovan och sätt två -- före raden som redan finns där, så att den inte körs längre och lägg till denna rad efteråt:

tell application "System Events"
-- get every application process
get creator type of process "Mail"
end tell

Resultatet kan du sedan använda i ett count-kommando, som du ser ovan.

(De andra programmen som är bra att ha koll på är "Standard Additions" och "URL Access Scripting", den första innehåller tex syntaxen för att ställa frågor till användaren i en dialog-ruta).

Ursprungligen av Taz_1999:

Detta startar mail om det inte är igång
[massa text]

Jo, hela den där biten har jag fixat för länge sedan, det är bara det där lilla problemet med att radera mailet som just skickades via scriptet jag har kvar (inte nödvändigt, men trevligt om det gjordes i scriptet)

Jag tar reda på om Mail körs via:
tell application "System Events" to set MailRunning to (number of items in (process whose name is "Mail") is greater than 0)
tell application "Mail"
<kod>
if MailRunning is not true then quit
end tell

Ursprungligen av Taz_1999:

(De andra programmen som är bra att ha koll på är "Standard Additions" och "URL Access Scripting", den första innehåller tex syntaxen för att ställa frågor till användaren i en dialog-ruta).

Får se om jag bygger på med sådan funktionalitet sedan Tack för tipset

Nämnde jag att varje mail har ett ID och du kan referera till mailet genom ID't, och du kan radera ett mail genom att använda dess ID, som i delete message ID. Nämnde jag att ett mail har ett ID?

Vill du ha någon hjälp får du berätta VAD som inte fungerar, vad du provat osv, så vi som försöker hjälpa inte slösar bort vår tid.

tell application "System Events" to set MailRunning to (number of items in (processes whose name is "Mail") is greater than 0)
tell application "Mail"
activate
if MailRunning is not true then tell application "System Events" to set visible of process "Mail" to false
set new_message to make new outgoing message with properties {subject:MYTITLE}
send new_message
repeat until background activity count = 0
end repeat
if MailRunning is not true then quit
end tell

Där är min kod för att dra iväg mailet, det är alltså det mailet som jag sedan vill radera. Men jag har ännu inte listat ut hur jag ska göra det. Det är ett dygn sedan jag började röra Applescript för första gången mer eller mindre.

Hur får jag fram det skickade mailet ID lite smidigt?

Ok, nu har jag tagit mig tid att starta Mail, öppna ordlistan och experimenterat lite för att skapa ett script som skapar ett meddelande, skickar det och raderar det efteråt, så här ser det ut.

tell application "Mail"
activate
set this_text to "Tjosan, här är ett meddelade skapat via Applescript."
set sender_text to "[email protected]"
set subject_text to "Testar med Applescript och delete"
set this_message to make new outgoing message at end of outgoing messages with properties {content:this_text, sender:sender_text, subject:subject_text, visible:true}

tell this_message
make new to recipient at end of to recipients with properties {address:"[email protected]"}
set this_message_id to id of this_message
send this_message
delete
end tell


end tell

"set variabel to id of meddelandenamn" alltså
Jag ser däremot inte var det sedan används i koden...

Jag flyttade in min delete i tell new_message-delen:
tell application "System Events" to set MailRunning to (number of items in (processes whose name is "Mail") is greater than 0)
tell application "Mail"
activate
if MailRunning is not true then tell application "System Events" to set visible of process "Mail" to false
set new_message to make new outgoing message with properties {subject:MYTITLE}
tell new_message
set new_message_id to id of new_message
set sender to email_from
make new to recipient at end of to recipients with properties {address:email_to}
make new attachment with properties {file name:FIL} at after the last paragraph
send new_message
delete
end tell
if MailRunning is not true then quit
end tell

Det raderar däremot inte mailet ett dugg, det ligger kvar i skickat-mappen. Inte heller går det att skicka med IDt till delete, då det inte är av rätt typ.

Någon som ser på vilket sätt jag använder delete på fel sätt? Jag har som sagt var bara kodat Applescript i ett dygn, så jag hoppas på viss förståelse.

Detta funkar:

tell application "Mail"
activate
set sender_text to "[email protected]"
set subject_text to "Detta meddelande är otroligt nog redan raderat från skickade meddelanden"
set this_text to "Här är ett meddelade skapat via Applescript, skickat och raderat."
set this_message to make new outgoing message at end of outgoing messages with properties {content:this_text, sender:sender_text, subject:subject_text, visible:true}

tell this_message
make new to recipient at end of to recipients with properties {address:"[email protected]"}
send this_message
-- Från denna punkt så finns inte meddelandet längre i outgoing messages, det betyder att referensen this_message är inaktuell.
end tell

-- Vänta tills meddelandet är skickat
repeat until background activity count = 0
delay 2 -- vänta i två sekunder, innan man kollar igen.
end repeat

-- Meddelandet ligger nu i Sent Items och det är det nyaste meddelandet
-- Vilken box som skickade meddelanden hamnar i varierar beroende på om kontot är IMAP eller POP och respektive inställningar för kontot och förstås för Mail i sig. Det går att kolla namn på boxar, vilka konton som finns och vilka boxar som finns i respektive rader med sådana här rader:

-- Returnerar alla konton som i sin tur innehåller mailboxar/mappar:
-- get every account

-- Returnerar alla mailboxar/mappar som finns i ett visst konto:
-- get every mailbox of account "Ola Andersson"

-- Returnerar alla meddelanden som finns i en viss mailbox/mapp:
-- get every message of mailbox "Skickat" of account "Ola Andersson"

-- Ger dig datum,klockslag på nyaste meddelandet i denna mapp,
-- (du kan även läsa av tex id respektive message id, eller sender, subject, content mm.):
-- get date sent of first message of mailbox "Sent Messages" of account "Ola Andersson"

-- Du kan filtrera ut om du vet dess subject genom något som detta:
-- set the_Messages to every message of mailbox "Sent messages" of account "Ola Andersson" whose subject is subject_text
-- Sedan kan du loopa igenom dessa med:
-- repeat with this_Message in the_Messages
-- (gör något)
-- end repeat

-- Eller bara radera det meddelade du just skickade
delay 3 -- Vänta lite till så att mailboxen uppdateras.
delete first message of mailbox "Sent Messages" of account "Ola Andersson"

end tell

1
Bevaka tråden