从邮件中提取电子邮件时 Applescript 冻结 [英] Applescript freezes when extracting email from mail

查看:35
本文介绍了从邮件中提取电子邮件时 Applescript 冻结的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在运行一个 Applescript,从我老板收件箱中的所有邮件中提取所有电子邮件地址,它在他的计算机上冻结,但在我的计算机上运行良好.

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.

我的电脑运行的是带有邮件 4.6 的 Snow leopard,如果这有什么不同的话,他的电脑运行的是带有邮件 5.3 的 Lion.

my computer is running Snow leopard with mail 4.6 and his is running Lion with mail 5.3 if that makes any difference.

此外,我的收件箱只有大约 400 封邮件,因为我通常不使用邮件并且只收到这些邮件来测试脚本,而他的收件箱有 60 000 多封.

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.

脚本在大约 20 秒内完成了我的电子邮件,他花了 2 分钟完成了 40 次,然后就冻结了.

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.

这是代码:

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:经过深思熟虑,我删除了我发布的第一个脚本.我的想法是您看到的问题是因为您在这一行中同时收到 60,000 多封电子邮件...

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))

所以我们的想法是一次只得到一堆.我使用变量 writeEveryXMessages 来指定您应该一次获得 500 条消息,并且在每个循环中我们都会获得下一个 500 条直到完成.

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.

注意:我修改了您的代码以提高效率并修复了一些可能的错误,例如 write 命令不再位于 Mail tell 代码块中.此外,它现在一次将这 500 条消息写入文件.此脚本适用于 Mountain Lion 和 Mail v6.2.它也应该适合你.

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

这篇关于从邮件中提取电子邮件时 Applescript 冻结的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