Google Apps ScriptでGmail APIにてメールデータを変換して追加する【GAS】

以前、NotesのメールをOutlookのEML形式に変換して取り込むのを作成したのですが、今回ちょっとこれをGMailに取り込めないか?と考えてる途中で、メールを分解し一覧表にし、添付ファイルはGoogle Driveにアップロードしてある状態で、この2つからメールを構築して受信トレイに入れられないか?と考え、GASで作ってみました。

Gmailは他の環境からのメールの移行はThunderbirdを使うケースはよくあるのですが、これをプログラムで行えたら便利だと思ったので、まだ変換して取り込む部分だけですが、これで他の環境のメールの移行の一助になるのではないかと思います。

Lotus NotesのメールをOutlookに変換して移行する

今回利用するファイル

今回はGmailを操作する為、Google Apps ScriptからGmail APIを叩いて変換をしています。添付するファイルは2つ以下のファイルにしてあります。

図:こんな感じに構築して受信トレイに入れる

事前準備と仕組み

拡張サービスを有効化する

今回、GASからGmail APIを直接利用するので、以下の作業が必要になります。

  1. スクリプトエディタを開く
  2. 左サイドバーのサービスにある+をクリックする
  3. Gmail APIを選択して、追加をクリック

これで、GASからREST APIであるGmail APIを叩く事が可能になります。GASのメソッドであるMailAppやGmailAppとは異なるので注意。

図:拡張サービスを利用する

Gmailの仕組み

GmailはOutlookとは異なり、メールボックスは1個しかなく、各メールのエントリーに対して標準で用意されてるラベル(受信トレイやスター付きといったもの)を付与する事で分類しています。送信済みであったりもそのうちの1つで、個別にメールボックスの区分が存在するわけではありません。

また、このラベルはラベル名とそれぞれIDが付与されており、受信トレイの場合はIDはINBOXというものが割当られており、ユーザが自分で作成したラベルも作成時に独自にラベルIDが付与されています。このラベルが1個も無い状態のメールは、「すべてのメール」にしか表示されません。

今回はtomatoというラベルを用意し、受信トレイとtomatoにメールが表示されるように、メールデータを作成したらラベルも同時に付与しています。

図:独自のラベルを作成しておいた

ソースコード

対象のメールのラベルIDを取得する

  • targetに自分の作成したラベル名を入れる
  • ラベル一覧から合致するものがヒットしたら、そのラベルIDを返す

図:ラベルIDが取得できた

添付ファイル部分を構築する処理

Gmail APIで添付ファイル部分を構築するには、ちょっと複雑な処理が必要で、JavaScriptでファイルのアップロードをする時にBoundaryというものを使って区切り、データの詳細な内容を構築し、1まとめにしたものを返す必要があります。

今回は複数添付出来るように、配列で渡して変換し、呼び出し元のContent-Typeに返すように構築した関数を用いています。

  • 配列の中にはファイルIDだけが入ってる
  • それをidsで受け取って、mimetypeやfilename, base64でエンコードしたblobデータをattachにひとまとめに格納
  • 格納したものにboundary文字列を前後に結合して返しています。変換結果は以下のようなものになります。

メールデータを構築して受信トレイに入れるメインコード

前述の2つの関数を使って、メールデータに必要なデータに変換し、このメインの処理で1つのメールデータに構築し直しています。ただ、添付ファイルはGoogle Driveにアップロードしてるわけですから、そのファイルへの直リンクでもいいんじゃないかなと個人的には思うので、メールコンバータを作る際には、添付ファイルではなく、本文にファイルへのリンクを添付するだけにしようかと考えています。

  • attachには複数のファイルIDを入れて、複数添付させています。
  • encodedMessageではUtilities.base64EncodeWebSafeというメソッドを使って、エンコードしたものを構築します。
  • その際にメール本文は一番最後の、msg_textとして格納しておき、添付ファイルはcontent-typeに変換したデータを格納
  • Gmail.newMessageで新規のメッセージを作成し、前述のencodedMessageの中身をrawに追加。
  • 最後に受信トレイとtomatoというラベルを付与。ここはラベル名ではなくラベルIDなので注意。
  • メール追加はGmail.Users.Messages.insertにて行い、meは自身のメールボックスの意味で指定。
  • Utilities.Charset.UTF_8を指定しないと、日本語が文字化けしてしまうので、必ず追加しましょう。

メールを追加後に受信トレイで更新をクリックすると、冒頭のような自分で構築したメールがボックスに入ります。予め別のメール環境からSpreadsheetにデータ類を出力、添付ファイルはDriveにアップしてIDだけを追記、その一覧からGmailに連続的にこの処理で追加処理をすれば事実上のメールボックスの変換処理が可能になります。

※この処理を前述のNotes=>Outlookへ新機能としてNotes=>Gmailとして装備しようかなと考えています。

関連リンク

コメントを残す

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

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください。