【问题标题】:Applescript freezes when extracting email from mail从邮件中提取电子邮件时 Applescript 冻结
【发布时间】:2013-01-22 14:13:07
【问题描述】:

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

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

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

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

我想知道代码是否有任何问题可能导致它在他的更高版本中冻结或由于存在的电子邮件增加。

另一方面,我知道将它们一个一个地写下来可能会适得其反,因为我改编的脚本是在将它们写入文件之前对地址进行排序并删除重复项,但我认为由于大量邮件说它会加快进程并使用更少的内存来编写它们。加上计数器有助于了解脚本的位置。

这里是代码:

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

【问题讨论】:

    标签: email applescript


    【解决方案1】:

    编辑:经过进一步考虑,我删除了我发布的第一个脚本。我的想法是您看到的问题是因为您在这一行中一次收到 60,000 多封电子邮件...

    set theseMessages to (every message in (mailbox of thisMessage))
    

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

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

    我希望这能解决您的问题!祝你好运。

    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
    

    【讨论】:

    • 非常感谢它解决了我的问题,你是一个真正的救星
    • @regulus6633 你能告诉我为什么你“告诉应用程序“邮件”告诉每个消息……”语法吗?这是否会为邮件应用程序对象中的每个消息对象创建一个属性?
    • 您必须查看 Mail 的 applescript 字典才能了解何时需要从邮件应用程序本身获取信息或何时需要从消息中获取信息。字典显示您可以查询的属性以及您需要询问的对象。在文件菜单下的 AppleScript 编辑器中选择“打开字典”并选择邮件应用程序。看看那个。
    猜你喜欢
    • 1970-01-01
    • 2011-09-04
    • 2016-04-12
    • 2021-12-23
    • 1970-01-01
    • 1970-01-01
    • 2018-10-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多