I'm running an applescript to extract all the email adress from all the messages in my boss's inbox and it freezes on his computer and works fine on mine.
my computer is running Snow leopard with mail 4.6 and his is running Lion with mail 5.3 if that makes any difference.
Also my inbox only has around 400 mails since i don't usually use mail and only got those messages to test the script and his has over 60 000.
The script ran through my email in around 20 seconds and on his took 2 minutes to do 40 then froze.
I was wondering if there was anything wrong with the code that could cause it to freeze in his higher version or due to the increase in email present.
On another note i know that writing them all one by one is probably counter-productive because the script i adapted this from was sorting the adresses and removing duplicates before writing them to the file but i thought that due to the large number of mails that it would speed the process and use less memory to just write them. PLus the counters helps to know where the script is at.
here is the code :
tell application "Finder" to set ptd to path to documents folder as string
set theFile to ptd & "extracted3.txt"
set theFileID to open for access theFile with write permission
set counter to 0
tell application "Mail"
set selectionMessage to selection -- just select the first message in the folder
set thisMessage to item 1 of selectionMessage
set theseMessages to (every message in (mailbox of thisMessage))
repeat with eachMessage in theseMessages
try
set counter to counter + 1
set theFrom to (extract address from sender of eachMessage)
set theFromName to (extract name from sender of eachMessage)
set theFromTemp to theFrom & "," & theFromName & "," & counter
write theFromTemp & return to theFileID as «class utf8»
if (address of to recipient) of eachMessage is not {} then
repeat with i from 1 to count of to recipient of eachMessage
set theTo to (address of to recipient i) of eachMessage as string
set theToName to (name of to recipient i) of eachMessage as string
set theToTemp to theTo & "," & theToName & "," & counter
write theToTemp & return to theFileID as «class utf8»
end repeat
end if
if (address of cc recipient) of eachMessage is not {} then
repeat with i from 1 to count of cc recipient of eachMessage
set theCC to (address of cc recipient i) of eachMessage as string
set theCCName to (name of cc recipient i) of eachMessage as string
set theCCTemp to theCC & "," & theCCName & "," & counter
write theCCTemp & return to theFileID as «class utf8»
end repeat
end if
end try
end repeat
end tell
close access theFileID
EDIT : after further thought, I removed the first script I posted. My thought is the problem you are seeing is because you are getting 60,000+ emails at once in this line...
set theseMessages to (every message in (mailbox of thisMessage))
So the idea is to just get a bunch at a time. I use the variable writeEveryXMessages to specify that you should get 500 messages at a time, and on each loop we get the next 500 until finished.
NOTE: I modified your code to be a little more efficient and fixed a few possible bugs, for example the write command is no longer in the Mail tell block of code. Also it now writes those 500 messages to file at one time. This script works on Mountain Lion and Mail v6.2. It should work for you too.
I hope this fixes your problem! Good luck.
set theFile to (path to documents folder as text) & "extracted3.txt"
set writeEveryXMessages to 500
set counter to 1
try
set theFileID to open for access file theFile with write permission
tell application "Mail"
set selectedMessage to item 1 of (get selection)
set theMailbox to mailbox of selectedMessage
set messageCount to count of messages in theMailbox
end tell
repeat
set endCount to counter + writeEveryXMessages
if endCount is greater than messageCount then set endCount to messageCount
set theString to ""
tell application "Mail"
set theseMessages to messages counter thru endCount of theMailbox
end tell
repeat with eachMessage in theseMessages
set theFromTemp to ""
set theToTemp to ""
set theCCTemp to ""
try
tell application "Mail"
tell eachMessage
set theSender to sender
set toRecipients to to recipients
set ccRecipients to cc recipients
end tell
set theFrom to extract address from theSender
set theFromName to extract name from theSender
set theFromTemp to "From: " & theFrom & "," & theFromName & "," & counter & return
if toRecipients is not {} then
repeat with toRecipient in toRecipients
try
set theTo to address of toRecipient
set theToName to name of toRecipient
set theToTemp to theToTemp & " To: " & theTo & "," & theToName & "," & counter & return
end try
end repeat
end if
if ccRecipients is not {} then
repeat with ccRecipient in ccRecipients
try
set theCC to address of ccRecipient
set theCCName to name of ccRecipient
set theCCTemp to theCCTemp & " CC: " & theCC & "," & theCCName & "," & counter & return
end try
end repeat
end if
end tell
set theString to theString & theFromTemp & theToTemp & theCCTemp & return
end try
set counter to counter + 1
end repeat
write theString to theFileID as «class utf8»
if counter is greater than or equal to messageCount then
set theString to ""
exit repeat
end if
end repeat
close access theFileID
on error theError
log theError
try
close access file theFile
end try
end try
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.