简体   繁体   中英

Using AppleScript to create text file with email details via Mail Rule

I am trying to create an AppleScript to use via a Mail rule to take data from the message, create a text file, and save it to a folder on the desktop. I have tried various iterations that do not give me an error but also don't create the file. I cut the "CREATE DOCUMENT WITH EMAIL INFORMATION" portion into a new AppleScript and set the variables above it as a test and the text file is created, so something isn't moving from my email information variable defining over to my text document creating. I have been teaching myself by reading these forums and am finally stuck, so any help with syntax or errors you see would be appreciated.

using terms from application "Mail"
on perform mail action with messages this_message for rule this_rule
    tell application "Mail"

        --CLEAR THE VARIABLES
        set this_messageid to ""
        set this_date to ""
        set this_sender to ""
        set this_subject to ""
        set this_content to ""
        set this_attachments to ""

        -- GET THE MESSAGE ID OF MESSAGE
        set this_messageid to the messageid of this_message

        --GET THE DATE RECEIVED OF MESSAGE
        set this_date to the date received of this_message

        -- GET THE SENDER OF THIS MESSAGE
        set this_sender to the sender of this_message

        -- GET SUBJECT OF MESSAGE
        try
            set this_subject to (subject of this_message) as Unicode text
            if this_subject is "" then error
        on error
            set this_subject to "NO SUBJECT"
        end try

        -- GET CONTENT OF MESSAGE
        try
            set this_content to (every character of content of this_message) as Unicode text
            if this_content is in {"", "?"} then error
        on error error_message
            set this_content to "NO CONTENT"
        end try

        --DETERMINE IF THERE ARE ATTACHMENTS
        if thisMessage's mail attachments is not {} then
            set this_attachments to "Yes"
        end if

        --GET THE MAILBOX ACCOUNT OF MESSAGE
        set this_account to account of mailbox of thisMessage

    end tell



    -- CREATE DOCUMENT WITH EMAIL INFORMATION
    set this_document to open for access ("/Users/username/Desktop/SendToKeepIt/" & "Email " & this_subject & " " & this_messageid & ".txt") with write permission
    write "Airmail Link: " & "airmail://message?mail=" & this_account & "&messageid=" & this_messageid & return & "Mail Link: " & "message://" & "&messageid=" & this_messageid & return & return & "Date: " & this_date & return & "Subject: " & this_subject & return & "Sender: " & this_sender & return & "Attachments?: " & this_attachments & return & return & this_content to this_document
    close access this_document

end perform mail action with messages
end using terms from

Update 2018-08-14 Based on the comment below, I made some changes but am still getting the same result, no file is created. Again, if I copy the script portion from "--CREATE..." to "close access" and put variables above the script, I get a file that is exactly what I want, so for some reason the variables I am setting from the mail message are not being used to create the document I assume?

using terms from application "Mail"
    on perform mail action with messages these_messages for rule this_rule
        tell application "Mail"
            set the message_count to the count of these_messages
            repeat with i from 1 to the message_count
                set this_message to item i of these_messages

                --CLEAR THE VARIABLES
                (*
                set this_messageid to ""
                set this_date to ""
                set this_sender to ""
                set this_subject to ""
                set this_content to ""
                set this_attachments to "No"
                *)

                -- GET THE MESSAGE ID OF MESSAGE
                set this_messageid to the messageid of this_message

                --GET THE DATE RECEIVED OF MESSAGE
                set this_date to the date received of this_message

                -- GET THE SENDER OF THIS MESSAGE
                set this_sender to the sender of this_message

                -- GET SUBJECT OF MESSAGE
                set this_subject to subject of this_message
                if this_subject is "" then set this_subject to "NO SUBJECT"

                -- GET CONTENT OF MESSAGE
                set this_content to (every character of content of this_message)
                if this_content is in {"", "?"} then set this_content to "NO CONTENT"

                --DETERMINE IF THERE ARE ATTACHMENTS
                if thisMessage's mail attachments is not {} then set this_attachments to "Yes"

                --GET THE MAILBOX ACCOUNT OF MESSAGE
                set this_account to account of mailbox of thisMessage

                -- CREATE DOCUMENT WITH EMAIL INFORMATION
                set this_document to open for access ("/Users/russellread/Desktop/SendToKeepIt/" & "Email " & this_subject & " " & this_messageid & ".txt") with write permission
                write "Airmail Link: " & "airmail://message?mail=" & this_account & "&messageid=" & this_messageid & return & "Mail Link: " & "message://" & "&messageid=" & this_messageid & return & return & "Date: " & this_date & return & "Subject: " & this_subject & return & "Sender: " & this_sender & return & "Attachments?: " & this_attachments & return & return & this_content to this_document
                close access this_document

            end repeat
        end tell
    end perform mail action with messages
end using terms from

The issue was mostly with mismatched variable names: for example, you defined a variable called this_message , but then referred later on in the script to an undefined variable called thismessage .

Anyway, here's a revised version of your script:

property text item delimiters : linefeed

using terms from application "Mail"
    on perform mail action with messages these_messages for rule this_rule
        tell application "Mail"
            set the message_count to the count of these_messages
            repeat with i from 1 to the message_count
                set this_message to item i of these_messages

                set msg_attr to {this_messageid:message id ¬
                    , this_date:date received ¬
                    , this_sender:sender ¬
                    , this_subject:subject ¬
                    , this_content:content ¬
                    , this_account:name of account of mailbox ¬
                    , has_attachments:mail attachments} of this_message

                if msg_attr's this_subject is "" then ¬
                    set msg_attr's this_subject to "NO SUBJECT"
                ignoring white space
                    if msg_attr's this_content is in {"", "?"} then ¬
                        set msg_attr's this_content to "NO CONTENT"
                end ignoring

                if msg_attr's has_attachments ≠ {} then
                    set msg_attr's has_attachments to "Yes"
                else
                    set msg_attr's has_attachments to "No"
                end if

                -- CREATE DOCUMENT WITH EMAIL INFORMATION
                set fp to "/Users/CK/Desktop/" & "Email " & ¬
                    msg_attr's this_subject & space & ¬
                    msg_attr's this_messageid & ".txt"

                my Write_To_File(fp, msg_attr)
            end repeat
        end tell
    end perform mail action with messages
end using terms from


to Write_To_File(filepath as text, msg_attr as record)
    local filepath, msg_attr

    set folpath to (POSIX file filepath) & "::" as text as alias

    tell application "System Events" to make new file with properties ¬
        {name:folpath & "tmp-unnamed" as text}

    set this_document to folpath & "tmp-unnamed" as text as alias

    tell msg_attr to set txt to the contents of {¬
        ["Airmail Link: ", "airmail://message?mail=", its this_account, ¬
            "&messageid=", its this_messageid], ¬
        ["Mail Link: ", "message://", "messageid=", its this_messageid], ¬
        [], ["Date: ", its this_date], ¬
        ["Subject: ", its this_subject], ¬
        ["Sender: ", its this_sender], ¬
        ["Attachments?: ", its has_attachments], ¬
        [], its this_content} as text


    write the txt to this_document as «class utf8»

    tell application "System Events" to set name of this_document to filepath
end Write_To_File

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM