【问题标题】:Applescript only attaches once and then no longerApplescript 仅附加一次,然后不再附加
【发布时间】:2014-10-31 13:49:15
【问题描述】:

我有一个 Applescript,可以完美地ONCE 将一堆垃圾邮件附加到报告电子邮件中。然后它会在后续运行中停止附加任何垃圾邮件,无论是同一批次的垃圾邮件还是另一批新的垃圾邮件。即使它在随后的运行中停止附加任何垃圾邮件,但它运行良好,因为它会创建报告电子邮件,对其进行寻址并在主题行上添加标签,从而对报告的垃圾邮件进行统计。我有一种直觉,这可能是一个别名问题(因为它正在寻找错误的别名,因此无法附加垃圾邮件),但我不太明白如何解决它。我附上下面的 Applescript,其中包含已编辑的个人信息。在 Applescript 编辑器下运行它不会给我带来任何错误,除了在附件循环的每次迭代之后“--> 缺失值”(这甚至意味着什么?)。我忽略了什么?

-- User settable constants
set SPAMCOP_ACCOUNT to "REDACTED"
set SENDER_ADDRESS to "REDACTED"
set SPAMCOP_FOLDER_NAME to "SpamCop"

-- Variable initialization
set rawSpamFileList to {} -- List of names of spam files
set spamsProcessed to 0 -- Number of spams processed
set theOutputFolderPath to path to desktop folder -- Desktop folder path
set fullSpamCopFolderPath to (theOutputFolderPath & SPAMCOP_FOLDER_NAME & ":") -- Spam folder on Desktop

tell application "Finder"

    -- Create a SpamCop folder on Desktop if there isn't already one
    if (exists folder (fullSpamCopFolderPath as string)) = false then
        make new folder at theOutputFolderPath with properties {name:SPAMCOP_FOLDER_NAME}
    end if

    -- Count number of Spams to be processed
    set spamsProcessed to number of items of folder (fullSpamCopFolderPath as string)

    -- Set the list of names to the raw source folder to loop through
    set rawSpamFileList to name of every file of folder (fullSpamCopFolderPath as string)

    if (spamsProcessed > 0) then
        tell application "Mail"
            -- Create a blank spam-reporting email & set sender in it
            set spamReport to (make new outgoing message with properties {visible:true, content:" ", sender:SENDER_ADDRESS})

            -- Address it and add a tally of junk being reported    
            tell spamReport
                make new to recipient at end of to recipients with properties {address:SPAMCOP_ACCOUNT}
                set subject of spamReport to ((spamsProcessed) & " spam(s) being submitted for processing" as string)
                set visible to true

                -- Attach all the spams in SpamCopFolder as attachment(s) to spamReport.
                -- I SUSPECT THE PROBLEM IS IN THE REPEAT LOOP BELOW BUT I CAN'T SEE WHAT'S WRONG!

                repeat with thisSpamName in rawSpamFileList
                    try
                        set fullSpamPath to ((fullSpamCopFolderPath as string) & thisSpamName) -- Cast fullSpamCopFolderPath alias to string first!
                        make new attachment with properties {file name:(fullSpamPath as string)} at after the last word of the last paragraph
                    on error errmsg
                        display dialog ("Failed with errmsg: " & (errmsg as string)) buttons {"OK"} default button "OK"
                    end try
                end repeat
            end tell
        end tell

        set responseButton to button returned of (display dialog "Clean up SpamCop folder now?" buttons {"Yes", "No"} default button "No")
        if responseButton is "Yes" then
            delete every item of folder (fullSpamCopFolderPath as string) -- Send spams to trash
        else
            display dialog "Spam deletion aborted." buttons {"OK"} default button "OK"
        end if
    else
        display dialog "No spam to process!  Are you hallucinating?" buttons {"OK"} default button "OK"
    end if
end tell

这是使用 regulus6633 提供的更正 Applescript 运行的 35 个垃圾邮件的示例:

tell current application
    path to desktop
        --> alias "Macintosh HD:Users:username:Desktop:"
end tell
tell application "Finder"
    exists folder "Macintosh HD:Users:username:Desktop:SpamCop:"
        --> true
    count folder "Macintosh HD:Users:username:Desktop:SpamCop:"
        --> 35
    get name of every file of folder "Macintosh HD:Users:username:Desktop:SpamCop:"
        --> {"Spam-20140908064824.eml", "Spam-20140908081508.eml", "Spam-20140908082049.eml", "Spam-20140908082642.eml", "Spam-20140908083224.eml", "Spam-20140908091214.eml", "Spam-20140908091848.eml", "Spam-20140908092708.eml", "Spam-20140908093615.eml", "Spam-20140908093946.eml", "Spam-20140908101749.eml", "Spam-20140908101834.eml", "Spam-20140908102327.eml", "Spam-20140908102809.eml", "Spam-20140908102920.eml", "Spam-20140908103417.eml", "Spam-20140908104041.eml", "Spam-20140908104110.eml", "Spam-20140908112201.eml", "Spam-20140908113458.eml", "Spam-20140908124138.eml", "Spam-20140908124750.eml", "Spam-20140908125605.eml", "Spam-20140908130207.eml", "Spam-20140908130508.eml", "Spam-20140908132133.eml", "Spam-20140908132909.eml", "Spam-20140908134147.eml", "Spam-20140908134736.eml", "Spam-20140908143459.eml", "Spam-20140908143618.eml", "Spam-20140908160051.eml", "Spam-20140908160448.eml", "Spam-20140908173043.eml", "Spam-20140908191450.eml"}
end tell
tell application "Mail"
    make new outgoing message with properties {visible:true, content:" ", sender:"REDACTED"}
        --> outgoing message id 47
    make new to recipient at end of every to recipient of outgoing message id 47 with properties {address:"REDACTED"}
        --> to recipient 1 of outgoing message id 47
    set subject of outgoing message id 47 to "35 spam(s) being submitted for processing"
    set visible of outgoing message id 47 to true
    make new attachment with properties {file name:"Macintosh HD:Users:username:Desktop:SpamCop:Spam-20140908064824.eml"} at after last word of last paragraph of outgoing message id 47
        --> missing value
    make new attachment with properties {file name:"Macintosh HD:Users:username:Desktop:SpamCop:Spam-20140908081508.eml"} at after last word of last paragraph of outgoing message id 47
        --> missing value
    make new attachment with properties {file name:"Macintosh HD:Users:username:Desktop:SpamCop:Spam-20140908082049.eml"} at after last word of last paragraph of outgoing message id 47
        --> missing value
    make new attachment with properties {file name:"Macintosh HD:Users:username:Desktop:SpamCop:Spam-20140908082642.eml"} at after last word of last paragraph of outgoing message id 47
        --> missing value
    make new attachment with properties {file name:"Macintosh HD:Users:username:Desktop:SpamCop:Spam-20140908083224.eml"} at after last word of last paragraph of outgoing message id 47
        --> missing value
    make new attachment with properties {file name:"Macintosh HD:Users:username:Desktop:SpamCop:Spam-20140908091214.eml"} at after last word of last paragraph of outgoing message id 47
        --> missing value
    make new attachment with properties {file name:"Macintosh HD:Users:username:Desktop:SpamCop:Spam-20140908091848.eml"} at after last word of last paragraph of outgoing message id 47
        --> missing value
    make new attachment with properties {file name:"Macintosh HD:Users:username:Desktop:SpamCop:Spam-20140908092708.eml"} at after last word of last paragraph of outgoing message id 47
        --> missing value
    make new attachment with properties {file name:"Macintosh HD:Users:username:Desktop:SpamCop:Spam-20140908093615.eml"} at after last word of last paragraph of outgoing message id 47
        --> missing value
    make new attachment with properties {file name:"Macintosh HD:Users:username:Desktop:SpamCop:Spam-20140908093946.eml"} at after last word of last paragraph of outgoing message id 47
        --> missing value
    make new attachment with properties {file name:"Macintosh HD:Users:username:Desktop:SpamCop:Spam-20140908101749.eml"} at after last word of last paragraph of outgoing message id 47
        --> missing value
    make new attachment with properties {file name:"Macintosh HD:Users:username:Desktop:SpamCop:Spam-20140908101834.eml"} at after last word of last paragraph of outgoing message id 47
        --> missing value
    make new attachment with properties {file name:"Macintosh HD:Users:username:Desktop:SpamCop:Spam-20140908102327.eml"} at after last word of last paragraph of outgoing message id 47
        --> missing value
    make new attachment with properties {file name:"Macintosh HD:Users:username:Desktop:SpamCop:Spam-20140908102809.eml"} at after last word of last paragraph of outgoing message id 47
        --> missing value
    make new attachment with properties {file name:"Macintosh HD:Users:username:Desktop:SpamCop:Spam-20140908102920.eml"} at after last word of last paragraph of outgoing message id 47
        --> missing value
    make new attachment with properties {file name:"Macintosh HD:Users:username:Desktop:SpamCop:Spam-20140908103417.eml"} at after last word of last paragraph of outgoing message id 47
        --> missing value
    make new attachment with properties {file name:"Macintosh HD:Users:username:Desktop:SpamCop:Spam-20140908104041.eml"} at after last word of last paragraph of outgoing message id 47
        --> missing value
    make new attachment with properties {file name:"Macintosh HD:Users:username:Desktop:SpamCop:Spam-20140908104110.eml"} at after last word of last paragraph of outgoing message id 47
        --> missing value
    make new attachment with properties {file name:"Macintosh HD:Users:username:Desktop:SpamCop:Spam-20140908112201.eml"} at after last word of last paragraph of outgoing message id 47
        --> missing value
    make new attachment with properties {file name:"Macintosh HD:Users:username:Desktop:SpamCop:Spam-20140908113458.eml"} at after last word of last paragraph of outgoing message id 47
        --> missing value
    make new attachment with properties {file name:"Macintosh HD:Users:username:Desktop:SpamCop:Spam-20140908124138.eml"} at after last word of last paragraph of outgoing message id 47
        --> missing value
    make new attachment with properties {file name:"Macintosh HD:Users:username:Desktop:SpamCop:Spam-20140908124750.eml"} at after last word of last paragraph of outgoing message id 47
        --> missing value
    make new attachment with properties {file name:"Macintosh HD:Users:username:Desktop:SpamCop:Spam-20140908125605.eml"} at after last word of last paragraph of outgoing message id 47
        --> missing value
    make new attachment with properties {file name:"Macintosh HD:Users:username:Desktop:SpamCop:Spam-20140908130207.eml"} at after last word of last paragraph of outgoing message id 47
        --> missing value
    make new attachment with properties {file name:"Macintosh HD:Users:username:Desktop:SpamCop:Spam-20140908130508.eml"} at after last word of last paragraph of outgoing message id 47
        --> missing value
    make new attachment with properties {file name:"Macintosh HD:Users:username:Desktop:SpamCop:Spam-20140908132133.eml"} at after last word of last paragraph of outgoing message id 47
        --> missing value
    make new attachment with properties {file name:"Macintosh HD:Users:username:Desktop:SpamCop:Spam-20140908132909.eml"} at after last word of last paragraph of outgoing message id 47
        --> missing value
    make new attachment with properties {file name:"Macintosh HD:Users:username:Desktop:SpamCop:Spam-20140908134147.eml"} at after last word of last paragraph of outgoing message id 47
        --> missing value
    make new attachment with properties {file name:"Macintosh HD:Users:username:Desktop:SpamCop:Spam-20140908134736.eml"} at after last word of last paragraph of outgoing message id 47
        --> missing value
    make new attachment with properties {file name:"Macintosh HD:Users:username:Desktop:SpamCop:Spam-20140908143459.eml"} at after last word of last paragraph of outgoing message id 47
        --> missing value
    make new attachment with properties {file name:"Macintosh HD:Users:username:Desktop:SpamCop:Spam-20140908143618.eml"} at after last word of last paragraph of outgoing message id 47
        --> missing value
    make new attachment with properties {file name:"Macintosh HD:Users:username:Desktop:SpamCop:Spam-20140908160051.eml"} at after last word of last paragraph of outgoing message id 47
        --> missing value
    make new attachment with properties {file name:"Macintosh HD:Users:username:Desktop:SpamCop:Spam-20140908160448.eml"} at after last word of last paragraph of outgoing message id 47
        --> missing value
    make new attachment with properties {file name:"Macintosh HD:Users:username:Desktop:SpamCop:Spam-20140908173043.eml"} at after last word of last paragraph of outgoing message id 47
        --> missing value
    make new attachment with properties {file name:"Macintosh HD:Users:username:Desktop:SpamCop:Spam-20140908191450.eml"} at after last word of last paragraph of outgoing message id 47
        --> missing value
