herokuでメールに送付された画像をS3へ保存してみる

Hello World!!

どうも村上です。

ある案件でherokuを使うことがありました。

herokuってすごいですよね。驚くほど簡単にアプリケーション構築できるし、ほとんど無料で使えるし。

その魅力にみせられて案件だけじゃなくて、プライベートでもちょこちょこ使ったりしています。

そこで考えたあるサービスです。

メールで写真共有!!

まぁよくあるサービスですね。。。

 

ざっとこんな感じです。

ケータイで写真を撮る
メールに添付してメール送信
あるURLにアクセスするとメール添付した写真が見れる

てな感じです。

必要なのはアプリケーションサーバーとメールサーバーです。

これを構築しようとしたら面倒です。

でもherokuなら簡単にできます。

アプリケーションサーバーはherokuを使って

メール関連はMailgunというサービスを使います。

ここらへんは増田さんのLABBLOGでわかりやすく説明されてます。

ようするにHTTP経由で受け取ったメッセージ受信したパラメータの中身を見て、添付ファイルがありそうなものを探しだしたらいいです。

Mailgunのドキュメントを参照すると添付ファイルがありそうなパラメータはattachment-xみたいですね。
受信したメールをコントローラーで受け取って中身を見てみると「attachment-1」にファイルオブジェクトがセットされているようです。
おそらく添付ファイルが複数あれば、「x」の部分がインクリメントされていくのだと思います。

あとはこれをストレージに保存したらいいんですけど。herokuにはストレージがないので、今回はAmazonのS3を使います。paperclipを使えば簡単にS3に保存ができます。

まずは、モデルから
モデルの内容は下記の通りです。

論理名 物理名
ID id
タイトル subject
ボディー body
画像名 photo_file_name
画像コンテントタイプ photo_content_type
画像サイズ photo_file_size
画像更新日 photo_update_at

 

次に、s3の設定を記述するs3.ymlをconfigに記述

 

そしてモデルにpaperclip用の記述を追加

これで準備OKです。

 

最後はコントローラが受け取った添付ファイルをモデルにセットして保存

 

これでメールに添付された写真をストレージに保存することができます。
めっちゃ簡単!!

例では「attachment-x」「1」に固定してますけど、複数添付ファイル対応するなら「attachment-count」と組み合わせてループさせるのが良いですね。

デコメが添付されてる可能性を考えると少しややこしそう。。。

でも、簡単にアプリケーションを構築できるのはすごい魅力ですし、難しい機能もherokuのadd-onを使えば簡単に実装できます。

ぜひ皆さんもherokuを使ってみて下さい。

Comments are closed, but you can leave a trackback: Trackback URL.