Как я могу определить, существует ли контакт с данным адресом электронной почты в адресной книге? - PullRequest
1 голос
/ 23 июля 2011

Я пытаюсь создать сценарий, который «прогуливается» по почтовому ящику, проверяет адресную книгу, чтобы увидеть, есть ли уже отправитель электронного письма, и добавляет контакт в группу адресной книги, если найден. Если отправитель электронного письма не найден, новый контакт будет создан до его добавления в группу.

Пока у меня есть это для группы, добавляющей часть:

on addPersonToGroup(person)
    tell application "Address Book"
        add person to group "wedding guests"
    end tell
    save addressbook
end addPersonToGroup

и это для просмотра выбранных сообщений:

tell application "Mail"
    set selectedMessages to selection

    if (count of selectedMessages) is equal to 0 then
        display alert "No Messages Selected" message "Select the messages you want to add to 'wedding guests' address book group before running this script."
    else
        set weddingGuests to {}

        repeat with eachMessage in selectedMessages
            set emailAddress to extract address from sender of eachMessage
            --if emailAddress is found in Address Book then
            --  get the person from the Address Book
            --else
            --  create new person with emailAddress
            --end if
            --addPersonToGroup person
        end repeat
    end if
end tell

Закомментированная часть внутри блока "repeat with eachMessage ..." - это то, что я еще не понял.

Какие существуют способы поиска в адресной книге адреса электронной почты с использованием AppleScript? Существуют ли альтернативные языки сценариев на Mac, которые были бы более подходящими для такой задачи?

Ответы [ 2 ]

3 голосов
/ 26 июля 2011

Ниже приведен сценарий, который в итоге дал мне желаемый результат. Спасибо @ fireshadow52 за помощь:

    tell application "Mail"
    set selectedMessages to selection

    if (count of selectedMessages) is equal to 0 then
        display alert "No Messages Selected" message "Select the messages you want to add to 'wedding guests' address book group before running this script."
    else
        set weddingGuests to {}

        repeat with eachMessage in selectedMessages
            set emailSender to (extract name from sender of eachMessage) as string
            set emailAddress to (extract address from sender of eachMessage) as string

            my addSender(emailSender, emailAddress)
        end repeat
    end if
end tell

on splitText(delimiter, someText)
    set prevTIDs to AppleScript's text item delimiters
    set AppleScript's text item delimiters to delimiter
    set output to text items of someText
    set AppleScript's text item delimiters to prevTIDs
    return output
end splitText

on addSender(theSender, theEmail)
    tell application "Address Book"
        set tmp to my splitText(" ", theSender)

        set numOfItems to count tmp

        set senderFirst to item 1 of tmp
        if (numOfItems) is greater than 1 then
            set senderLast to item 2 of tmp
        else
            set senderLast to ""
        end if

        try
            set the check to get first person whose first name is senderFirst and last name is senderLast
            --No error, sender exists
            my addPersonToGroup(check)
        on error --sender is not in Address Book yet; add sender and email to contacts and add the new contact to group
            set newPerson to (make new person with properties {first name:senderFirst, last name:senderLast})
            --Add Email
            make new email at the end of emails of newPerson with properties {label:"Email:", value:theEmail}
            --add the new person to the group
            my addPersonToGroup(newPerson)
        end try
    end tell
end addSender

on addPersonToGroup(theSender)
    tell application "Address Book"
        add theSender to group "wedding guests"
        save
    end tell
end addPersonToGroup
2 голосов
/ 24 июля 2011

Верьте или нет, вы вроде как написали ответ на вопрос!

--In your "looping through selected messages" script, add this line...
set emailSender to (get sender of eachMessage) as string
--...before this one...
set emailAddress to (extract address from sender of eachMessage) as string
--This will help you later

--You should add this subroutine at the bottom of your script to check whether the contact exists or not; invoke it by doing 'my addSender(emailSender, emailAddress)'
on addSender(theSender, theEmail)
    tell application "Address Book"
        set the check to (get first person whose first name is theSender) as list
        if check is {} --sender is not in Address Book yet; add sender and email to contacts and add the new contact to group
            set newPerson to (make new person with properties {first name:theSender, last name:null}) --Sorry if you want the last name too
            --Add Email
            make new email at the end of emails of newPerson with properties {label:"Email:", value:theEmail}
            --add the new person to the group
            my addPersonToGroup(newPerson)
        else --sender is in Address Book, add sender to group
            my addPersonToGroup(check)
        end if
    end tell
end addSender

Как всегда, если вам нужна помощь, просто спросите. :)

P.S. Если вы получили ошибку в подпрограмме, скорее всего, это ошибка блока if. Чтобы исправить ошибку (и сохранить выполнение скрипта), просто измените блок if на блок try, как показано здесь:

try
    set check to (get first person whose first name is theSender) as list
    --No error, sender exists
    my addPersonToGroup(check)
on error --Error, sender is not in Address Book yet; add sender and email to contacts and add the new contact to group
    set newPerson to (make new person with properties {first name:theSender, last name:null}) --Sorry if you want the last name too
    --Add Email
    make new email at the end of emails of newPerson with properties {label:"Email:", value:theEmail}
    --add the new person to the group
    my addPersonToGroup(newPerson)
end try

P.P.S. person - зарезервированное слово для Address Book. Измените person на другую переменную, и она будет работать (имеется в виду подпрограмма addPersonToGroup).

...