今回はRails6から導入された受信メールを処理することができる機能「ActionMailbox」を使ってみたので簡単にまとめてみました。メール送信処理にはActionMailerという機能がありますがメール受信処理に関する機能はなく、Rails6から入った機能がこのActionMailboxになります。Mailerを用いたメール送信機能の実装手順についてまとめています。MailerはRailsに標準で組み込まれており、アプリケーションのメイラークラスやビューでメールを送信することが可能な便利機能です。Railsでのメール送信機能の実装に役立てば幸いです。...この記事の内容ActionMailboxとはActionMailboxを使ってみる新規アプリケーションの作成ActionMailboxのインストールScaffoldで雛形を作成ルーティングの設定RepliesMailboxの作成と編集ルーティングを定数として定義discussion_idを設定アソシエーションの定義Discussionに紐づくCommentを作成テストデータの作成ビューファイルの修正メール受信のテストまとめ参考ActionMailboxとはActionMailboxとは、受信したメールをRailsアプリケーション側で処理することができる機能です。この機能はRails6から導入されました。メール送信に関する処理はActionMailerを用いて実装できていましたが、メール受信に関する処理は持ち合わせていませんでした。そこでRails6から導入されたのがこのActionMailboxになります。ActionMailboxは、以下のような主要メール配信サービスと連携することが可能です。SendgridMailgunMandrillPostmarkActionMailboxを使ってみる実際に開発環境でActionMailboxを実装してみます。今回はメールを返信することでコメントを返すことができる機能を実装してみます。(このアプリケーションの元ネタは以下になります。以下のコマンドで新規アプリケーションを作成します。action_mailbox:installコマンドを打ち込むことで、設定ファイルであるapplication_mailbox.rbとマイグレーションファイルが生成されます。FROM=active_storage,action_mailboxScaffoldで雛形を作成Scaffoldの機能を用いて、User・Discussion・Commentに関する雛形を作成します。同時にマイグレートも行います。db:migrate時に以下のようなエラーが発生した場合、database.ymlのencodingをutf8に編集することでエラーは発生しなくなります。/tmp/mysql.sock【Rails】秒速でアプリケーション開発できるscaffoldの使い方を簡単にまとめてみた手っ取り早くアプリケーションを開発することができるscaffold(スキャフォールド)の使い方について簡単に解説しています。新しい機能実装をテストしてみたい、すぐにでもアプリケーションを立ち上げたいといった場合に便利な機能なので、ぜひ覚えておきましょう。...マイグレート後のUser・Discussion・Commentに関するスキーマ(schema.rb)は以下のようになっています。falseendルーティングの設定application_mailbox.rbを以下のように編集します。:repliesendこれにより、受信したメールアドレスURLがreply-ADJXWIDJ@reply.example.comのような形式だった場合にreplies_mailbox.rbに処理が移行するようになります。application_mailbox.rbには受信メールのルーティングを記載します。application_mailbox.rbが以下のような記述で、受信したメールアドレスURLが/somethingだった場合、somewhere_mailbox.rbへ処理が移行します。:somewhereendapplication_mailbox.rbが以下のような記述だった場合、メールを受信するとall_mailbox.rbへ処理が移行します。:allendapplication_mailbox.rbが以下のような記述で、受信したメールアドレスURLがreply+AsdsSDa@reply.github.comのような形式だった場合、replies_mailbox.rbへ処理が移行します。RubularRepliesMailboxの作成と編集RepliesMailboxを以下のコマンドで作成します。test/mailboxes/replies_mailbox_test.rb作成されたRepliesMailboxを以下のように編集します。endendメールを受信するとRepliesMailboxのprocessメソッドが呼ばれ、この中でメール受信時の処理が行われます。endendprocessメソッドの中ではユーザーを検索し、ユーザーがいなければreturnしています。(mail.fromでメール送信者のメールアドレスを取得することができます。endenddiscussionとdiscussion_idメソッドは後に使用します。endendルーティングを定数として定義application_mailbox.rbに定義したルーティング(正規表現の部分)を、定数としてreplies_mailbox.rbに定義します。endenddiscussion_idを設定replies_mailbox.rbを以下のように編集します。endendメール情報は以下のようなメソッドを使用して取得することができます。https://github.com/mikel/mailアソシエーションの定義DiscussionとCommentは1対多の関係になるため、アソシエーションを定義します。:commentsendDiscussionに紐づくCommentを作成replies_mailbox.rbを以下のように編集します。endendmail.recipientsで受信メールのTO(宛先)を配列で受け取ることができます。["reply-1@reply.example.com"]これにより、メールを受信し該当ユーザーが見つかった場合はコメントを返すことができるようになります。テストデータの作成サーバーを起動し、UserとDiscussionに関するテストデータを手動で作成します。shttp://localhost:3000/users/newとhttp://localhost:3000/discussions/newにアクセスし、それぞれテストデータを1つずつ作成しましょう。Userの作成Discussionの作成ビューファイルの修正app/views/discussions/show.html.erbを以下のように編集しましょう。%>app/views/comments/_comment.html.erbを以下のように編集します。</p></div>メール受信のテスト開発環境ではメール受信が行われるとコンダクター(conductor)コントローラがマウントされるようになっています。コンダクターコントローラは、システム内にあるすべてのInboundEmailsのインデックスや処理のステートを提供し、新しいInboundEmailを作成するときのフォームも提供します。Mailboxをdevelopment環境で使うhttp://localhost:3000/rails/conductor/action_mailbox/inbound_emails/newにアクセスすることでメール入力フォームが表示され、メール受信時の挙動を確認することができるためアクセスしてみましょう。email)をクリックします。reply-(.+)@reply.example.com/i形式を設定したため、reply-1@reply.example.comのようなメールアドレスをToに打ち込みましょう。メールが送信されると以下のようなページが表示されます。sourceには受信したメールの内容が記載されます。http://localhost:3000/discussions/1にアクセスすることで、メール受信時のユーザー名とメール本文がコメントに表示されていることが確認できます。6今回はRails6から導入された受信したメールを処理することができる機能「ActionMailbox」について簡単にまとめました。メール送信のActionMailer同様、簡単にメール受信に関する実装ができたのでメール周りの実装はこれで大丈夫そうですね。yoshi19941117TechTechMedia【Rails】配列の共通要素を取得するintersectionメソッドに...【Rails】暗号化技術をLockboxからActiveRecordEn...Railsエンジニアちばよしはる銀座にあるヘルステック企業のRailsエンジニア。初心者から中級者向けに記事を更新しています。お酒とカレーと競馬が好き。TechTechMedia。