Upgrade to Pro — share decks privately, control downloads, hide ads and more …

20191024_出張!Railsウォッチ in 銀座Rails#14

Masato Mori
October 24, 2019

20191024_出張!Railsウォッチ in 銀座Rails#14

2019/10/24に銀座Rails#14で発表したスライドです。
https://ginza-rails.connpass.com/event/146559/
週刊Railsウォッチ: https://techracho.bpsinc.jp/tag/%e9%80%b1%e5%88%8arails%e3%82%a6%e3%82%a9%e3%83%83%e3%83%81

Masato Mori

October 24, 2019
Tweet

More Decks by Masato Mori

Other Decks in Programming

Transcript

  1. About Me • 森 雅智︓ @morimorihoge • BPS株式会社でRailsの受託開発チームをやってたり、週1大学非常勤 でWeb開発を教えてたりします •

    Ruby/Rails歴は8年くらい。Web開発は14年くらい • 銀座Ralis #10でActiveRecordでVIEWを使おうという話をしました About BPS & TechRacho • Web受託開発や電子書籍製品開発をやっている会社です • TechRachoという自社技術Blogを運営しています ◦ 3年ほど前から平⽇毎⽇更新してます ◦ https://techracho.bpsinc.jp/ • お仕事相談、転職相談、TechRachoへのご意⾒など気軽にどうぞ ◦ https://www.bpsinc.jp/ 2
  2. @hachi8833(TechRacho編集部) • 八田昌三(はったしょうぞう) ◦ TechRacho記事執筆・編集・翻訳(2016.08〜) ◦ サイトメンテナンス ◦ ローカライズ業界出身 ◦

    好きなもの: 正規表現/Go/Ruby/Gobyなど多数 • やってきたこと ◦ Railsチュートリアル翻訳・翻訳ディレクション ◦ Railsガイド翻訳 ◦ Goby言語メンテナー 4 ※今日はお休み
  3. Rails 6の試し方 環境を汚したくなければDockerで手軽にお試しできます 7 $ docker pull ruby $ docker

    run --rm -it ruby bash root@392debe154fd:/# gem install rails Fetching thread_safe-0.3.6.gem Fetching tzinfo-1.2.5.gem Fetching zeitwerk-2.1.9.gem Fetching rack-2.0.7.gem ...(略)... Successfully installed sprockets-3.7.2 Successfully installed sprockets-rails-3.2.1 Successfully installed rails-6.0.0 40 gems installed root@392debe154fd:/# rails -v Rails 6.0.0 今回の前提動作環境 ・OS: Amazon Linux v1 ・Ruby 2.6.5(rbenv) ・Rails 6.0.0 ・MySQL 8.0.18(docker)
  4. メール受信トリガで何がうれしい︖ • ユーザーからのメール返信をトリガにした処理が実装できる ◦ プロジェクト管理システムなどで、チケットの更新通知メールにメールで返信するとそのま まチケットに返信を付けることができる ◦ 注︓beforeスマートフォン時代には割と良くある機能でした • 所定メールアドレスへの添付ファイル送信をトリガにした処理が実装できる

    ◦ 既存レガシシステムにCSVデータのメール送信機能などがあれば、送信先アドレス変更だけ で改修せずに利⽤できる(その昔AS/400とののシステム連携でやったことがあります) ◦ 特定バッチ実⾏⽤のメールアドレスを⽤意し、そこにメールを送ったら実⾏するといったこ とができる • メーリングリストのような機能がRailsで実装できる ◦ 既に存在するアプリケーションのユーザー・グループ情報をそのまま使うことができる ◦ そのままforwardするだけでなく、ユーザー別にNGワードをマスクしたり、テンプレートメ ール送信のようなことも実装すればできる(本文をRailsで普通に処理できる) 9
  5. Action Mailboxが対応するメール受信環境(ingress) • Exim/Postfix/Qmail ◦ 自前でMTAを⽤意するならこの辺り ◦ MTAサーバーでRailsコマンドが動作できるようにする必要がある(コードのdeploy対象がメ ールサーバーまで波及する) ◦

    `actionmailbox/lib/tasks/ingress.rake` あたりを見ながら拡張すれば、他の一般的なMTAにも拡 張できそう(いわゆる/etc/aliasesや.forward相当のcommand pipe機能があれば動かせそう) • Mailgun / Mandrill / Postmark / SendGrid ◦ 受信メールをWebhookする機能を持つAPI系サービス達 ◦ ここにないものに対応したければ、 `actionmailbox/app/controllers/action_mailbox/ingresses` あたりを見て実装すれば動かせそう 10
  6. ActionMailboxのルーティング メールアドレスベースでルーティングができるようになっている 12 app/mailboxes/application_mailbox.rb 上記の場合、 • ForwardsMailbox << ApplicationMailbox •

    BouncerMailbox << ApplicationMailbox • AnyMailbox << ApplicationMailbox をそれぞれ定義し、内部処理を当該Mailbox#processに記述していく
  7. Mailbox#process • ApplicationMailboxを継承したMailboxクラスを作成し、#processに処 理を実装する • #processではmail変数に受信したメールが入っている ◦ 実体はmail gem(mikel/mail)のMail::Messageオブジェクト ◦

    各種ヘッダの取り出しや、添付ファイルの切り出しが可能 • #process内はRailsのModelなどにもアクセスしつつ、任意のコードが書け る ◦ before / after hookなども書けるので、よしなにコードが書ける 13
  8. Demo • 試しに以下のメールアドレスでAction MailboxのRailsサーバーを接続してみ ました ◦ *@mailbox.morimorihoge.dev ◦ MTAはSendgridを利用しています •

    実際に動いているので送信してみます ◦ 今はメール受信するとFromアドレスにメッセージを返す実装になっています。試したい人が いればどうぞ ◦ ※Relay踏み台にされ得る実装なので、今日明日くらいで止めると思います。別途動き見た いなどあれば個別に相談ください 19
  9. ActionMailbox触ってみた感想 • 普通に動く、かつ全部Railsにまとめられるというのはシンプル ◦ RailsのModelやHelperにメールhook処理が直接アクセスできるのは楽 • ActiveStorage、対応MTA・メールサービスとの結合など依存するものがや や多い ◦ これはまあやろうとしていること的に仕方ないのはある

    • そもそも令和の時代にメール受信をHookにした処理を書くニーズがどれだ けあるかはわからないが、もし必要なら使えば良いと思う ◦ 業務アプリケーション開発では思わぬ縛りプレイが課されることがあるので、手札は多いほ うが良い ◦ Rails5以下でやりたければ自⼒で移植するなり、自前で仕組みを⽤意すれば良い ▪ 簡単なものなら普通に.forwardとrails runnerで書けます • 保存しているメールはデフォルトで30日で削除するIncinerationJobもデフ ォルト搭載されており、とりあえず使い始められそう 21
  10. Action Mailboxで実装に悩みそうな所(妄想) • ある特定のModelに対する処理をさせたいとして、どこに引数相当のものを 埋め込むか︖ ◦ メールアドレスにIDを埋め込む︖Routingとしては正しそうではある ▪ [email protected] とか

    ▪ 世の中のMUAは⼀度送信した宛先メールアドレスをアドレス帳に自動追加するので、 ユーザーから⾒ると不便かも・・・ ◦ 特定のメールへの返信ということなら、In-Reply-ToにあるMessage-IDで判別する︖ ▪ 返信元メールを送信したときのMessage-IDを保持しておけばなんとかなりそう︖ ▪ しかし、世の中の全てのMUAやMTAでうまくいくかは謎 • SPAMブロック系のアプライアンスなどがMessage-IDを付け直したりしていると 動かなくなりそう • 受信するメール本文から特定文言を抜き出したいとき ◦ HTMLメールだったりEncodingが特殊な文字コードだったり、添付ファイル付きだったりの 可能性 ◦ メールはHTTP POSTと違ってかなり仕様がフリーダムなので、環境依存しそう 22 業務システムやB2Cシステムで重要な機能として使うには注意が必要そう ※おまけ・隠し機能程度ならひっそり実装してみるのは悪くないかも︖
  11. 宣伝︓週刊Railsウォッチ 公開つっつき会 • 毎月第一木曜⽇、社外の方も参加できる公開つっつき会 を開催してます ◦ 次回は2019/11/14(木)19:30〜@⻄新宿 BPS会 議スペースにて ▪

    ※RubyWorld Conferenceのため第二木曜になり ます • TechRachoの週刊Railsウォッチの最新記事、または「週 刊Railsウォッチ公開つっつき会」でぐぐってTECH PLAY から君もエントリー︕ ◦ https://techplay.jp/event/756269 25