Archive for the 'MailCore' Category

2017/01/20 MailCore2でメールのeml形式ファイルから添付ファイルを抽出 v2

オープンソースのフレームワーク「MailCore2」を使ってeml形式のメールファイルを読み込んで添付ファイルを取り出すAppleScriptの改良強化版(v2)です。

実行のためにはMailCore.frameworkをビルドして、~/Library/Frameworksに入れておく必要があります。

普通にMail.appをGUIなりAppleScriptから操作すれば、もっと手軽にメールの添付ファイルは取得できるわけですが、本Scriptは「うっかり書き出してしまったemlファイル」からの添付ファイルの抽出を行います。

本バージョンでは、MIMEの入れ子構造を再帰処理で追いかけています(そんなに激しく入れ子にしないと思いますが、一応)。また、添付ファイルの種別を”application/zip”だけでなく、その他のさまざまな(PDFとかExcel書類とか)ファイルについてテストして対応させてみました。

AppleScript名:MailCore2でメールのeml形式ファイルから添付ファイルを抽出 v2
– Created 2017-01-20 by Takaaki Naganoya
– 2017 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
use framework “MailCore” –https://github.com/MailCore/mailcore2
—http://piyocast.com/as/archives/4400

set aPath to POSIX path of (choose file of type {“com.apple.mail.email”})

set fileContents to current application’s NSData’s dataWithContentsOfFile:aPath options:(current application’s NSDataReadingMappedIfSafe) |error|:(missing value)
if fileContents = missing value then return

set aParser to current application’s MCOMessageParser’s messageParserWithData:fileContents

set aBodySet to aParser’s mainPart()
set pList to aBodySet’s parts()
set pCount to pList’s |count|()
log pCount
–> 2

set aDtPath to POSIX path of (path to desktop)

prepareMIMEpartAndSaveAttachment(pList, aDtPath) of me

–入れ子になっているMIMEの階層をたどってMessage内の添付ファイルを抽出
on prepareMIMEpartAndSaveAttachment(pList, outPath)
  repeat with i in (pList as list)
    set aMimeType to (i’s mimeType()) as string
    
set aCharset to (i’s charset()) as string
    
    
if aMimeType is in {“text/plain”, “text/html”} then
      set aStr to i’s decodedString() –とくに意味はない
      
    else if aMimeType begins with “application/” then –”application/zip” とか”application/pdf”とか
      set aData to i’s |data|()
      
set aFileName to (i’s filename()) as string
      
set fRes to writeDataToPath(outPath, aFileName, aData) of me
      
    else
      –MimeTypeとcharsetがmissing valueのpart(たぶん、Attachment)
      
set ppList to i’s parts()
      
set ppCount to ppList’s |count|()
      
prepareMIMEpartAndSaveAttachment(ppList, outPath) of me –Recursive Call
      
    end if
    
  end repeat
end prepareMIMEpartAndSaveAttachment

–NSDataをファイル書き込み。パス(aPath)はPOSIX pathで与える
on writeDataToPath(aPath, aName, aNSData)
  set newPath to aPath & aName
  
set aRes to aNSData’s writeToFile:newPath atomically:true
  
return aRes as boolean
end writeDataToPath

★Click Here to Open This Script 

2017/01/20 MailCore2でメールのeml形式ファイルから添付ファイルを抽出

オープンソースのフレームワーク「MailCore2」を使ってeml形式のメールファイルを読み込んで添付ファイルを取り出すAppleScriptです。

実行のためにはMailCore.frameworkをビルドして、~/Library/Frameworksに入れておく必要があります。

普通にMail.appをGUIなりAppleScriptから操作すれば、もっと手軽にメールの添付ファイルは取得できるわけですが、本Scriptは「うっかり書き出してしまったemlファイル」からの添付ファイル(Zip圧縮したファイルのみ)の抽出を行います。

macOSのMail.appから「添付ファイルつきのメッセージ」をFinderにドラッグ&ドロップして作成したeml形式のファイルが処理対象です。

この処理対象ファイルを本AppleScriptで処理すると、デスクトップフォルダに添付ファイルが保存されます。

MIMEがマルチパートであることは認識していましたが、入れ子状態の階層が割と多い、多階層の入れ子にできるようなので、本来であれば再帰処理すべきなのかもしれません。また、Mail.app以外のメーラーから来たメールはMIMEの組み立て方が異なっているかもしれません。あくまで、macOS 10.12上のMail.app v10.2同士でやりとりした添付ファイルつきメールの処理が本Scriptで行えた、ということにすぎません。

