Gå till innehåll
Just nu i M3-nätverket

Applescript och Mail.


pyd

Rekommendera Poster

Jag har precis (läs: precis) hittat applescript.

 

Vad jag behöver göra är följande:

Steg 1)

Läsa in det som finns i meddelandet (content)

2) Få in det som finns i meddelandet till en textfil.

3) Flytta meddelandet till en annan mapp.

 

Steg 1 är klart:

tell application "Mail"

set theSelection to selection

set theMessage to item 1 of theSelection

content of theMessage

end tell

 

Mitt nästa problem är steg 3.

Jag försöker använda "set mailbox of theMessage to mailbox “Folk”".

Men jag får bara ett fel, och den verkar klaga på "fnutten" i "Folk".?

Detta uppenbarar sig varje gång jag försöker använda mig av fnuttar.... vad gör jag fel?

 

Steg 2:

Hur gör man detta? :)

Länk till kommentar
Dela på andra webbplatser

För att utveckla det hela lite...

 

Varje timma så kommer det (förhoppningsvis, men inte helt säkert) 2st mail.

Det ena är skickat till konto1@domän.se

Det andra är skickat till konto2@domän.se

Dessa meddelanden har ett specifikt subject: [TEST-MAIL] - ÅÅÅÅ-MM-DD HH:MM:SS

 

Vad som ska ske är följande:

1: Mailet till konto1@domän.se ska flyttas till [konto1]-mappen, och konto2@domän.se-mailet ska flyttas till [konto2]-mappen.

2: Hela "content" i mailet (en lång textrad) i konto1 ska klistras in i en textfil. ($HOME/Desktop/logg.txt) (Befintlig, adderas längst ner i dokumentet.)

3: Samma sak för konto2.

4: Mailet ska flyttas till /[konto1]/[klart]. (Samma sak för konto2)

Länk till kommentar
Dela på andra webbplatser

Kommer jag inte på någonting annat kan jag nog åtminstone hjälpa dig med 'textfils-biten'.

 

Vill du använda en och samma textfil eller skapa en ny textfil för varje meddelande?

 

Om du använder en och samma textfil - hur vill du ha texterna separerade i filen (med någon grafisk markering eller med vita mellanrum - i det senare fallet: ungefär hur stort mellanrum?)?

 

Vilken text-editor räknar du med att använda?

Länk till kommentar
Dela på andra webbplatser

...en ide också.

 

"set mailbox of theMessage to mailbox “Folk”" tycker jag liknar att försöka byta namn på mail-boxen som det inkomna mailet ligger i (?). Kanske att bättre vore "move theSelection to..."? Den principen fungerar för att flytta markerade mail från en mailbox till en annan mailbox inom samma konto - och mailboxar kan dessutom anges med nummer i stället för namn. Sålunda: om båda dessa principer fungerar även mellan olika mail-konton går det antagligen att lösa på det viset.

Länk till kommentar
Dela på andra webbplatser

...en ytterligare ide och som antagligen har ännu större chans att fungera:

 

tell application "Mail"

set theSelection to selection

set theMailbox to "Folk" -- brevlådan får egen variabel

tell application "Mail"

move the theSelection to mailbox theMailbox of account "xxxxx"

end tell

end tell

 

Alternativt, skippa att placera brevlådan i egen variabel och skriv istället allt i ett svep: move theSelection to mailbox "Folk" of account "xxxx"

Länk till kommentar
Dela på andra webbplatser

Kommer jag inte på någonting annat kan jag nog åtminstone hjälpa dig med 'textfils-biten'.

 

Vill du använda en och samma textfil eller skapa en ny textfil för varje meddelande?

 

Om du använder en och samma textfil - hur vill du ha texterna separerade i filen (med någon grafisk markering eller med vita mellanrum - i det senare fallet: ungefär hur stort mellanrum?)?

 

Vilken text-editor räknar du med att använda?

 

Strängen som finns i "content" ser ut så här:

2008-11-07 23:12:57;namn@domän.se;RCop0bOWhPMMPqw4yztjDZq1d

Jag kan formatera mailet lite olika, om det är _mycket_ lättare så finns bara den här strängen i content, annars finns den på rad 4.

Exempelmail:

Datum: 2008-11-07 23:12:57

Konto: namn@domän.se

Ticket: RCop0bOWhPMMPqw4yztjDZq1d

Sträng: 2008-11-07 23:12:57;anders@ordningsvakterna.se;RCop0bOWhPMMPqw4yztjDZq1d

 

Och det är exakt så den ska sparas ner i textfilen igen.

Jag använder den vanliga texteditorn i osx, "Textredigerare".

 

...en ytterligare ide och som antagligen har ännu större chans att fungera:

 

tell application "Mail"

set theSelection to selection

set theMailbox to "Folk" -- brevlådan får egen variabel

tell application "Mail"

move the theSelection to mailbox theMailbox of account "xxxxx"

end tell

end tell

 

Alternativt, skippa att placera brevlådan i egen variabel och skriv istället allt i ett svep: move theSelection to mailbox "Folk" of account "xxxx"

 

När jag kör denna (har dock bytt ut "Folk" till "Klara"), så får jag felet "Mail drabbades av ett fel: Kan inte hämta mailbox "Klara" of account "hyden"."

 

Se bifogad fil för upplägg av mailboxar och mappar.

 

Tack för hjälpen dock!

post-30230-1226322906_thumb.gif

Länk till kommentar
Dela på andra webbplatser

Synd att jag inte kan hjälpa till med mailbox-problemet.

 

Dock ska jag nog under kvällen kunna föreslå dig en kod för att hantera textfils-delen.

 

Tills vidare: du behöver en skript-bar texteditor - OS X egen går alltså inte att använda. Så är också frågan om du vill ha de olika inskrivningarna av data från olika mail separerade på något vis (grafiska tecken? Vita mellanrum?) och om du vill göra dem i en och samma textfil eller ej?

Länk till kommentar
Dela på andra webbplatser

Att formera text-strängen som i din uppställning har jag löst. Fast det är ett par saker som jag behöver fråga om innan jag postar kodförslaget:

 

1. Kommer det ALLTID att vara samma antal tecken i data-strängen för 'Ticket'? [annars återstår lite arbete]

 

Varför står "anders@ordningsvakterna.se" i den avslutande uppställningen men inte i "content"? Dvs, jag vill fråga för att kontrollera att det inte är något fel i beskrivningen -... jag kan utan problem koda innehållet i "content" samt infoga "anders@ordningsvakterna.se".

Länk till kommentar
Dela på andra webbplatser

Tills vidare: du behöver en skript-bar texteditor - OS X egen går alltså inte att använda.

Ok, ingen aning.. något förslag?

 

Så är också frågan om du vill ha de olika inskrivningarna av data från olika mail separerade på något vis (grafiska tecken? Vita mellanrum?) och om du vill göra dem i en och samma textfil eller ej?

Dom kommer att ligga i samma textfil, ex. epostlogg_svar.txt

Vartefter nya mail kommer in så ska epostlogg_svar.txt fyllas på.

Senaste ska hamna underst.

 

1. Kommer det ALLTID att vara samma antal tecken i data-strängen för 'Ticket'? [annars återstår lite arbete]

 

Varför står "anders@ordningsvakterna.se" i den avslutande uppställningen men inte i "content"? Dvs, jag vill fråga för att kontrollera att det inte är något fel i beskrivningen -... jag kan utan problem koda innehållet i "content" samt infoga "anders@ordningsvakterna.se".

 

Ticket är alltid 25 tecken lång.

 

För att göra det enkelt för oss (läs: dig :) ) så kommer det enda som finns i content alltid att vara strängen: (En rad)

[datum/tid];[e-post adress];[ticket]

[19-tecken];[26-tecken/10-tecken] (beroende på vilken e-postadress som det skickas till);[25-tecken]

 

Men borde man inte bara helt enkelt kunna välja allt som finns i content?

Behöver man veta hur många tecken osv?

 

Typ: "select all from content"

Länk till kommentar
Dela på andra webbplatser

Hmm.. när jag tänker efter så var jag nog lite trött när jag skrev mitt "förtydligande" inlägg :nattinatti:

Jag har funderat lite mer på exakt vad jag önskar...

Jag har dessutom gjort om mailet som skickas, nu skickas bara "Ticket" i content.

(E-postadresser är redigerade här för att undvika robotar...)

 

Så här är scenariot:

Jag litar inte på loopia:s mail.

Varje timma så skickas det två mail ifrån ett utomstående mailkonto.

Ett går till a[at]hyden.nu, och det andra går till anders[at]ordningsvakterna.se

 

Dessa mail innehåller följande:

Subject: [TEST-MAIL] - "Datum och tid"

(Exempel: [TEST-MAIL] - 01:00 - 10 november 2008)

Content: ticket

(exempel på content: RCop0bOWhPMMPqw4yztjDZq1d)

Ticketen är alltid på 25 tecken.

 

Samtidigt som dessa mail skickas loggas detta i en textfil.

 

När jag tar emot mailen så ska följande ske:

 

------------------------------------------------

1) Läs in headern (all headers).

 

2) På rad 3 så står mottagande epostadress, spara ner denna i en variabel. (ex. varKonto)

(exempel: Till: <a[at]hyden.nu>"

 

3) På rad 9 (tror att det alltid är rad 9) så finns tidpunkten för när mailet kom till loopia-servern.

(exempel: Received: from mail-core.space2u.com ([62.20.1.181]) (envelope-sender <a[at]hyden.nu>) by s19.loopia.se (qmail-ldap-1.03) with SMTP for <a[at]hyden.nu>; 10 Nov 2008 00:00:12 -0000

 

4) Läs in rad 9, och strippa bort allt utom "10 Nov 2008 00:00:12". Spara ner detta i en variable (ex. varMottaget)

 

5) Formatera om detta så det blir " 2008-11-10 00:00:12". (För att det ska stämma i loggfilerna.)

 

6) Läs in content.

 

7) Spara ner allt i content till en variabel (ex. varTicket)

 

8) Spara ner variablarna till en textfil (logg_mottaget.txt) enligt följande:

varMottaget;varKonto;varTicket

-------------------------------------------------

 

Hoppas att detta redde ut lite, och ev. gjorde saker lite enklare :)

Länk till kommentar
Dela på andra webbplatser

Ok, ingen aning.. något förslag?

 

Javisst. "Text-Wrangler" t ex.

 

Dom kommer att ligga i samma textfil, ex. epostlogg_svar.txt

Vartefter nya mail kommer in så ska epostlogg_svar.txt fyllas på.

Senaste ska hamna underst.

Ticket är alltid 25 tecken lång.

 

Bra. Jag ställde dessutom en onödig fråga - eftesom 'ticket' står sist i textsträngen så är denna lätt att extrahera ovasett längd (saken löst redan).

 

Men borde man inte bara helt enkelt kunna välja allt som finns i content?

Behöver man veta hur många tecken osv?

Typ: "select all from content"

 

Jovisst. Men jag utgår från ditt tidigare uppställda exempel där de olika datatyperna är sorterade framför olika rubriker (det har jag redan fixat).

 

 

Hmm.. när jag tänker efter så var jag nog lite trött när jag skrev mitt "förtydligande" inlägg :nattinatti:

Jag har funderat lite mer på exakt vad jag önskar...

Jag har dessutom gjort om mailet som skickas, nu skickas bara "Ticket" i content.

(E-postadresser är redigerade här för att undvika robotar...)

 

Så här är scenariot:

Jag litar inte på loopia:s mail.

Varje timma så skickas det två mail ifrån ett utomstående mailkonto.

Ett går till a[at]hyden.nu, och det andra går till anders[at]ordningsvakterna.se

 

Dessa mail innehåller följande:

Subject: [TEST-MAIL] - "Datum och tid"

(Exempel: [TEST-MAIL] - 01:00 - 10 november 2008)

Content: ticket

(exempel på content: RCop0bOWhPMMPqw4yztjDZq1d)

Ticketen är alltid på 25 tecken.

 

Samtidigt som dessa mail skickas loggas detta i en textfil.

 

När jag tar emot mailen så ska följande ske:

 

1) En regel flyttar mailen till en mapp som heter "Loopia Test"/"Hyden" eller "Ordningsvakterna" beroende på vilket konto som det är skickat till.

 

2) Läs in headern (all headers).

 

3) På rad 3 så står mottagande epostadress, spara ner denna i en variabel. (ex. varKonto)

(exempel: Till: <a[at]hyden.nu>"

 

4) På rad 9 (tror att det alltid är rad 9) så finns tidpunkten för när mailet kom till loopia-servern.

(exempel: Received: from mail-core.space2u.com ([62.20.1.181]) (envelope-sender <a[at]hyden.nu>) by s19.loopia.se (qmail-ldap-1.03) with SMTP for <a[at]hyden.nu>; 10 Nov 2008 00:00:12 -0000

 

5) Läs in rad 9, och strippa bort allt utom "10 Nov 2008 00:00:12". Spara ner detta i en variable (ex. varMottaget)

 

6) Formatera om detta så det blir " 2008-11-10 00:00:12". (För att det ska stämma i loggfilerna.

 

7) Läs in content.

 

8) Spara ner allt i content till en variabel (ex. varTicket)

 

9) Spara ner variablarna till en textfil (logg_mottaget.txt) enligt följande:

varMottaget;varKonto;varTicket

 

10) Markera medelandet som läst, och flytta det till en underliggande mapp som heter "Klart"

Hoppas att detta redde ut lite, och ev. gjorde saker lite enklare :)

 

Hjälp! Jag har redan koden så gott som klar (minus att flytta mailen) och utgående helt från 'content'. Jag behöver bara ändra koden så att senaste data hamnar sist i textfilen. Men jag kan väl tills vidare posta den versionen så snart jag är klar så får du se vad du tycker samt får möjlighet att jobba vidare med koden om du tycker att det behövs?

Länk till kommentar
Dela på andra webbplatser

Sådärja... :ThumbsUp:

 

tell application "Mail"

set theSelection to selection

set theMessage to item 1 of theSelection

