5

現在取り組んでいるDjangoサイトは、コンテンツが更新されるとメールを送信します。

追加したい機能は、ユーザーがこれらのメールに返信できる場所、つまりトピックにコメントできる場所です。この返信は、ページ上で更新されて表示されます。

これに取り組むための良いアプローチは何でしょうか?ドロップインできるモジュールはありますか?

4

3 に答える 3

7

まず最初に、メールを受信し、その際にpython関数を呼び出すことができる必要があります。これを行うには、いくつかの方法があります。

  • Pythonの組み込みpoplibを使用して、定期的にメールボックスをチェックします
  • 一部のWebホスト、特にWebfactionでは、メールを受信したときに、mail2scriptと呼ばれるものを介してPythonスクリプトを自動的に呼び出すことができます。
  • 他のホストは、 MailgunPostmarkなどのサードパーティサービスの使用を推奨しています。それは本当にあなたのニーズに依存します。

メールを受信し、このイベントでPythonスクリプトを呼び出せるようになったら、Djangoモデルの正しいスレッドにコメントを追加するだけで簡単にできます。

ただし、この機能の構築を検討するときは、より安全にする方法も検討する必要があります(電子メールは偽造が容易なことで有名です)。ランダムな人が他の人のようにコメントを投稿できないようにする必要があります。これはそれほど簡単なことではありませんが、一意の電子メール返信IDは、かなり簡単な方法の1つです(ただし、安全性が保証されるわけではありません)。

于 2012-07-09T10:44:28.773 に答える
2

何か助けになる場合に備えて、同様のプロジェクトで作業しているときに遭遇したいくつかの基本的な問題:

メールの送信:Djangosend_mailとサブプロセスを使い始めましたが、現在はdjango-mailersend_mass_mailとcronエントリに切り替えているため、メールキューを適切に管理し、送信内容などを記録できます。便利なPinaxプロジェクト:http://pinaxproject.com/ecosystem/、通知用のものや電子メール確認用のものなど。

メールの取得:@ herman-schaafが提案するようにpoplibを使用し、さらに数分ごとにメールをチェックするためのcronエントリを使用しています。UIDLを使用してダウンロードされたすべての電子メールの記録を保持しているので、それらがすでに処理されているかどうかを確認できます。

ループに注意してください:おそらく、Fromアドレスとは異なるReturn-Pathを使用することをお勧めします。また、フラッディングを防ぐために、1回の反復でx通を超えるメールを送信するユーザー、または反復回数ごとにn通を超えるメールを送信するユーザーをブロックするチェックを配置しました。

日付と時刻datetime.now():使用する代わりに、またはtimezone.now()何分も前に送信された電子メールを受信できるため、電子メールから送信日を解析して挿入を追跡することもできます。そして、私たちがしなければならなかったように、あなたはタイムゾーンに対処しなければならないと思います。利用可能になったときにDjangoバージョン1.4に切り替えました。これにより、以前のバージョンよりもタイムゾーン対応の日時を簡単に処理できるようになり(これに関するリリースノートはこちらを参照)、対応する日時を保存するPostgreSQLと組み合わせることができます。Pinaxには、ユーザーのタイムゾーンローカリゼーションの実装を容易にするアプリもあります。

偽造メール:私たちの場合、アプリの閉鎖性のために偽造メールについては心配していませんでしたが、作成者に作成自体が通知されることを含め、更新のチケットですべての参加者に通知するので、少なくとも誰もが気付くことができます彼/彼女が偽装された場合(ユーザーが疑わしい活動を報告できる通知メールに管理者のメールアドレスを含めることができます)。

于 2012-07-10T08:56:42.860 に答える
1

ここでdjango.core.mailモジュールをチェックしてください...

from django.core.mail import send_mail

send_mail('Subject here', 'Here is the message.', 'from@example.com',
    ['to@example.com'], fail_silently=False)

または、この投稿をここでチェックアウトしてください...

于 2012-07-09T10:34:33.953 に答える