航空会社の予約メールをtripitやflightyに自動転送して取り込む(GmailとGoogleAppScript)

旅程管理アプリ「tripit」とフライト管理アプリ「flighty」

旅程管理アプリ「tripit」では、航空会社やホテルの予約メールを指定アドレスに転送すると、予約情報が取り込まれる。
tripitではスマホアプリ(iPhone/Android)とWEBサイトで旅程管理ができる。

plans@tripit.com への確認メールの転送: 新規出張確認を手動で提出する場合は常に、TripIt アカウントに関連付けられているいずれかのメール受信ボックスから出張確認を plans@tripit.com に転送する必要があります。

提出すると、新規出張が登録されたこと、または出張項目が既存の出張に追加されたことを知らせる通知メールが送付されます。
https://help.tripit.com/ja-JP/support/solutions/articles/103000063275

tripitは法人向け経費管理ソリューションのConcur(SAP傘下)の出張・旅程管理アプリという位置付け。
根っこが法人向けなので運用がしっかりしてるのと、旅程取り込み機能でカバーする航空会社・ホテルの数が多い。

そして基本的なtripitの機能は、誰でも無料で使える。
出張でなくとも、普通の観光旅行でも問題なく使えるほか、家族間での共有などコラボレート機能もある。

ちなみにtripitはメール受信箱の権限を明け渡して、メールを自動チェックしてくれる機能もある。
この場合、予約メールをいちいちメール転送しなくてもよい。
ただし自分が試した感じでは、その手法より「メール転送」の方が確実&早かったので、「メール転送」を使っている。

フライト管理アプリ「flighty」は、航空会社の予約管理が専門。
ホテル宿泊には対応してないが、tripitより詳細なフライトデータをチェックできる。
ただしiPhoneのみで、Androidなし。

flightyもメール転送による予約取り込みが可能。
またtripit同期機能もあるので、自分はtripit経由で予約データを取り込んでいる。

There are 3 ways: Manually search, forward your email itinerary, or sync with TripIt.
Manual search supports searching by flight number or the route into the search field, selecting the date and tapping the flight you were looking for. Or you can set up email import to easily forward your flights via email or you can set up TripIt Sync to import all your flights from your TripIt account.https://flighty.com/help

ということで、自分の現在のフォーメーションは、tripit(メール転送)→flighty(tripit同期)

フライト管理だけならflighty直送でもよいかと思います。
自分はホテル予約とかもtripitに入れてるので、tripitにいったん全部転送している。
メールを転送する先としては、1つアプリ会社よりは、法人向けサービスを提供している会社の方が安心というのもある。

それで今回は、tripitやflightyへの予約取り込みを自動化する話のメモにて。

それでは早速、レッツらゴー!!

設定手順の概要

全体の設定手順は以下。

  1. tripitでメール転送元となる「自分のGmailアドレス」を設定する(tripitはメール転送先が全ユーザーで同じ)
    もしくはflightyで「メール転送先のメルアド」をメモる(flightyは人によって転送する宛先が異なる)
  2. Gmailのフィルタで、転送したいメールにラベルを自動付与する
    ここでは、「new」というラベルと「tripit」というラベルを使う
  3. GoogleAppScriptで、Gmailの「new」ラベルが付いた新着メールをtripit(or flighty)に転送する(定期実行)
    転送後にメールから「new」ラベルを剥がし、「tripit」ラベルを付与し、何度も同じメールを転送しないようにする

ここではtripitとflightyにフォーカスしているが、その他のフライト管理アプリでも、転送先のメルアドを変更すれば、同じ事ができる。

またflightyも含め、フライト管理・旅程管理アプリでは「tripit」との同期に対応しているアプリもあるので、いったんtripitに予約情報を取り込むという手もある。

以下、上記手順の詳細について。

Gmailのフィルタでラベルの自動付与

航空会社やホテルの予約を、Gmailで受け取っている。
そのGmailで受け取ったメールを、tripitに転送したい。

少なくとも手動で転送すると、tripitは取り込んでくれる。
あらかじめtripit側で「このGmailアドレスからメール転送するよー」という設定が必要
設定はコチラ。※アプリからもできる

一方Gmailには、残念ながら「条件指定での自動転送機能」はない。

そのため最終的にはGoogleAppScript(GAS)を使うんだが、その下準備としてGmailにフィルタでラベルを付ける。
ここでは、指定アドレスから受信したメールに、自動で「new」というラベルを付与する。

指定アドレスから受信したメールに、自動で「new」ラベルを付与する。
これはGmailのフィルタ機能で実現できる。
イチからフィルタを作ることもできるが、受信箱にあるメールから設定すると楽ちん。

例えば以下は、JAL国内線の予約完了メール。

Gmail 予約メール画面

メール送信元(from)の右の方、端っこに3点リーダーでメニューがある。
そのメニューから「メールの自動振り分け設定」を選択。

次の画面では、「From」に送信元アドレスが自動で入っている。
JALの場合、一般メルマガとかとは別に、予約情報の送信時アドレスがあり、↓がそれにあたる。
このメルアドからきたメールであれば、「JALからの予約関連のメールである」と判断できる。

Gmail メールの自動振り分け設定

更に、「件名に『予約内容』という文字を含む場合」という条件も追加しておく。
これが必要なのかは不明だが、とりあえず設定した。要らないかも。

あと送信元については「@」の前はなくてもOK。(あってもOK)
自分はこの場合、「@booking.jal.com」だけにしといた。

「From」と「件名」による抽出条件を設定したら、「検索」ボタンで抽出結果を試せる。
試すとイチから設定をやり直す感じではあるが、まずは試してみた方がいい。

問題なければ、「フィルタを作成」へ。

次の画面では、上記フィルタが適用されたメールへのアクションを設定する。
ここでは、「ラベルを付ける」を選択する。

Gmail ラベル設定

ラベルは、Gmailのメニューであらかじめ作っておける。
ここでは、「new」と「tripit」のラベルを作る。
ラベルがまだない場合、この画面でも作れる。

「ラベルを付ける」で「new」を選択して、「フィルタを作成」へ。
※「○通の一致するメールにもフィルタを適用する」を選択しておくと、他のメールにもラベルを付けられる

作成したフィルタは、Gmail画面の右上にある「設定」(歯車アイコン)から、いつでも変更できる。
「設定」→「全ての設定を表示」→「フィルタとブロック中のアドレス」。

Gmail フィルタ設定一覧

tripitが対応している航空会社・ホテル会社の予約メールは以下。
メールの文章形式が変わるとうまく取り込めなくなるので、このリストにあっても取り込み失敗する場合はある。
例えばリストに載ってるドーミーインの予約メールは、最近フォーマットが変わってるからか、tripitで取り込み失敗する。
https://www.tripit.com/uhp/supportedVendors
※tripitは基本的に文字列解析で予約情報をチェックする(構造化タグがある場合はそっちをみるかもだが、各社がほぼ対応してない)

参考まで、自分が設定済みのフィルタ条件は以下。

会社FromSubjecct
JAL@booking.jal.com 予約内容
ANA国内線anarsv@121.ana.co.jp 予約
ANA国際線anaintrsv@121.ana.co.jp 予約
ユナイテッド航空notifications@united.com 
ヒルトンnoreply@h6.hilton.comConfirmation
ソラシドエアsnj-rsv@solaseedair.jp 予約
JR東日本
(新幹線)
reservation@eki-net.com 

送信メルアドに「reservation」とか、その略称の「rsv」が入ってる場合、それは予約関連メール専用の可能性が高い。
その場合は、追加で「Subject」を設定しなくても良いんじゃなかな。↑はまだ適当なので設定してるけど。

予約メールの送信元がメルマガなどの送信元と同じ場合は、「Subject」でコントロールする。
予約と関係ないメルマガとかを間違って転送すると、いちいちtripitから「取り込み失敗」のメールがくる。
受信箱にエラーメールが一杯溜まってしまうので、不要なメール転送は避けた方がいい。

基本的にフィルタは、地道にチューニングしていく必要あり。

あと、予約変更のメールもtripitに転送できるようにした方がよい。
tripitは予約変更にも対応している(手動で対応が必要だけど)。

ということで、ここまでで「Gmailのフィルタでラベルの自動付与」が完了。

しばらくは、実際にちゃんとラベルがつくか、受信を試してみてから次のステップにいくとよいかと思います。
ラベルが付くと、Gmail上でそれが確認できる。

GoogleAppScriptで自動メール転送(Gmail)

Gmailは、GoogleAppScript(無料)から操作できる。
GoogleAppScript、通称GASについては、ググっていただければと存じます。
要はGoogleDriveにプログラムのファイルを作って、それを実行できる仕組みでござる。

早速まいります。

  1. GoogleDriveにアクセス(利用するGmailアドレスと同じGoogleアカウント)
  2. [新規]→[その他]→[Google App Script]→[スクリプトを作成]
  3. Google App Scriptを作成する(以下)

上記で進むと、以下のような画面になるかと思います。
※この時点ではプログラムのソースは入ってない画面になる

Google App Script 編集画面

左メニュー「<>」が最初から開いてて、コード追加画面になっている。
そこにソースを追加。

元からあるソースを全て削除しつつ、下記をコピペする。
※最初から2行くらい書いてあると思うが、それは不要なので削除

function forwardEmails() { 
	var labelNew = GmailApp.getUserLabelByName("new"); 
	var labelTripit = GmailApp.getUserLabelByName("tripit"); 
	var threads = labelNew.getThreads(); 
	for (var i = 0; i < threads.length; i++) { 
		var thread = threads[i]; 
		var messages = thread.getMessages(); 
		for (var j = 0; j < messages.length; j++) { 
			var message = messages[j]; 
			message.forward("plans@tripit.com");
		 } 
		thread.removeLabel(labelNew); 
		thread.addLabel(labelTripit); 
	}
}

このソースがやってることは以下。

  1. 受信箱から「new」ラベルのメールを探す
  2. そのメールを「plans@tripit.com」に転送する
  3. 転送後、「new」ラベルを削除して、「tripit」ラベルを付ける

さっき作ったラベル、new・tripitを使う。
ラベル名が自分で作ったモノと異なる場合は、変更する。

あとメールの転送先がtripitでない場合は、ソース中のメルアドを変更する。
ここではtripitに転送している。
※flightyに直接転送する場合は、このメルアドを変更

手順をまとめると以下。

  1. ソースを貼付けて、必要あれば変更する(太字のところ)
  2. 左上クリックして、スクリプトの名前を付ける
    なんでもOKだがGoogleDrive上でのファイル名になるので、自分で分かるようにしておく
  3. 「プロジェクトを保存」ボタン
  4. 「実行」を押すと、早速実行される
  5. 「GoogleAppScriptからメール送信するけどよい?」的な確認メッセージがでたら、対応する
    初めてGASからGmailを使う場合は、この権限確認メッセージがでると思います

実行して無事にtripitにメール転送されたら、tripitから「取り込み成功」とか「失敗」のメールがくる。
これは手動で転送した時と同様。

問題なければ、このスクリプトの実行タイミングを設定する。
ここでは、このスクリプトが10分に1回実行されるようにする(10分に1回のメールチェック)。

  1. 画面左メニューから「トリガー」を選択
  2. イベントのソースは「時間主導型」を選択
  3. トリガーのタイプは「10分おき」を選択

Google App Script トリガー設定

これで、受信箱のチェックが10分おきに発動する。
※最短10分でいいと思います。確か無料で実行できる回数がきまってるので

なお、作成したGoogleAppScriptは、GoogleDriveからいつでも編集・削除が可能。

GoogleAppScriptで自動メール転送(Gmail) 改良版

agodaの予約メールが重くて、本文だけで1mb近くあったりする。
するとGoogleAppScriptの制限に失敗し、「Exception: Limit Exceeded: Email Body Size. at forwardEmails(Code:10:12)」というエラーがでる。
このエラーを回避するスクリプトに修正した。
容量オーバーでエラーになる場合、本文の装飾(htmlタグ)は外して転送する。

function forwardEmails() {
  var labelNew = GmailApp.getUserLabelByName("new");
  var labelTripit = GmailApp.getUserLabelByName("tripit");
  var threads = labelNew.getThreads();
  
  // TripItの宛先
  var recipient = "plans@tripit.com";

  for (var i = 0; i < threads.length; i++) {
    var thread = threads[i];
    var messages = thread.getMessages();
    
    for (var j = 0; j < messages.length; j++) {
      var message = messages[j];
      
      try {
        // 【1】まずは通常通りの転送を試みる(HTMLそのまま)
        message.forward(recipient);
        console.log("Standard forward success: " + message.getSubject());
        
      } catch (e) {
        // 【2】サイズエラーの場合の処理
        if (e.toString().includes("Limit Exceeded: Email Body Size")) {
          console.warn("Body size limit hit. Switching to Plain Text mode: " + message.getSubject());
          
          // HTML(getBody)ではなく、プレーンテキスト(getPlainBody)を取得
          var textBody = message.getPlainBody();
          
          GmailApp.sendEmail(
            recipient, 
            "Fwd: " + message.getSubject(), // 件名維持
            textBody, // 本文を軽量なテキストデータに差し替え
            {
              attachments: message.getAttachments() // 念のため添付ファイルも維持
            }
          );
          
        } else {
          console.error("Unexpected error: " + e);
          throw e;
        }
      }
    }
    
    // ラベルの付け替え
    thread.removeLabel(labelNew);
    thread.addLabel(labelTripit);
  }
}

まとめ

  • 指定アドレスからメールを受信したら、Gmailフィルタによりnewラベルがつく
  • GoogleAppScriptが10分毎にメールチェックし、newラベルのメールをtripitに転送
  • メール転送が完了したら、tripitから取り込み結果のメールがくる
  • また転送実施済のメールにはtripitラベルが付いており、スクリプトが動いたか確認できる
    (newラベルがずっと残ってたら、スクリプトが動いてない)

いまのところ、自分はこんな感じで自動化をまわしている。
特に問題はなさそうです。

tripitまわりの話は他にもあるんだけど、ここではこれくらいにて。

ほい。

そんな感じ。

tonogata
tonogata

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です