Получать электронное письмо с правилами - PullRequest
0 голосов
/ 20 марта 2020

Я использую яблочный скрипт для хранения части входящих писем в базе данных. Этот скрипт вызывается через специальные почтовые правила. Он прекрасно работает месяцами, за одним исключением: если выбор в INBOX содержит дополнительно письма, которые не соответствуют критериям почтового правила, эти письма также передаются в сценарий (что на мой взгляд является ошибкой Apple High Sierra ) Поэтому мне приходится сравнивать перенесенные записи данных с соответствующим правилом. Ниже тестового сценария

using terms from application "Mail"
    on perform mail action with messages theSelectedMessages for rule theRule
            tell application "Mail"
                ...

                set ruleName to name of theRule
                set ruleScriptName to name of me

                repeat with theCondition in rule conditions of theRule

                    set {expression:ruleExpr, header:ruleHeader, rule type:ruleType, qualifier:ruleQualifier} to theCondition
                    log ...
                end repeat
            end tell
        end perform mail action with messages
    end using terms from

Связанный код от Apple в списке пользователей SyncedRules.plist:

<dict>
    <key>CriterionUniqueId</key>
    <string>XXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXXX</string>
    <key>Expression</key>
    <string>noreply@email.com</string>
    <key>Header</key>
    <string>From</string>
    <key>Qualifier</key>
    <string>EndsWith</string>
</dict>

Проблема: я всегда получаю следующие значения данных для условий правила:

ruleExpr: noreply@email.com
ruleType: 束constant ****tfro損
ruleHeader:
ruleQualifier: 束constant ****rqbw損

Переменная «ruleHeader» должна фактически содержать значение «from», но она пуста. Кроме того, содержимое «ruleType» и «ruleQualifier» также не доступно для чтения.

«Библиотека функций» редактора сценариев не помогает.

Есть много подсказок в inte rnet добавить новое правило, но я не нашел ни документов, ни подсказок для получения содержимого условия правила. Любая помощь приветствуется!

Ответы [ 2 ]

0 голосов
/ 24 марта 2020

Есть несколько способов получить значение константы приложения. Один из них - получить константы и значения из словаря сценариев и предоставить способ их поиска, а другой - использовать секретную (ну, не секретную) команду для загрузки пользовательской терминологии.

Следующий пример отображает константы, используя разные методы - я держал их отдельно, чтобы вы могли видеть, есть ли задержка при загрузке терминов. Сохраните его как приложение, поскольку редактор сценариев уже загружает терминологию приложения и обычно не использует необработанные константы:

use AppleScript version "2.4" -- Yosemite (10.10) or later
use framework "Foundation"
use scripting additions

tell application "Mail"
    set ruleQualifier to qualifier of some rule condition of rule "News from Apple" -- example rule
    set ruleExpr to (get sender of some message of some mailbox) -- example sender from random message
    set match to "noreply" -- example text to compare

    set method to button returned of (display dialog "Choose method to look up terminology" buttons {"Load via 'ascrgdut'", "Expand Constant", "Raw constant"} default button 3)
    if method is "Expand Constant" then -- manually look up constant name
        display dialog "The supplied term:" & return & my expandQualifier(ruleQualifier) with title method buttons {"OK"}
    else
        if method is "Load via 'ascrgdut'" then -- load terminology to get the name of the enumerator
            try
                «event ascrgdut» -- may be a slight delay while loading
            end try
        end if
        display dialog "The supplied term:" & return & ruleQualifier as string with title method buttons {"OK"}
    end if
end tell

# You can also use something like 'run script' to perform operations based on the qualifier:
tell me to activate
set comparison to quote & ruleExpr & quote & space & expandQualifier(ruleQualifier) & space & quote & match & quote
display dialog "Attempted comparison:" & return & comparison & return & return & "The result:" & return & (my performComparison(ruleExpr, ruleQualifier, match)) with title "Comparison Result" buttons {"OK"}


on expandQualifier(theItem) -- look up comparison name/operator from constant - returns 'missing value' if not found
    set ruleQualifiers to {rqbw:"begins with", rqco:"contains", rqdn:"does not contain", rqew:"ends with", rqie:"equal to", rqlt:"less than", rqgt:"greater than"}
    set dict to current application's NSDictionary's dictionaryWithDictionary:ruleQualifiers

    set theItem to theItem as text
    if theItem ends with "»" then -- look up constant from raw chevron syntax
        set lookup to dict's objectForKey:(text -5 thru -2 of theItem)
    else
        set lookup to dict's objectForKey:theItem
    end if
    if lookup is not missing value then set lookup to lookup as text
    return lookup
end expandQualifier

to performComparison(theItem, operation, theValue)
    set lookup to expandQualifier(operation)
    if lookup is not missing value then
        try
            return (run script quote & theItem & quote & space & (lookup as text) & space & quote & theValue & quote)
        on error errmess number errnum
            return "Error:  " & errmess
        end try
    else
        return "Error:  the operation " & quoted form of (operation as text) & " was not found."
    end if
end performComparison

Обратите внимание, что обработчики используют необработанные константы, которые получит приложение. При загрузке терминологии вам потребуется настроить запись / словарь поиска в соответствии с используемыми вами терминами.

0 голосов
/ 22 марта 2020

Вот решение для части "ruleHeader" моего вопроса:

            ...
                #set {expression:ruleExpr, header:ruleHeader, rule type:ruleType, qualifier:ruleQualifier} to theCondition

                tell theCondition
                    set ruleExpr to the expression
                    set ruleHeader to the header key
                    set ruleType to the rule type
                    set ruleQualifier to the qualifier
                end tell
            ...

Результат возвращаемых параметров теперь корректен:

Type: 束constant ****tfro損
Header: 束constant erutthdk損
Qualifier: 束constant ****rqew損

Для разделения значений ( константы типа) Я использую

set commandType to rich text 15 thru 18 of (ruleType as string)
set commandHeader to rich text 11 thru 18 of (ruleHeader as string) 
set commandQualifier to rich text 15 thru 18 of (ruleQualifier as string)

и получаю

commandType: tfro
commandHeader: erutthdk
commandQualifier: rqew

Вы можете найти объяснение этих констант здесь: http://ftp.icm.edu.pl/packages/Hacked%20Team.git/core-macos/core/RCSNativeMail.h

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...