set cc to content of theMessage as string -- ändrad så att den extraherade datan genom kommandot 'content' flyttas till en variabel

 

(* skriptet är komplett så när som på kodrader för flyttning av det markerade mailet från det ena kontots mailbox till det andra kontots mailbox *)

 

my string_Routine(cc) -- anropar subrutin för behandling av textsträngen från 'content'

 

set textResult to the result as string -- tar emot den omformade texten från subrutinen

 

my document_Opener() -- se sökvägen nedan i denna deklarerade subrutin som behöver ändras till din egen sökväg samt med rätt namn på mapp/mappar, etc.

 

delay 2 -- ifall inte text-editorn redan är öppen

 

my print_Routine(textResult) -- rutin för inkopiering av text i textfil

 

end tell

 

on string_Routine© -- subrutin för behandling av textsträngen från 'content' - variabel c tar emot innehållet från variabel cc ovan; texten ser för övrigt lite märklig ut här i postningen (ska vara ett "c" mellan två paranteser, inte ett copyright-tecken!)

 

tell application "Finder"

activate

 

set sk to ";" as string

set d to "Datum: " as string

set k to "Konto: " as string

set t to "Ticket: " as string

set s to "Sträng: " as string

set inserted_String to "anders@ordningsvakterna.se" as string

 

set dt to words 1 thru 3 of c as string -- extraherar datum-strängen från c (=content)

 

set kl to characters 12 thru 19 of c as string -- extraherar klockslag-strängen från c (=content)

 

set dm to characters 21 thru 33 of c as string -- extraherar kontonamn-strängen från c (=content)

 

set tk to characters 35 thru -1 of c as string -- extraherar 'ticket'-strängen från c (=content)

 

-- följande kodrader förbinder de olika typerna av datasträngar med respektive rubriker

 

set dtm to d & dt & space & kl & return as string

set kn to k & dm & return as string

set tt to t & tk & return as string

set ss to s & dt & space & kl & sk & inserted_String & sk & tk as string

 

set allStrings to dtm & kn & tt & ss & return as string

 

return allStrings -- retur av den sammanfogade texten från denna subrutin

 

end tell

end string_Routine

 

on document_Opener() -- subrutin för öppnande av textfilen

tell application "Finder"

activate

 

open document file 1 of folder "B" of folder "A" of startup disk -- koden utgår från att textfilen ligger som enda fil i en mapp; koden här beskriver ordningen i fall textfilen ligger i en mapp i en mapp - första mapp i koden ska i så fall alltså vara den innersta mappen; koden utgår som synes även från att hårddisken är startskiva (om så inte är fallet behöver koden ändras eller om mappen med textfilen förvaras på skrivbordet [desktop]

end tell

end document_Opener

 

on print_Out(txt) -- subrutin för inkopierande av behandlad text, sparande samt stängande av textfilen

 

tell application "TextWrangler" -- koden utgår från att denna text-editor används; att skriva om annars

activate

 

select front document

 

select insertion point after last line of front document

 

set selection to "

 

 

" & txt -- avståndet mellan citationstecken fungerar som retur-tangent - skapar några raders mellanrum mellan textstyckena

 

close document 1 saving yes

 

end tell

end print_Out

 

 

----

 

Jag tar nog ledigt för resten av kvällen.... <_<

Länk till kommentar
Dela på andra webbplatser

Ojoj, vilket jobb du har gjort!

Jag tackar, bockar, niger och bugar!

 

Fast eftersom jag ändrade mig lite mitt i allt så bestämde jag mig för att försöka använda delar av ditt script och göra ett eget :)

Jag har kommit en bit på vägen, men fastnat lite...

 

tell application "Mail"
set theSelection to selection
set theMessage to item 1 of theSelection
set theHeader to all headers of theMessage as string
set line3 to "Till: <a[at]hyden.nu>" as string
set line3Length to length of line3 as string
set emailEnd to line3Length - 1 as string
set theEmail to characters 8 thru emailEnd of line3 as string
display dialog "Totalt antal tecken: " & line3Length
display dialog "Antal tecken -1: " & emailEnd
display dialog "E-Postadress: " & theEmail
end tell

 

Hur gör jag för att bara välja ut hela rad 3 (Där det står set line3 to ...)?

 

För att skryta lite så har jag faktiskt lyckats göra FTP-Funktionen, som jag insåg behövdes, oxå.. helt själv! :)

Länk till kommentar
Dela på andra webbplatser

Fast eftersom jag ändrade mig lite mitt i allt så bestämde jag mig för att försöka använda delar av ditt script och göra ett eget :)

 

Det är utmärkt om du kan använda mina kodrader på det viset.

 

 

För att skryta lite så har jag faktiskt lyckats göra FTP-Funktionen, som jag insåg behövdes, oxå.. helt själv! :)

 

Du lär dig snabbt! AppleScript är kanske inte det första programmeringsspråk du har använt?

 

Jag har kommit en bit på vägen, men fastnat lite...

 

tell application "Mail"
set theSelection to selection
set theMessage to item 1 of theSelection
set theHeader to all headers of theMessage as string
set line3 to "Till: <a[at]hyden.nu>" as string
set line3Length to length of line3 as string
set emailEnd to line3Length - 1 as string
set theEmail to characters 8 thru emailEnd of line3 as string
display dialog "Totalt antal tecken: " & line3Length
display dialog "Antal tecken -1: " & emailEnd
display dialog "E-Postadress: " & theEmail
end tell

 

Hur gör jag för att bara välja ut hela rad 3 (Där det står set line3 to ...)?

 

Variabeln "line3" är i nuvarande kod satt till att innehålla text-strängen "Till: <a[at]hyden.nu>". Om avsikten alltså är att i stället fånga upp textrad nr 3 ur varje mail - eller endast ur headern till varje mail - då är troligen kodraden du söker: set line3 to paragraph 3 of theHeader as string [när jag testade lagrades liknande data i "line3" från headern som du f n har inskriven i variabeln].

Länk till kommentar
Dela på andra webbplatser

Nu har jag kommit så här långt... det mesta borde var klart, förutom att formatera om datumet.. men det tar vi sen :)

 

Nu får jag följande fel:

 

{"Från: <a@hyden.nu>

Datum: on 12 nov 2008 17.00.06 GMT+01:00

Till: <a@hyden.nu>

Kopia: <anders@ordningsvakterna.se>

Ämne: [TEST-MAIL] - 17:00 - 12 november 2008

Return-Path: <a@hyden.nu>

Delivered-To: a@hyden.nu

Received: (qmail 35980 invoked from network); 12 Nov 2008 16:00:09 -0000

Received: from mail-core.space2u.com ([62.20.1.181]) (envelope-sender <a@hyden.nu>) by s19.loopia.se (qmail-ldap-1.03) with SMTP for <a@hyden.nu>; 12 Nov 2008 16:00:09 -0000

Received: from iis2 (iis2.space2u.com [62.20.1.214]) by mail-core.space2u.com (8.14.3/8.13.8) with SMTP id mACG031X024569; Wed, 12 Nov 2008 17:00:03 +0100

Thread-Index: AclE37s5PieZl0sMQieuJEly+eTp8A==

Thread-Topic: [TEST-MAIL] - 17:00 - 12 november 2008

Message-Id: <D4FB28A6E6D142DA96E6060A93C12767@iis2>

Mime-Version: 1.0

Content-Type: text/plain

Content-Transfer-Encoding: 7bit

X-Mailer: Microsoft CDO for Windows 2000

Content-Class: urn:content-classes:message

Importance: normal

Priority: normal

X-Mimeole: Produced By Microsoft MimeOLE V6.00.3790.4325

 

"} matchar inte parametrarna {} för string_Routine.

 

Vad är felet? :)

 

tell application "Mail"
set theSelection to selection
set theMessage to item 1 of theSelection
set theHeader to all headers of theMessage as string
--set theTicket to content of theMessage as string
set theTicket to "ticket" as string
set theLogFile to "log_recived.txt"
my string_Routine(theHeader)
set textResule to the sesult as string -- hämtar in obehandlad text
my docuement_Opener()
delay 2
my print_Routine(textResult)
end tell

on string_Routine() --För behandling av texten
tell application "Finder"
	activate
	set dateLine to paragraph 2 of theHeader as string
	set dateLineLength to length of dateLine as string
	set dateLineEnd to dateLineLength - 10 as string
	set theDate to characters 11 thru 22 of dateLine as string
	set theTime to characters 23 thru dateLineEnd of dateLine as string
	set emailLine to paragraph 3 of theHeader as string
	set emailLineLength to length of emailLine as string
	set emailEnd to emailLineLength - 1 as string
	set theEmail to characters 8 thru emailEnd of emailLine as string
	set allStrings to theDate & " " & theTime & ";" & theEmail & ";" & theTicket & return as string
	return allStrings
end tell
end string_Routine

on document_Opener() --subrutin för öppnande av textfilen
tell application "Finder"
	activate
	open document file theLogFile of folder "Loopia" of folder "Documents" of folder "anders" of folder "Users" of startup disk
end tell
end document_Opener

on print_Out(txt) --sub för inkopiering av behandlad text, sparande samt stängande av log-fil.
tell application "TextWrangler"
	activate
	select front document
	select insertion point after last line of front document
	set selection to "" & txt
	close document 1 saving yes
end tell
end print_Out

Länk till kommentar
Dela på andra webbplatser

Felmeddelandet beror på hur den deklarerade subrutinen inte innehåller någon mottagande variabel.

 

Förklaring: anropet av subrutinen i huvudrutinen (syftande på det inledande tell-blocket för application "Mail") förmedlar ett datainnehåll genom variablen theHeader till subrutinen - men det finns inte någon motsvarande variabel i subrutinens deklaration (den som inleds med "on string_Routine") som kan ta emot det införda värdet från anropet.

 

Ett smärre följande problem i sammanhanget kan även tänkas vara hur variablen theHeader har samma namn i både i huvudrutinen och inom subrutinen. Jag har inte hängt med i alla förändringar av AppleScript under åren, men åtminstone när jag började skripta AppleScript i början av 2000-talet så var en syntax-regel att man måste använda olika variabelnamn i anrop och deklaratation av subrutiner. Om du inte vill undersöka huruvida denna regel är förändrad så är det å andra sidan enkelt att ändra på detta i koden.

 

Så här skulle då koden kunna se ut med smärre korrigeringar (jag har även rättat några felstavningar som skulle ha påverkat funktionerna negativt):

 

tell application "Mail"

    set theSelection to selection

    set theMessage to item 1 of theSelection

    set the_Header to all headers of theMessage as string -- ändrat variabelnamn från theHeader till the_Header

    --set theTicket to content of theMessage as string

    set theTicket to "ticket" as string

    set theLogFile to "log_recived.txt" -- AppleScript kan vara rätt förlåtande i fråga om datatyps-deklaration, men bör ändå inte datatypen vara (as) string här med?

    my string_Routine(the_Header) -- ändrat till det nya variabelnamnet i anropet av subrutinen

    set textResult to the result as string -- hämtar in obehandlad text (korr. av felstavat variabelnamn, etc)

    my document_Opener()-- korr. av felstavat namn på subrutinen

    delay 2

    my print_Routine(textResult)

end tell

 

on string_Routine(theHeader) -- deklarationen av subrutinen ändrad till att inkludera mottagar-variabel

tell application "Finder"

activate

 

-- osv., etc.

 

Intressant pysselgöra, eller hur? ;)

Länk till kommentar
Dela på andra webbplatser

Jag passade på och kastade en blick på den övriga koden...

 

1. I string_Routine går det att komprimera koden samt att även använda en korrektare datatyp (det är säkrare och etablerar en god vana som minimerar en potentiell felkälla som inte skript-editorn alltid uppmärksammar)

 

set dateLine to paragraph 2 of theHeader as string

set dateLineEnd to (length of dateLine) - 10 as integer (* komprimerad kod där det erhållna värdet blir ett matematiskt heltal istället för av datatypen sträng pga det erhållna värdet ska användas som matematiskt tal senare i koden - från karaktär nr si till karaktär nr så... *)

set theDate to characters 11 thru 22 of dateLine as string

set theTime to characters 23 thru dateLineEnd of dateLine as string

set emailLine to paragraph 3 of theHeader as string

set emailEnd to (length of emailLine) - 1 as integer -- samma typ av ändring här som ovan

 

osv.....

 

2. I document_Opener saknas citationstecken kring filnamnet.

 

 

3. Positioneringen av citationstecknen i "set selection to "" & txt" i i print_Out är ändrad från mitt kodförslag, vilket jag uppmärksammar på i händelse av att texten inte kopieras in i korrekt position relativt dokumentets befintliga text.

 

4. set theTicket to "ticket" as string

    set theLogFile to "log_recived.txt"

 

Dessa rader i huvudrutinen verkar inte att användas för något slutligt syfte? (men är kanske under arbete?)

Länk till kommentar
Dela på andra webbplatser

Intressant pysselgöra, eller hur? ;)

 

Hehe, jodå... det fanns lite att göra :)

 

2. I document_Opener saknas citationstecken kring filnamnet.

 

Ska det vara så?

Det är ju en variablen som deklareras i huvudrutinen, genom "set theLogFile to "log_recived.txt" as string".

Men dessvärre så funkar det varken med eller utan "".

Om jag kör utan "" så säger den:

Variabeln theLogFile är inte definierad.

och och om jag kör med "" så hittar den inte filen, vilket inte är så konstigt eftersom "thelogfile" inte finns i den specifierade mappen..?

 

Om jag dock sätter den variablen dirket i rutinen så funkar det, kan man inte hämta variblar ifrån huvudrutinen?

 

3. Positioneringen av citationstecknen i "set selection to "" & txt" i i print_Out är ändrad från mitt kodförslag, vilket jag uppmärksammar på i händelse av att texten inte kopieras in i korrekt position relativt dokumentets befintliga text.

 

Hmm, ok... så dom behövs?

Texten ska bara hamna underst i text-filen...

 

 

4. set theTicket to "ticket" as string

set theLogFile to "log_recived.txt"

 

