Rails Action Mailbox を使用した受信メールの統合とトラブルシューティングをマスターする
メールの送受信に関する RFC (Request for Comments) に目を通したことがあれば、メールの受信トレイで [送信] をクリックするときに技術的に複雑な問題が発生することがわかるでしょう。
ありがたいことに、多くの既存ツールは、開発者が管理する Postfix サーバーから、SendGrid、Amazon SES、Postmark などの完全にスケーラブルな送信サービスに至るまで、Simple Mail Transfer Protocol (SMTP) サービスを提供しています。ただし、配信性や価格設定の理由でプロバイダ間を移動することは、各サービスの特性に合わせてアプリを書き直すかリファクタリングすることを意味します。
Rails は Action Mailbox を提供することでここで役に立ちます。この投稿では、Action Mailbox を使用して受信メールを統合し、トラブルシューティングを行う方法について詳しく説明します。
その前に、アクション メールボックスとは何かを簡単に定義しましょう。
Rails 用の Action Mailbox とは何ですか?
Action Mailbox は、Ruby on Rails で電子メールを受信するために概念的な圧縮を使用します。概念的な圧縮とは、すべての SMTP サービス間の小さな違いをすべてカプセル化し、受信処理コードを 1 回だけ記述することを意味します。新しいサービスのプロバイダーを作成することもできます。
ActionMailbox の重要な概念は、電子メール受信者に基づいたルーティングです。受信メールプロバイダーを設定すると、ドメインに送信されるメールがアプリにルーティングされます。受信者のアドレスを確認して、各メール メッセージをどのように処理するかを決定できます。
ここで示したように、Rails conductor アクションを実行してテスト電子メールを送信すると、次のようになります。

この場合、受信メールの受信者は To になります。 、CC 、BCC 、および X-Original-To フィールド。
各アドレスはどこにルーティングされるかを決定するためにテストされますが、メール メッセージは 1 回だけルーティングされます。
開発の重要な側面の 1 つは、システムからの電子メールを実際にテストすることです。 Rails には、ルート /rails/conductor/ の下に一連の開発ページがあります。 これにより、開発セットアップにローカルで電子メールを入力できるようになります。
上の例のように電子メールを手動で入力することも、すべてのヘッダーを含む電子メールをアップロードすることもできます。
完全な電子メール (ヘッダー、メッセージ本文、添付ファイルを含む) を取得する優れた方法は、Thunderbird などの電子メール クライアントを使用することです。個々のメールを .eml に保存します 、テキスト エディタでファイルを開き、内容全体をコンダクター ページにコピーします。
これで、より複雑な電子メール処理をテストできるようになりました。
Rails アプリのデモの投稿とコメント
これがどのように機能するかを示すための小さなデモを作成してみましょう。私は 37Signals の大ファンで、特に Hey World でのブログが好きです。ただし、コメントは許可されていないため、各ブログ投稿のコメントを含むクローンを作成しましょう。
この投稿のコードに従ってください。
新しいアプリを作成します (私は Tailwind CSS を使用していますが、自分に合ったものを選択できます)。 Post のアクション テキストも追加します。 と Comment モデル。
スキャフォールディングにより、投稿とコメントを簡単に確認できるようになります。 post.rb に関連付けを追加します 、投稿には関連するコメントが表示されます:
posts/_post.html.erb で 、部分的にコメントを追加してみましょう:
投稿とコメントのビューがまばらになりました。ブログに投稿するための受信メールを設定します。
これにより、ApplicationMailbox が生成されます。 。 blog@ のすべてを受信できるようにルートを設定します。 投稿メールボックスに移動し、投稿を作成します。
http://localhost:3000/rails/conductor/action_mailbox/inbound_emails に移動すると、これを簡単にテストできます。 そしてあなたのサービスにいくつかの電子メールを送信します。 blog@whatever.com に何かを送信すると 、メールはアプリの受信箱に配信されるはずです。他のアドレスにメールを送信すると、メッセージは返送されます。
ポストメールボックスでメールを受信
メールを受信してブログに投稿できるように、投稿メールボックスを設定しましょう。各メールボックスは元の inbound_email にアクセスできます。 と mail オブジェクト。 InboundEmail は、mail のラッパーです。 レール全体で使用されるクラス。
私たちの目的では、電子メールの送信者、件名、本文に興味があります。これらを抽出して Post を作成できます。 この記録はブログのトップページに表示されます。
ブログ アドレスに別の電子メールを送信し、インデックス ページを更新します。投稿が表示されるはずです。
次に、投稿にコメントを追加します。まず、電子メールのコメント投稿者は、電子メールを送信するときに正しい投稿を参照する必要があります。これを行う簡単な方法は、受信メール アドレスの投稿 ID をエンコードすることです (comment+123@whatever.com など)。 、ここで、電子メール アドレスの 123 は Post 要素を指します)。
CommentMailbox を生成します :
comment+123 を含む電子メールを送信するためのルートをアクション メールボックスに追加します。 CommentMailbox へ :
_post.html.erb 内 、リンクを追加してメール アドレスを生成すると、他のユーザーがメール アプリを開いてメールを送信できるようになります。
受信メールは CommentMailbox にルーティングされます。 そして解析されて、正しいブログ投稿に添付されたコメントになります。
process メソッドは、電子メール本文と送信者の電子メールからコメントを作成します。 Post を参照します。 post でクエリされる 方法。このメソッドは、最初の受信者の電子メール アドレスを取得し、正規表現を使用して投稿 ID を取得します。
Post の場合 存在しないか、トークンを解析できない場合、メールは返送され、処理が停止します。
次に、Rails conductor フォームに移動し、各投稿のアドレスにコメントを送信します。コメントはインデックス ページの投稿の下に表示されます。
アクション メールボックスを使用したより複雑な例
メールというのは実はとても複雑なのです。アプリケーション監視ツールをセットアップし、このようなものをアプリにデプロイすると、APM ダッシュボードにエラーが表示され始めると想像してください。
解析エラーが発生したり、投稿やコメントに奇妙なフォーマット エラーが多数含まれたりする可能性があります。
アプリは HTML 電子メールを受信し、生の本文ソースを取得して Web サイトに投稿します。 mail gem を使用すると、受信メールに HTML 本文があるかどうかを確認でき、メッセージから必要な部分を取り出すことができます。
CommentMailbox を変更しましょう と PostMailbox マルチパートのメールをチェックして HTML 部分を取り出し、それが唯一残っている場合はテキストに戻ります。
各メールには部分がないか、複数の部分があります。推奨される順序は、HTML 部分があるかどうかを確認してそれを使用し、ない場合はテキスト部分を取得して使用することです。解析された HTML セクションやテキスト セクションがない場合は、以前と同様にメール本文を使用します。
PostMailbox は少し複雑になりました:
CommentMailbox には別の処理メソッドもあります:
これで、誰かの携帯電話からのメールを処理できるようになりました。
Rails アプリにアクション メールボックスを追加する
Action Mailbox のおかげで、電子メールを Rails アプリのもう 1 つの I/O 手段として考えることができます。概念的な圧縮を使用すると、電子メール サービス プロバイダーに依存せずにコードを作成できます。基盤となるインフラストラクチャについて心配する必要がないため、最小限の作業でメール プロバイダを移行することもできました。
AppSignal などの APM ツールは、すべての送信 ActionMailer を監視し、配信可能性を監視するための便利なダッシュボードも提供します。
以下は、大量のメールを送受信するアプリの 1 つを示す例です。

