PostmarkのSpamAssassin REST APIを呼び出してメールのスパム判定を行うAppleScriptです。
NSURLSessionを用いてPOST methodのREST APIを呼び出しています。
メール本文のソーステキストを渡すと、スパム度のスコアを計算して返してくれます。パラメータの「options」で「short」か「long」を指定でき、最終的な評価値のみ知りたい場合には前者を、詳細情報を知りたい場合には後者を指定することになります。
すでにMail.appにスパム判定の機能が標準搭載されているため、スパムフィルタ単体で利用する用途というのは減ってきましたが、メールの送信前にスパムフィルタに引っかからないかをチェックしておく(メールマガジン作成時など)ためには「あったほうが便利」な処理です。
本APIを利用するのに、事前のユーザー登録やAPI Keyを取得する必要はありません。このリストを実行するとそのまま結果が得られます。Mail.appのメッセージのソースを渡すのもたいして手間はかかりません。
ただし、本APIは継続して提供される保証もありませんし、トラブルが発生して動作が止まっていた場合に対処してくれたりはしません。実際の業務ほかシビアな用途で利用するのはためらわれるものがあります。
ローカルにSpamSieveをインストールしてAppleScriptで呼び出すと同様にスパム評価値を計算してくれるので、メールのSPAM判定のための用途にはこれも検討に値するでしょう。
AppleScript名:Call Postmark’s spam API |
— Created 2018-06-20 by Takaaki Naganoya — 2018 Piyomaru Software use AppleScript version "2.5" use scripting additions use framework "Foundation" property |NSURL| : a reference to current application’s |NSURL| property NSString : a reference to current application’s NSString property NSURLSession : a reference to current application’s NSURLSession property NSJSONSerialization : a reference to current application’s NSJSONSerialization property NSMutableURLRequest : a reference to current application’s NSMutableURLRequest property NSUTF8StringEncoding : a reference to current application’s NSUTF8StringEncoding property NSURLSessionConfiguration : a reference to current application’s NSURLSessionConfiguration property retData : missing value property retCode : 0 property retHeaders : 0 set aBody to "raw dump of email" –https://spamcheck.postmarkapp.com/doc/ set aURL to "https://spamcheck.postmarkapp.com/filter" set aRec to {email:aBody, options:"long"} set aRESTres to callRestPOSTAPIAndParseResults(aURL, aRec, 10) of me set aRESTcode to retCode of aRESTres –> 200 set aRESTheader to retHeaders of aRESTres set aRESTres to retData of aRESTres –> {success:true, rules:{{score:"1.2", |description|:"Missing To: header"}, {score:"-0.0", |description|:"Informational: message was not relayed via SMTP"}, {score:"1.4", |description|:"Missing Date: header"}, {score:"1.8", |description|:"Missing Subject: header"}, {score:"2.3", |description|:"Message appears to have no textual parts and no Subject: text"}, {score:"0.1", |description|:"Missing Message-Id: header"}, {score:"-0.0", |description|:"Informational: message has no Received headers"}, {score:"1.0", |description|:"Missing From: header"}, {score:"0.0", |description|:"Message appears to be missing most RFC-822 headers"}}, score:"7.9", report:" …."} on callRestPOSTAPIAndParseResults(reqURLStr as string, aRec as record, timeoutSec as integer) set retData to missing value set retCode to 0 set retHeaders to {} set aURL to |NSURL|’s URLWithString:reqURLStr set aRequest to NSMutableURLRequest’s requestWithURL:aURL aRequest’s setHTTPMethod:"POST" aRequest’s setCachePolicy:(current application’s NSURLRequestReloadIgnoringLocalCacheData) aRequest’s setHTTPShouldHandleCookies:false aRequest’s setTimeoutInterval:timeoutSec –aRequest’s setValue:"gzip" forHTTPHeaderField:"Content-Encoding"–Does not work with this API & Method aRequest’s setValue:"application/json" forHTTPHeaderField:"Accept" aRequest’s setValue:"application/json; charset=UTF-8" forHTTPHeaderField:"Content-Type" set dataJson to current application’s NSJSONSerialization’s dataWithJSONObject:aRec options:0 |error|:(missing value) aRequest’s setHTTPBody:dataJson set aConfig to NSURLSessionConfiguration’s defaultSessionConfiguration() set aSession to NSURLSession’s sessionWithConfiguration:aConfig delegate:(me) delegateQueue:(missing value) set aTask to aSession’s dataTaskWithRequest:aRequest set hitF to false aTask’s resume() –Start URL Session repeat (1000 * timeoutSec) times if retData is not equal to missing value then set hitF to true exit repeat end if delay ("0.001" as real) end repeat if hitF = false then error "REST API Timeout Error" return {retData:retData, retCode:retCode, retHeaders:retHeaders} end callRestPOSTAPIAndParseResults on URLSession:tmpSession dataTask:tmpTask didReceiveData:tmpData set aRes to tmpTask’s response() set retCode to aRes’s statusCode() set retHeaders to aRes’s allHeaderFields() set resStr to NSString’s alloc()’s initWithData:tmpData encoding:(NSUTF8StringEncoding) set jsonString to NSString’s stringWithString:(resStr) set jsonData to jsonString’s dataUsingEncoding:(NSUTF8StringEncoding) set aJsonDict to NSJSONSerialization’s JSONObjectWithData:jsonData options:0 |error|:(missing value) set retData to aJsonDict as list of string or string –as anything end URLSession:dataTask:didReceiveData: |
More from my site
(Visited 76 times, 1 visits today)