AppleScript名:MailCore2でメールのeml形式ファイルから添付ファイルを抽出
– Created 2017-01-18 by Takaaki Naganoya
– 2017 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
use framework “MailCore” –https://github.com/MailCore/mailcore2
—http://piyocast.com/as/archives/4399

set aPath to POSIX path of (choose file of type {“com.apple.mail.email”})

set fileContents to current application’s NSData’s dataWithContentsOfFile:aPath options:(current application’s NSDataReadingMappedIfSafe) |error|:(missing value)
if fileContents = missing value then return

set aParser to current application’s MCOMessageParser’s messageParserWithData:fileContents

set aBodySet to aParser’s mainPart()
set pList to aBodySet’s parts()
set pCount to pList’s |count|()
log pCount
–> 2

set aDtPath to POSIX path of (path to desktop)

–本来は再帰で処理すべき?
repeat with i in (pList as list)
  set aMimeType to (i’s mimeType()) as string
  
–> “text/plain”
  
  
set aCharset to (i’s charset()) as string
  
–> “UTF-8″
  
  
if aMimeType is in {“text/plain”, “text/html”} then
    set aStr to i’s decodedString()
    
  else if aMimeType = “application/zip” then
    set aData to i’s |data|()
    
set aFileName to (i’s filename()) as string
    
set fRes to writeDataToPath(aDtPath, aFileName, aData) of me
    
log fRes
    
  else
    –MimeTypeとcharsetがmissing valueのpart(たぶん、Attachment)
    
set ppList to i’s parts()
    
set ppCount to ppList’s |count|()
    
    
repeat with ii in (ppList as list)
      set bMimeType to (ii’s mimeType()) as string
      
set bCharset to (ii’s charset()) as string
      
      
if bMimeType is in {“text/plain”, “text/html”} then
        set aStr to ii’s decodedString()
        
      else if bMimeType = “application/zip” then
        set bData to ii’s |data|()
        
set bFileName to (ii’s filename()) as string
        
log bFileName
        
set fRes to writeDataToPath(aDtPath, bFileName, bData) of me
        
log fRes
      end if
    end repeat
    
  end if
  
end repeat

–NSDataをファイル書き込み。パス(aPath)はPOSIX pathで与える
on writeDataToPath(aPath, aName, aNSData)
  set newPath to aPath & aName
  
set aRes to aNSData’s writeToFile:newPath atomically:true
  
return aRes as boolean
end writeDataToPath

★Click Here to Open This Script 

2017/01/18 MailCore2でメールのeml形式ファイルを読み込む v2

オープンソースのフレームワーク「MailCore2」を使ってeml形式のメールファイルを読み込んでテキスト化するAppleScriptです。

実行のためにはMailCore.frameworkをビルドして、~/Library/Frameworksに入れておく必要があります。

本来、Mail.appでメールから本文テキストを取得するのは簡単で、小学生レベルの処理内容ですが本AppleScriptは、Mail.appから書き出されたemlファイル(Mail.appからドラッグ&ドロップで単体のメールを書き出したファイル)からの本文抽出を行います。

mail_eml.png

AppleScriptでなんともならない書類の筆頭であった「.eml」形式ファイルを読み込んでプレーンテキスト化できるようになったことには、大きな意義があるような気がします。

AppleScript名:MailCore2でメールのeml形式ファイルを読み込む v2
– Created 2017-01-18 by Takaaki Naganoya
– 2017 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
use framework “MailCore” –https://github.com/MailCore/mailcore2
—http://piyocast.com/as/archives/4397

set aPath to POSIX path of (choose file of type {“com.apple.mail.email”})

set fileContents to current application’s NSData’s dataWithContentsOfFile:aPath options:(current application’s NSDataReadingMappedIfSafe) |error|:(missing value)
if fileContents = missing value then return

set aParser to current application’s MCOMessageParser’s messageParserWithData:fileContents

–改行を削除してメール本文をプレーンテキスト化
set aBody1 to (aParser’s plainTextBodyRendering()) as string
–>  ”技術書典 事務局です。 この度は技術書典2へのサークル参加申し込み、誠にありがとうございました。 ◎貴サークル「Piyomaru Software」は、 え-11 に配置されました。…

–改行を維持しつつメール本文をプレーンテキスト化
set aBody2 to (aParser’s plainTextBodyRenderingAndStripWhitespace:false) as string
(*
–>  ”技術書典 事務局です。
この度は技術書典2へのサークル参加申し込み、誠にありがとうございました。
◎貴サークル「Piyomaru Software」は、 え-11 に配置されました。
*)

★Click Here to Open This Script