Slide 1

Slide 1 text

出張︕Railsウォッチ in 銀座Rails#14 森 雅智 / @morimorihoge 2019/10/24 1

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

Railsウォッチとは︖ 技術ブログTechRachoで毎週連載しているRails / Ruby界 隈を中心とした雑多な情報を提供する技術雑談マガジン 3

Slide 4

Slide 4 text

@hachi8833(TechRacho編集部) ● 八田昌三(はったしょうぞう) ○ TechRacho記事執筆・編集・翻訳(2016.08〜) ○ サイトメンテナンス ○ ローカライズ業界出身 ○ 好きなもの: 正規表現/Go/Ruby/Gobyなど多数 ● やってきたこと ○ Railsチュートリアル翻訳・翻訳ディレクション ○ Railsガイド翻訳 ○ Goby言語メンテナー 4 ※今日はお休み

Slide 5

Slide 5 text

これまでの出張Railsウォッチのピックアップテーマ ● Rails6新機能特集 ○ 銀座Rails#12: 複数DB対応 ○ 銀座Rails#13: ActionText、Trix ○ というわけで 5

Slide 6

Slide 6 text

Rails6 新機能紹介 Action Mailbox編 6

Slide 7

Slide 7 text

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)

Slide 8

Slide 8 text

Action Mailbox ● Railsでメール受信をトリガに処理を実⾏するcontrollerライクな機能 ● ※Action Mailerはメール送信、Action Mailboxはメール受信 8

Slide 9

Slide 9 text

メール受信トリガで何がうれしい︖ ● ユーザーからのメール返信をトリガにした処理が実装できる ○ プロジェクト管理システムなどで、チケットの更新通知メールにメールで返信するとそのま まチケットに返信を付けることができる ○ 注︓beforeスマートフォン時代には割と良くある機能でした ● 所定メールアドレスへの添付ファイル送信をトリガにした処理が実装できる ○ 既存レガシシステムにCSVデータのメール送信機能などがあれば、送信先アドレス変更だけ で改修せずに利⽤できる(その昔AS/400とののシステム連携でやったことがあります) ○ 特定バッチ実⾏⽤のメールアドレスを⽤意し、そこにメールを送ったら実⾏するといったこ とができる ● メーリングリストのような機能がRailsで実装できる ○ 既に存在するアプリケーションのユーザー・グループ情報をそのまま使うことができる ○ そのままforwardするだけでなく、ユーザー別にNGワードをマスクしたり、テンプレートメ ール送信のようなことも実装すればできる(本文をRailsで普通に処理できる) 9

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

Action Mailboxの仕組み 11 Webhook系サービスの場合 自前MTAの場合

Slide 12

Slide 12 text

ActionMailboxのルーティング メールアドレスベースでルーティングができるようになっている 12 app/mailboxes/application_mailbox.rb 上記の場合、 ● ForwardsMailbox << ApplicationMailbox ● BouncerMailbox << ApplicationMailbox ● AnyMailbox << ApplicationMailbox をそれぞれ定義し、内部処理を当該Mailbox#processに記述していく

Slide 13

Slide 13 text

Mailbox#process ● ApplicationMailboxを継承したMailboxクラスを作成し、#processに処 理を実装する ● #processではmail変数に受信したメールが入っている ○ 実体はmail gem(mikel/mail)のMail::Messageオブジェクト ○ 各種ヘッダの取り出しや、添付ファイルの切り出しが可能 ● #process内はRailsのModelなどにもアクセスしつつ、任意のコードが書け る ○ before / after hookなども書けるので、よしなにコードが書ける 13

Slide 14

Slide 14 text

インストールと実⾏(1) ※Edge Ralis Guideの通りにやれば動きます 14 ActiveStorageが依存しているので自動的に入る

Slide 15

Slide 15 text

インストールと実⾏(2) 15 ingress = MTA種別の設定 ingress接続⽤パスワード ※Webhookの際の認証に使う config/environments/#{RAILS_ENV}.rb config/credentials.yml.enc (rails credentials:edit で編集)

Slide 16

Slide 16 text

インストールと実⾏(3) この時点で この時点で この時点で この時点でActionMailboxの管理画面が見られるようになる の管理画面が見られるようになる の管理画面が見られるようになる の管理画面が見られるようになる http://RAILS_HOST/rails/conductor/action_mailbox/inbound_emails 16 ingressの設定がされていなくても、こ こから直接メール本文相当のデータを 流し込んでテストできる

Slide 17

Slide 17 text

インストールと実⾏(4) mailboxの作成は rails generate mailbox #{NAME} 17

Slide 18

Slide 18 text

インストールと実⾏(5) Mailboxの定義ができたらApplicationMailboxにroutingを書いて接続する 18 app/mailboxes/application_mailbox.rb

Slide 19

Slide 19 text

Demo ● 試しに以下のメールアドレスでAction MailboxのRailsサーバーを接続してみ ました ○ *@mailbox.morimorihoge.dev ○ MTAはSendgridを利用しています ● 実際に動いているので送信してみます ○ 今はメール受信するとFromアドレスにメッセージを返す実装になっています。試したい人が いればどうぞ ○ ※Relay踏み台にされ得る実装なので、今日明日くらいで止めると思います。別途動き見た いなどあれば個別に相談ください 19

Slide 20

Slide 20 text

関連テーブルに入っている⽣データの例 20

Slide 21

Slide 21 text

ActionMailbox触ってみた感想 ● 普通に動く、かつ全部Railsにまとめられるというのはシンプル ○ RailsのModelやHelperにメールhook処理が直接アクセスできるのは楽 ● ActiveStorage、対応MTA・メールサービスとの結合など依存するものがや や多い ○ これはまあやろうとしていること的に仕方ないのはある ● そもそも令和の時代にメール受信をHookにした処理を書くニーズがどれだ けあるかはわからないが、もし必要なら使えば良いと思う ○ 業務アプリケーション開発では思わぬ縛りプレイが課されることがあるので、手札は多いほ うが良い ○ Rails5以下でやりたければ自⼒で移植するなり、自前で仕組みを⽤意すれば良い ■ 簡単なものなら普通に.forwardとrails runnerで書けます ● 保存しているメールはデフォルトで30日で削除するIncinerationJobもデフ ォルト搭載されており、とりあえず使い始められそう 21

Slide 22

Slide 22 text

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システムで重要な機能として使うには注意が必要そう ※おまけ・隠し機能程度ならひっそり実装してみるのは悪くないかも︖

Slide 23

Slide 23 text

Action Mailboxまとめ ● メール受信をトリガに何かさせたいというときには利⽤可能な選択肢 ○ Railsと密結合していることで、ビジネスロジックを駆動したりアプリケーションデータが参 照できるメリットは強い ● セットアップには外部サービスや自前MTAの設定も必要になるので、多少イ ンフラの知識が必要になる ● Action Mailer自体のコードベースはそれほど大きくないので、もし実運⽤で 使ってみたい⼈はまずは動かしてみつつ、ソースも追いかけてみるのが良い と思います 23

Slide 24

Slide 24 text

NEWS! Ruby 2.7-preview2リリース ● もうクリスマスが近づいてきましたね ○ https://techracho.bpsinc.jp/hachi8833/2019_10_23/82244 ● 新機能系もありますが、キーワード引数に関するRuby 3.0で予定されている breaking changesに引っかかる記法がwarningになるなど、要チェック 24

Slide 25

Slide 25 text

宣伝︓週刊Railsウォッチ 公開つっつき会 ● 毎月第一木曜⽇、社外の方も参加できる公開つっつき会 を開催してます ○ 次回は2019/11/14(木)19:30〜@⻄新宿 BPS会 議スペースにて ■ ※RubyWorld Conferenceのため第二木曜になり ます ● TechRachoの週刊Railsウォッチの最新記事、または「週 刊Railsウォッチ公開つっつき会」でぐぐってTECH PLAY から君もエントリー︕ ○ https://techplay.jp/event/756269 25

Slide 26

Slide 26 text

次回以降もブラッシュアップしていきます 感想・リクエストなどあればTwitter #ginzarails @morimorihoge @hachi8833 までお声かけください 26