end tell
tell application "AppleScript Editor"
    display dialog "Clean up SpamCop folder now?" buttons {"Yes", "No"} default button "No"
        --> {button returned:"No"}
    display dialog "Spam deletion aborted." buttons {"OK"} default button "OK"
        --> {button returned:"OK"}
end tell
Result:
{button returned:"OK"}

【问题讨论】:

    标签: applescript apple-mail


    【解决方案1】:

    我自己解决了这个问题。解决方案就是替换这一行:

    make new attachment with properties {file name:(fullSpamPath as string)} at after the last word of the last paragraph
    

    用这个:

    make new attachment with properties {file name:fullSpamPath as alias} at after the last word of the last paragraph
    

    至于为什么前者只工作一次或两次,然后再没有,我不知道。从理论上讲,前者根本不应该起作用。如果有人有任何可行的解释,我会全力以赴。但我的代码现在可以正常工作了。

    【讨论】:

      【解决方案2】:

      我在这里看到一个错误:

      set fullSpamCopFolderPath to (theOutputFolderPath & SPAMCOP_FOLDER_NAME & ":")
      

      应该是:

      set fullSpamCopFolderPath to (theOutputFolderPath as text & SPAMCOP_FOLDER_NAME & ":")
      

      注意“作为文本”。您要添加字符串,而 theOutputFolderPath 不是字符串,因此您需要先将其设为一个,然后再将字符串 SPAMCOP_FOLDER_NAME 添加到其中。

      这是另一个错误:

      set subject of spamReport to ((spamsProcessed) & " spam(s) being submitted for processing" as string)
      

      应该是:

      set subject to (spamsProcessed as text) & " spam(s) being submitted for processing"
      

      同样,“spamsProcessed”是一个数字,您需要先将其设为字符串,然后再添加另一个字符串。另外,您在“tell spamReport”中,因此不需要“of spamReport”。

      最后,您应该将所有“邮件”代码移到 Finder 代码块之外。告诉 Finder 告诉 Mail 做某事是没有意义的,而且当您在彼此之间嵌入应用程序通知块时,它通常会导致难以发现的错误。

      所以试试下面的。我修复了一些其他小错误并删除了所有“作为字符串”的东西,因为一旦你修复了这些错误,你就不需要它了。我没有尝试此代码,但它应该可以工作。

      -- User settable constants
      set SPAMCOP_ACCOUNT to "REDACTED"
      set SENDER_ADDRESS to "REDACTED"
      set SPAMCOP_FOLDER_NAME to "SpamCop"
      
      -- Variable initialization
      set rawSpamFileList to {} -- List of names of spam files
      set spamsProcessed to 0 -- Number of spams processed
      set theOutputFolderPath to path to desktop folder -- Desktop folder path
      set fullSpamCopFolderPath to ((theOutputFolderPath as text) & SPAMCOP_FOLDER_NAME & ":") -- Spam folder on Desktop
      
      tell application "Finder"
      
          -- Create a SpamCop folder on Desktop if there isn't already one
          if not (exists folder fullSpamCopFolderPath) then
              make new folder at theOutputFolderPath with properties {name:SPAMCOP_FOLDER_NAME}
          end if
      
          -- Count number of Spams to be processed
          set spamsProcessed to number of items of folder fullSpamCopFolderPath
      
          -- Set the list of names to the raw source folder to loop through
          set rawSpamFileList to name of every file of folder fullSpamCopFolderPath
      end tell
      
      if (spamsProcessed > 0) then
          tell application "Mail"
              -- Create a blank spam-reporting email & set sender in it
              set spamReport to (make new outgoing message with properties {visible:true, content:" ", sender:SENDER_ADDRESS})
      
              -- Address it and add a tally of junk being reported    
              tell spamReport
                  make new to recipient at end of to recipients with properties {address:SPAMCOP_ACCOUNT}
                  set subject to (spamsProcessed as string) & " spam(s) being submitted for processing"
                  set visible to true
      
                  -- Attach all the spams in SpamCopFolder as attachment(s) to spamReport.
                  -- I SUSPECT THE PROBLEM IS IN THE REPEAT LOOP BELOW BUT I CAN'T SEE WHAT'S WRONG!
      
                  repeat with thisSpamName in rawSpamFileList
                      try
                          set fullSpamPath to fullSpamCopFolderPath & thisSpamName
                          make new attachment with properties {file name:fullSpamPath} at after the last word of the last paragraph
                      on error errmsg
                          display dialog ("Failed with errmsg: " & errmsg) buttons {"OK"} default button "OK"
                      end try
                  end repeat
              end tell
          end tell
      
          set responseButton to button returned of (display dialog "Clean up SpamCop folder now?" buttons {"Yes", "No"} default button "No")
          if responseButton is "Yes" then
              tell application "Finder"
                  delete every item of folder fullSpamCopFolderPath -- Send spams to trash
              end tell
          else
              display dialog "Spam deletion aborted." buttons {"OK"} default button "OK"
          end if
      else
          display dialog "No spam to process!  Are you hallucinating?" buttons {"OK"} default button "OK"
      end if
      

      【讨论】:

      • 不幸的是,您在上面提供的更正后的 Applescript 也表现出与我原来的 Applescript 相同的行为:它完美运行 ONCE,最多 TWICE (垃圾邮件附加到报告电子邮件),然后当其他一切继续完美运行时,它会在第三次尝试时停止附加垃圾邮件,无论是在 Applescript 编辑器下运行还是仅从菜单栏运行。我将 Applescript 编辑器的事件/回复窗口中的输出附加到我最初的问题中,希望它可能会为你敲响一些警钟,因为我只是盯着它看。
      • 我刚刚发现了一些真正神秘的东西:如果我在 Applescript 编辑器中更改 Applescript(例如,通过添加基本上是 NOP 的新行或将电子邮件地址更改为“已编辑”或从“已编辑”更改)然后运行它,然后Applescript将再次开始附加垃圾邮件一次或两次,然后停止执行附件操作(其他所有操作都可以正常工作)。我不想为了让它工作一两次而不断地来回改变我的Applescript。 WTF在这里发生????这让我发疯了!
      • 等等!我想我有一个解决办法。它是如此简单,以至于它真的是一个“doh!”片刻。但我需要进一步测试它,看看我的解决方案是否真的可行,或者它是否只是另一个侥幸的结果。待命……我应该会在接下来的几天内看到垃圾邮件浪潮再次达到顶峰的结果……
      • 该死!不是这样。我想如果我将行:set visible to true 移动到重复循环之后,这将解决问题,因为这是一个可见性问题,但事实并非如此。我继续遇到 Applescript 可以正常工作一次到三次然后停止附加垃圾邮件的问题。叹息。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-05
      • 2017-10-18
      • 1970-01-01
      • 1970-01-01
      • 2018-05-06
      相关资源
      最近更新 更多