Webhook APIを使って添付ファイル付きメールを処理する(Ruby編)

Customers Mail Cloudではプログラム側からデータを取得したり、メールを送信するWeb APIの他に、Customers Mail Cloudでメールを受信した時にイベントを伝えてくれるWebhook APIが用意されています。

Webhook APIを使うことで、自前でメールサーバを立てずにメール受信のタイミングでシステムを起動させられるようになります。メールサーバを安定して動作させ続けるのはメンテナンスコストが大きいですが、Customers Mail Cloudを使うことで簡単にメールと連携したシステムが作れるようになるでしょう。

今回はRubyとSinatraを使ってメールを処理する流れを紹介します。

フォーマットはJSONとマルチパートフォームデータ

Webhookの形式として、JSONとマルチパートフォームデータ(multipart/form-data)が選択できます。この二つの違いは、添付ファイルがあるかどうかです。JSONの場合、添付ファイルは送られてきません。メールに添付ファイルがついてくる可能性がある場合は、後者を選択してください。

f:id:moongift:20200227212807p:plain
Webhook設定ダイアログ

今回は添付ファイル付きのメールを処理してみます。

サーバ側のコード

Sinatraで作ったサーバ側のコードは次のようになります。メールの件名と本文、送信元と送信先アドレスを出力しています。また、添付ファイルはテンポラリファイルとして送られてきますので、任意の場所にコピーすればOKです。

require 'sinatra'
require 'fileutils'

post '/' do
  puts "件名: #{params['subject']}"
  puts "本文(テキスト): #{params['text']}"
  puts "本文(HTML): #{params['html']}"
  puts "送信元: #{params['envelope-from']}"
  puts "送信先: #{params['envelope-to']}"
  params['attachments'].to_i.times do |i|
    attachment = params["attachment#{i+1}"]
    FileUtils.cp attachment['tempfile'], "./#{attachment['filename']}"
  end
  "success"
end

具体的なデータ構造は次のようになっています。

{
    "filter": "info@smtps.jp",
    "headers": [
      :
    ],
    "subject": "テストメール",
    "envelope-to": "info@smtps.jp",
    "server_composition": "sandbox",
    "html": "<div dir=\"ltr\">これはテストのメールです。<div>...</div></div>",
    "text": "これはテストのメールです。\r\n\r\n--\r\n...",
    "envelope-from": "admin@smtps.jp"
}

添付ファイルはattachmensに添付ファイルの数、attachment1、attachment2にそれぞれ添付ファイルの内容が入ってきます。構造は次のようになります。

  • attachments
  • attachment1
    • filename
    • type
    • name
    • tempfile
    • head:
      • Content-Disposition
      • filename
      • Content-Type
      • Content-Transfer-Encoding

Webhookの結果は管理画面で確認

Webhookでデータが送信されたログは管理画面で確認できます。送信時のAPIキー設定など、HTTPヘッダーを編集するといった機能も用意されていますので、運用に応じて細かなカスタマイズが可能です。

f:id:moongift:20200227212832p:plain
Webhookログ

画像は添付ファイルになりません

メールの添付ファイルとしてはZipファイルやJSONファイルなどは送れたのですが、画像を添付しても添付ファイルとして認識されなかったので注意してください。

まとめ

メールと連携したシステムはよくあります。通常、メールサーバを立てて、その中で処理することが多いのですが、メールサーバが落ちてしまうとシステムが稼働しなくなったり、メール文面の解析が煩雑でした。Customers Mail Cloudを使えばそうした手間なくJSONで処理できて便利です。

受信サーバ | Customers Mail Cloud