Dessa rader i huvudrutinen verkar inte att användas för något slutligt syfte? (men är kanske under arbete?)

 

set theTicket to "ticket" as string <-- denna skulle ha varit bortkommenterad... den ersätts av "set theTicket to content of theMessage as string"

 

set theLogFile to "log_recived.txt" <-- Det är till den filen som allt ska sparas till slut.

 

 

När jag har gjort alla ändringar så funkar scriptet ända fram till:

my print_Out(textResult)

Nu vill den skapa ett nytt textdokument, och spara det...

Så ska det ju inte vara :)

Den ska ju öppna log_recived.txt, och klistra in det sist i det dokumentet...

 

Nu ser hela koden ut så här:

 

tell application "Mail"
 set theSelection to selection
 set theMessage to item 1 of theSelection
 set the_Header to all headers of theMessage as string
 set theTicket to content of theMessage as string
 set theLogFile to "log_recived.txt" as string
 my string_Routine(the_Header)
 set textResult to the result as string -- hämtar in obehandlad text
 my document_Opener()
 delay 2
 my print_Out(textResult)
end tell

on string_Routine(theHeader) --För behandling av texten
 tell application "Finder"
	 activate
	 set dateLine to paragraph 2 of theHeader as string
	 set dateLineLength to length of dateLine as string
	 set dateLineEnd to (length of dateLine) - 10 as integer
	 set theDate to characters 11 thru 22 of dateLine as string
	 set theTime to characters 23 thru dateLineEnd of dateLine as string
	 set emailLine to paragraph 3 of theHeader as string
	 set emailLineLength to length of emailLine as string
	 set emailEnd to (length of emailLine) - 1 as integer
	 set theEmail to characters 8 thru emailEnd of emailLine as string
	 --set allStrings to theDate & " " & theTime & ";" & theEmail & ";" & theTicket & return as string
	 set allStrings to theDate & " " & theTime & ";" & theEmail & ";" & return as string
	 return allStrings
 end tell
end string_Routine

on document_Opener() --subrutin för öppnande av textfilen
 tell application "Finder"
	 activate
	 open document file "log_recived.txt" of folder "Loopia" of folder "Documents" of folder "anders" of folder "Users" of startup disk
 end tell
end document_Opener

on print_Out(txt) --sub för inkopiering av behandlad text, sparande samt stängande av log-fil.
 tell application "TextWrangler"
	 activate
	 select front document
	 select insertion point after last line of front document
	 set selection to "" & txt
	 close document 1 saving yes
 end tell
end print_Out

 

 

Det första problemet nu är att den inte hämtar in variablen "theTicket" som sätts i huvudrutinen.

 

Det andra felet just nu verkar vara när den kommer till print_out-rutinen.

Då skapar den ett nytt textdokument, i stället för att öppna logfilen och klistra in det i slutet av den.

Länk till kommentar
Dela på andra webbplatser

Nu har jag pillat lite, och plötsligt så får jag felet "TextWrangler drabbades av ett fel: document 1 förstår inte select-meddleandet."

 

Den klagar på raden "select front document" i print_out-rutinen...

 

Den öppnar log_recived.txt-filen, men sen går det inte längre...?

Länk till kommentar
Dela på andra webbplatser

Detta felet verkar uppstå när inte textwrangler är avslutat helt...

Så detta fel kan vi nog bortse ifrån tillsvidare :)

 

Nu har jag pillat lite, och plötsligt så får jag felet "TextWrangler drabbades av ett fel: document 1 förstår inte select-meddleandet."

 

Den klagar på raden "select front document" i print_out-rutinen...

 

Den öppnar log_recived.txt-filen, men sen går det inte längre...?

Länk till kommentar
Dela på andra webbplatser

Krångla inte till det så använd "inkorgsregler" INSTÄLLNINGAR/MAIL. Går att lägga regel på regel text flytta brev från "KALLE" till mapp LALLALA. -Gör till textdokument varje torsdag som sparas i mapp ,,,

Ja vad du vill nästan

Länk till kommentar
Dela på andra webbplatser

Jag känner mig aningen bortkommen som hjälpare...jag tror att du har fixat en del av problemen som det verkar? Kan du annars specificera vad om återstår tillsammans med att posta hela koden som den ser ut för tillfället?

 

Ett par principfrågor kan jag besvara:

 

1. "Om jag dock sätter den variablen dirket i rutinen så funkar det, kan man inte hämta variblar ifrån huvudrutinen?"

 

Alla variabler har under normala omständigheter ett 'scoop' (verkningsområde) som bara gäller inom huvudrutiner eller subrutiner - dvs, inte båda på en gång (har man flera huvudrutiner är dock min erfarenhet att vanliga variabler fungerar mellan dem). Vill man arbeta inom en subrutin med att behandla värden från en variabel som hör till en huvudrutin - eller från en subrutin utanför en annan subrutin - så måste variabeln skickas på samma vis som i din kod t ex variabeln the_header skickas ned till subrutinen som tar emot den under namnet theHeader. Undantaget är s k globala variabler som måste ges särskild deklaration i början av skripten (har jag för mig) och som generellt inte brukar rekommenderas (av någon anledning så verkar proffs-programmerare föredra variabler med begränsat arbetsområde - de är antagligen lättare och hålla reda på). Samtidigt är det inte så vanligt att man behöver globala variabler. Vill man skicka flera variabler till en och samma subrutin så går det lika bra. Har du alltså fler variabler att hämta så möter det inga problem. Principen är då följande:

 

my example_of_calling_a_subroutine(variableA, variableB, variableC)

 

---och som nere i subrutinen tas emot efter samma princip, mottagande variablerna i samma ordning

 

on this_example_of_a_subroutine(theVariableA, theVariableB, theVariableC)

 

2. "set theLogFile to "log_recived.txt" <-- Det är till den filen som allt ska sparas till slut."

 

Gott och väl. Fast det är subrutinerna som hanterar detta. En subrutin som öppnar filen, en annan subrutin som för in texten och spar. Eller missförstår jag din avsikt med kodraden?

Länk till kommentar
Dela på andra webbplatser

Jag är lite osäker på vad som faktiskt SKA hända :) (Nackdelen med att redigera ett befintligt stycke kod...)

Scriptet körs.

Det öppnar upp textredigeraren och klistrar in allt som jag vill där.

Sen öppnas textwrangler, skapar ett nytt dokument och sen ta det stopp...

Textwrangler undrar om den ska spara filen eller inte.

 

Är problemet att textredigeraren öppnar dokumentet?

Och om ja, varför öppnas textredigeraren?

Är textredigeraren "default-app" för text-dokument?

 

Sen undrar jag fortfarande hur jag ska lösa så att "theTicket", som sätts i huvudrutinen, ska följa med in i string_routine?

i huvudrutinen sätts:

set theTicket to content of theMessage as string

och i string_routine ska den användas:

set allStrings to theDate & " " & theTime & ";" & theEmail & ";" & theTicket & return as string

 

Men när man kör det så säger scriptet att "Variabeln theTicket är inte definierad."

Länk till kommentar
Dela på andra webbplatser

"Det öppnar upp textredigeraren och klistrar in allt som jag vill där.

Sen öppnas textwrangler, skapar ett nytt dokument och sen ta det stopp..."

 

Detta är lite oklart i betydelsen för mig eftersom den textredigare som skriptet förmodas öppna är ju TextWrangler. Men om det är TextWrangler som envisas med att öppna för många dokument så finns det en inställning i den textredigeraren med vilken man kan välja om den ska öppna ett nytt dokument varje gång TextWrangler startar. Jag misstänker att det skulle kunna vara en förklaring och är åtminstone en given felkälla att undersöka efter vad du beskriver.

 

"Sen undrar jag fortfarande hur jag ska lösa så att "theTicket", som sätts i huvudrutinen, ska följa med in i string_routine?"

 

Läser du inte mina förklaringar? ;)

 

Ok, jag tar det igen: du kan skicka flera variabler till en subrutin.

 

I stället för variabelnamnet theTicket i huvudrutinen skulle du t ex kunna döpa om den till the_Ticket. I anropet av subrutinen kan du lägga till the_Ticket efter den redan i anropet inkluderade variablen the_Header. Därefter lägger du till en mottagande variabel i deklarationen av subrutinen.

 

Exempel:

 

Anropet av subrutinen: my string_routine(the_Header, the_Ticket)

 

Inledande deklarationen av subrutinen: on string_routine(theHeader, theTicket)

tell app "Finder" -- osv

 

-- 2 st variabler är därmed införda i rutinen från huvudrutinen (du kan föra över mängder av variabler på det viset om det behövs) och theTicket kommer att vara definierad i subrutinen så att du slipper felmeddelande.

Länk till kommentar
Dela på andra webbplatser

Aha :)

Nu funkar det mesta!!!

 

Lite frågetecken kvarstår dock :)

När jag infogar texten i det befintliga dokumentet, så sker följande:

Första gången jag kör det, så hamnar det "inklistrade" inte på en ny rad, utan direkt efter existerande text.

Nästa gång jag kör den så får det en egen rad, men lägger till en radbrytning ovan och under texten... hur blir man av med detta?

 

Dessutom så måste jag formatera om datumet.

finns det någon replace-funktion i samband med arrays?

Jag behöver alltså byta ut "nov" mot "11", "jan" mot "1" osv...

Länk till kommentar
Dela på andra webbplatser

Arkiverat

Det här ämnet är nu arkiverat och är stängt för ytterligare svar.



×
×
  • Skapa nytt...