8

私は craigslist の匿名メールと同じことをしようとしていますが、Rails を使えば、これも安価です。メールにヘッダーを追加できることは私にとって重要です。これが、基本的なメール転送が機能しない理由です。

私が考えた 1 つの方法は、SMTP サーバーでした。POP/IMAP 経由で電子メールを読むときはいつでも、適切な FROM アドレスを使用して電子メールの真の受信者に電子メールを送信し、ヘッダーに追加します。これは機能しますが、SMTP サーバーは比較的高価です。

もう 1 つの方法は、メールを転送/リダイレクトすることですが、その間にヘッダーを追加します。ただし、これを行うためのサービスや宝石が見つかりません。

「Email Piping」とだけ言わないでください。これは実際にはメールを Rails プログラムに送ることを意味するからです。メールを受け取った後、何をしますか? 実際にどのように転送しますか。

何か案は?

4

2 に答える 2

13

システム管理者が制御できる MX サーバーのあるドメインを使用する電子メール アドレスが必要です。これは、プライマリ ドメインのサブドメインである可能性があります。次に、その電子メールを Rails にパイプするように MTA ソフトウェア (Exim、Postfix ... できれば qMail ではない!) を構成します。

http://guides.rubyonrails.org/action_mailer_basics.html#receiving-emails

Rails アプリケーション自体と同じサーバーに MTA がインストールされていない場合は、電子メールをアプリに POST するという行に沿って何かを行う小さなアドホック フォワーダー スクリプトに電子メールをパイプする必要があります。それをメーラーに渡します。

メーラーでは、すべてのヘッダー、本文、添付ファイルなどにアクセスできます。件名または返信先アドレスに一意の識別子を入力すると、メールを転送するためにどのメーラーをインスタンス化するかを決定できます。意図した受信者。

これはまだ行っていませんが、同じ理由で行う予定です。ただし、MTA の構成に慣れていない場合は、少し頭を悩ませるかもしれません。このタスクを実行できるシステム管理者はいますか?

コード レベルでは、次のようにします。

  1. ユーザー A (id = 1234) がユーザー B (id = 5678) にメールを送信します。

  2. あなたが所有している任意のアドレスから電子メールを送信しますが、次のReply-To:ように設定しますReply-To: <mail-1234-5678-abcdefabcd1234567890abcdefabcdef@usermessages.your-domain.com>

    これは、この作業の絶対的な鍵です。これには、送信者の ID、受信者の ID、および偽造を防止するためのチェックサムが含まれます。チェックサムは、各ユーザーに固有のソルトから生成でき、単純に次のとおりです。

    checksum = Digest::MD5.hexdigest("#{sender.id}-#{recipient.id}-#{sender.mailer_salt}")

  3. 「usermessages.your-domain.com」ドメイン用に設定した MX 経由で返信を受信したら、最初にTo:フィールドを解析して送信者と受信者を識別します。splitパーツを切り出すことで、送信者と受信者が誰であるかを簡単に識別できます。次に、チェックサムを生成して一致することを確認し、誰かが別のユーザーからのメールであるかのように悪意を持ってメールを送信しようとしていないことを確認します。

  4. 関与しているユーザーを特定したら、先に進み、これらの特別なReply-To:ヘッダーのいずれかを使用して別の電子メールを送信します (ID が逆になり、ダイジェストが別のソルトを使用して行われることは明らかです)。

これは非常に初歩的な例ですが、完全に機能する例です。このダイジェストは、返信が戻ってきたときに保持される場合は、好きな場所に配置できます (Reply-To:ヘッダーが適しています。一部のサービスでは、代わりに件名行が使用されます。

ユーザーがその情報を変更する(パスワードを変更する)と、チェックサムが検証されなくなるため、ソルトをユーザーのパスワードハッシュなど、ユーザーが制御するものにすることは避けます。

于 2011-05-21T02:40:23.463 に答える
4

アプリが特に複数のサーバーにまたがって拡張される場合は、メールを受信するデフォルトのRailsの方法はお勧めしません。いくつかのオプションについてここに書いたブログ投稿を見てください。

基本的な前提は、キャッチオールドメインでメールを受信したいということです。Gmailなどのサーバーからimap/pop3を使用して転送/収集するか、CloudMailinなどのサービスを使用してアプリへのメッセージの配信を処理できます。各ユーザーに一意のアドレスを指定することも、normal +disposable@domain.comなどのメッセージの使い捨て部分を使用することもできます。

次に、メールgemを使用してメッセージを検査し、必要なヘッダーを追加してメッセージを再度送信する場合にすぎません。繰り返しになりますが、配信可能性を向上させたい場合は、独自のメールサーバーを使用してこの配信を行うか、AmazonのSimpleEmailServiceなどのサービスを利用できます。

于 2011-05-21T08:22:19.810 に答える