これにより、アプリ内で何が起こっているかをより詳細に把握できるようになります。
まとめ
この投稿では、最初に Action Mailer for Rails の機能を定義しました。次に、受信メールを統合し、解析してブログの投稿を作成するデモ プロジェクトを設定しました。
これがお役に立てば幸いです。コーディングを楽しんでください!
追記Ruby Magic の投稿を報道後すぐに読みたい場合は、Ruby Magic ニュースレターを購読して、投稿を 1 つも見逃さないようにしてください。
ジョン・ビーティ
私たちのゲスト著者である John は、2010 年に iPhone アプリ用の API を構築するために Rails を学びました。彼は今もそのことを振り返っていません。彼は現在、高校生にプログラミングを教え、学校用のカスタム ソフトウェアを構築し、ブログを書いています。
John Beatty によるすべての記事
-
Rubyスレッドの使用方法:わかりやすいチュートリアル
Rubyのスレッドとは何ですか? スレッドにより、Rubyプログラムは同時に複数のことを実行できます。 次のようなもの : 複数のファイルを読み取る 複数のウェブリクエストの処理 複数のAPI接続を確立する スレッドを使用した結果、マルチスレッドのRubyプログラムが作成され、作業をより迅速に行うことができます。 しかし、1つの警告… Rubyアプリケーションを実行するデフォルトの方法であるMRI(MatzのRuby Interpreter)では、 i/oバウンドアプリケーションを実行する場合にのみスレッドの恩恵を受けます。 。 この制限は、 GIL(グローバルインタープリター
-
GCE、クラウドストレージ、PubSubを使用してRubyで稼働時間監視システムを構築する
稼働時間の監視には、Webサイト、API、およびサーバーの可用性のチェックが含まれます。モニターは、指定された間隔内で特定のエンドポイントをプローブして、それが使用可能かどうかを判別します。目標は、システムのSLAで指定されているように、契約レベルの可用性を達成し、契約が満たされていない場合の違いを判断することです。 この記事では、Prometheusblackbox_exporterに基づく稼働時間監視システムを構築します。カスタムHTTP監視システムを構築するのは簡単かもしれませんが、エクスポーターの周りにラッパーを構築することで、他の多くのプローブ手法にアクセスし、システムの他の要素を