Django DB Mailer-プロジェクトでメールメッセージを送信するためのシンプルで便利なバッテリー

大部分のプロジェクトでは、クライアント/管理者/部門のメールアドレスにメッセージを送信します。 ファイルシステム上にテンプレートを作成し、信号を設定し、レンダリングと送信に頻繁に複製されるコードを使用するのは、どれほど面倒なことです。

最終的に、バックグラウンドの送信、送信者の変更、優先順位付け、失敗した場合のメッセージの再送信、クライアント/マーケティング担当者の要求に応じた編集、製品の使用方法または標準文書の形式でレターに標準ファイルを添付するタスクが発生します。クライアント、転送などに関するレポート。

大規模なプロジェクトでは、リファクタリング時に重要度の低いテンプレートの編集に時間を浪費しないように、新しいコンテンツとの混乱を避けるため、または古いテンプレートを使用する場合に、フィルタリングのためにテンプレートをカテゴリに視覚的に分割することがしばしば必要です。

このようなソリューションには、これらの問題のほとんどを解決し、不要なコード、メンテナンス、手間を省くために設計されたシンプルなバッテリーがあります。



django-db-mailerは、電子メールメッセージ、ニュースレター、保留中の通知を送信するためのオープンで使いやすいバッテリーです。 特別な知識やカスタム設定は必要ありません。 パッケージをインストールし、 Redisと連携してCeleryキューイングシステムを設定するだけで、クリエイティブな作業を開始できます。

すぐに使えるバッテリーは何ができますか?


1.手紙を送るためのシンプルで便利な機能的インターフェース。
2.指定されたキューで作業します(プロジェクト内のすべてが異なるサーバーとワーカーに分割される場合に必要)。
3.失敗した場合にメッセージを再送信する機能(データベースおよびコードで試行回数を設定することが可能です)。
4.タイムアウト
5.ロギング(どのメッセージが正常に送信されたか、失敗したかを常に確認できます。ユーザーからの苦情を調査するときに役立ちます)。
6.カテゴリ(異種テンプレートのクイックフィルタリング。アプリなどによるカタログ化など)。
7.受信者グループ(会社内の部門に分割し、管理パネルで受信者アドレスを設定するのに便利です)。
8.シグナル(イベントpost_save / pre_saveなどのメッセージの送信は、管理パネルで直接設定されます)。
9.メッセージの送信の遅延(すべての種類のプロモーション、およびビューでトランザクションを使用する場合に適しています)。
10.モデル内のフィールドのビルトインブラウザー(使用可能なフィールドを表示するためにコードに移動する必要はありません。ドラッグしないでください。コード自体には移動しません)。
11.優先順位付けシステム(DB /コードでメッセージの優先順位を設定する機能)。
12.管理パネルでテンプレートを直接編集します(サポート、マネージャー向け-それだけです。プログラマーの時間はかかりません)。
13.テンプレートはキャッシュされます-メッセージが送信されるたびに、データベースへの呼び出しはありません(テンプレートと設定はキャッシュから読み取られるため、データベースの負荷が軽減されます。バックエンドはあなたの好みです)。
14.ビジュアルエディターTinyMCE / CKEditor(オプション)。
15.テンプレートの変更のバージョン管理。 いつでもロールバックできます(それなしではできない場合があります)。
16.バッテリーのローカライズロシア語/英語。
17.管理パネルから直接メッセージをテストします(テンプレートを作成し、現在のユーザーのメールボックスですぐにサンプルを取得することが可能です)。
18.すぐに使用できる、人気のdjango-grappelliテーマがサポートされています。
19.文字のタイプhtmlおよびテキスト(テンプレートのタイプを指定する機能)。
20. jungaのメーラーのすべての組み込み機能を使用する機能。
21. Bcc-すべての文字を指定したアドレスに複製できます(テキストでのログ記録に便利です。デフォルトでは、セキュリティ上の理由から、文字の本文はデータベースに記録されません)。
22. API-他の言語/プラットフォームのアプリケーションとのコラボレーション用。
23.各テンプレートの「差出人」フィールドを設定する機能(複数の部門がある場合に役立ちます。別の部門に責任を移す場合に特に便利です)。
24.受信者のSMTP設定(レターを送信するためにさまざまなsmtpサーバーを構成できます)。
25.標準ファイル(さまざまな挿入、ドキュメント、指示を管理パネルで直接)を添付します。
26.ローカライズされたサイトの多言語パターン(多言語サイトの1つのパターン。ロケールに応じて、メッセージ言語が選択されます)。
27.アラートの無効化/有効化(デバッグに便利、または会社のプロモーションキャンペーンを一時的に無効にするには)。
28.消印/ aws sesなどの一般的なサービスと簡単に統合できます(python-postmark / django-sesをインストールするだけです)。
29. Python例外によるキャッチおよびソート(消印などを使用する場合-問題をフィルタリングして迅速に解決するのが便利です)。
30.バージョン間の違いを表示する(テンプレートの変更者とエラーの原因を確認する必要が常にあります)。
31.ユーザーが読んだ手紙のレポート(地理情報を含む。ただし、保証はありません)。
32. SMSの送信(すべてのメーラー機能はSMS通知にも使用できます)。
33.テキストからスピーチ(障害のある人、または電話による緊急の通知に便利)。
34.プッシュ通知(モバイルアプリケーションの場合、BaaSを介して-管理者向けのProwlを含むparse.com)。
35.独自のバックエンドとプロバイダーの使用によるバッテリー機能の拡張。
36.テンプレートをリアルタイムで更新します(ファイルを作成し、コミットを行い、サーバーで更新をロールアウトする必要はありません)。
37.基本テンプレート(いつでも簡単に継承および変更できます)。
38. pre_send / post_sendシグナル(たとえば、有料のsmsを送信する場合、文字数のカウントと請求の修正のために必要です)
39.サブスクリプション(デフォルトでは、希望する通知時間の設定を含むニュースレター/通知などの可能性があるサブスクリプションの実装があります)

バッテリー機能は、 CeleryRedisに密接に関連しています。 より正確には、これはバックグラウンドディスパッチ、キュー、優先度、遅延ディスパッチです。

ほとんどの機能はそれらなしでも機能しますが。 つまり、外部の依存関係なしでバッテリーを使用できます。

これはプログラマーの裁量です。 それらまたは他の部品のセットアップの難しさは問題ではありません。 詳細なドキュメントがあります。

Redisの代わりに、RabbitMQ、MongoDB、およびサポートされているすべてのCeleryバックエンドを使用できます。
残念ながら、Ceryryでは、優先度はRedisに対してのみ実装されています。 準優先事項の中心(サーバー側ではありません)。

メッセージを送信するための簡単な例を見てみましょう

from dbmail import send_db_mail #   settings = Settings.objects.get(user_id=1) user = User.objects.get(pk=1) data = {'path': request.path} #    send_db_mail('welcome-notification', user.email, settings, user, data) #      send_db_mail('daily-report', user.email, user, data, files=[report_file]) 

この場合、メッセージ識別子を設定し、受信者を指定し、2つのモデルをコンテキストに渡します。これらのモデルは、テンプレート+辞書で自動的に解凍されます。

テンプレートのユーザーモデルフィールドは、ユーザー名またはメールと呼ばれます。 ただし、一般的に受け入れられている形式でそれらにアクセスする機会もあります:user.username。

より詳細な例

  send_db_mail( #     slug='welcome', #      . : # 'user1@example.com'  'user1@example.com, user2@example.com',  # ['user1@example.com', 'user2@example.com'],    #   MailGroup. : developers, support, admins recipient='user1@example.com', #   *args       { 'username': request.user.username, 'full_name': request.user.get_full_name(), 'signup_date': request.user.date_joined }, #     ,      #  . #  m2m  fk,    module_name (mymodel.user.email). MyModel.objects.get(pk=1), #    **kwargs: # from_email='from@example.com' #   # cc=['cc@example.com'], #  (  ,    recipient) # bcc=['bcc@example.com'], #   (  ,    recipient) # user=User.objects.get(pk=1), # ,     # #         Django # attachments=[(filename, content, mimetype)], # files=['hello.jpg', 'world.png'], # headers={'Custom-Header':'Some value'}, # # queue='default', #  # retry_delay=300, #        # max_retries=3, #  -    # retry=True, #     # time_limit=30, #  -    # send_after=60, #    N  # # use_celery=True, #  Celery # #         django.core.mail.message ) 

デモプロジェクトのインストール:


  $ sudo apt-get install -y virtualenvwrapper redis-server || brew install pyenv-virtualenvwrapper redis $ source /usr/share/virtualenvwrapper/virtualenvwrapper.sh || source /usr/local/bin/virtualenvwrapper.sh $ mkvirtualenv db-mailer $ workon db-mailer $ git clone --depth 1 https://github.com/LPgenerator/django-db-mailer.git db-mailer $ cd db-mailer $ python setup.py develop $ cd demo $ pip install -r requirements.txt $ python manage.py syncdb --noinput $ python manage.py migrate --noinput $ python manage.py createsuperuser --username admin --email admin@local.host $ python manage.py runserver >& /dev/null & $ python manage.py celeryd -Q default >& /dev/null & 

ドッカーを使用する:

  $ git clone --depth 1 https://github.com/LPgenerator/django-db-mailer.git db-mailer $ cd db-mailer $ docker build -t dbmail . $ docker run -it -d -p 8000:8000 --name dbmail dbmail $ docker exec -i -t dbmail /bin/bash $ cd /mailer/ 

浮浪者の使用:

  $ git clone --depth 1 https://github.com/LPgenerator/django-db-mailer.git db-mailer $ cd db-mailer $ vagrant up $ vagrant ssh $ cd /mailer/ 

実行シェル:

  $ python manage.py shell_plus --print-sql 

最初のテンプレートを作成します。

  >>> from dbmail.models import MailTemplate >>> from dbmail import send_db_mail >>> >>> MailTemplate.objects.create( ... name="Site welcome template", ... subject="Welcome", ... message="Welcome to our site. We are glad to see you.", ... slug="welcome", ... is_html=False, ... ) 

私たちは手紙を送ります:

  >>> send_db_mail('welcome', 'user@example.com', use_celery=False) 

初めて、すべてのデータベースクエリと文字自体がコンソールに表示されます。 2回目は、データベースへのクエリはありません。 書き込み要求のみを記録します。

ログの内容を確認しましょう。

  >>> from pprint import pprint >>> from django.forms.models import model_to_dict >>> from dbmail.models import MailLog >>> >>> pprint([model_to_dict(obj) for obj in MailLog.objects.all()]) 

これで、管理パネルを確認できます。

  $ xdg-open http://127.0.0.1:8000/admin/dbmail/ >& /dev/null || open http://127.0.0.1:8000/admin/dbmail/ >& /dev/null 

追加機能:


物語
変更/ロールバック履歴を保存するには、 django-reversionバッテリーを取り付けることができます。

エディター
ビジュアルエディターでテンプレートを編集するには、 django-tinymceバッテリーを挿入します

テーマ
django-db -mailer-ネイティブテーマとdjango-grappelliの両方をサポートします。

キュー
バックグラウンドでメッセージを優先的にサポートするには、 django-celeryバッテリーが必要です。

多言語
django-modeltranslationと組み合わせて多言語が可能です

CSS変換
小文字のCSSを変換して使用するには、premailerパッケージをプレインストールできます。 クライアント間のメッセージを作成するための小さいながらも便利なヘルパー。

報告書
読み取りレポートとユーザーデータに関する情報は、2つの単純なバッテリーhttpagentparserdjango-ipwareをインストールすることで取得できます。

基本パターン
デフォルトでは、デスクトップ、モバイル、ブラウザ向けに最適化された既製の基本テンプレートがあります。 それらの使用を開始するには、それらをインポートするだけです。
  $ python manage.py load_dbmail_base_templates 

その後、レターテンプレートで使用する変数とブロックを置き換えることができます。

注釈
優先順位付けが機能するためには、 Redisブローカーとのdjango-celeryの束が必要です。

旧バージョン
すべての機能が必要でない場合は、より単純なバージョンのバッテリーを使用できます。

DB_MAILER_ALLOWED_MODELS_ON_ADMIN変数を使用して、管理パネルの不要な機能を無効にすることもできます。

API
また、モバイルアプリケーションと組み合わせて、または他の言語の内部プロジェクトでバッテリーを使用することもできます。 制限はありません。 このコンテキストでのプロジェクトは、Python以外の言語のフレームワークまたはプロジェクトを完全に外部補完するものです。

簡単な例:

  >>> from dbmail.models import ApiKey >>> ApiKey.objects.create(name='Test', api_key='ZzriUzE') 

端末でcurlを使用して電子メールを送信しようとします。

  $ curl -X POST http://127.0.0.1:8000/dbmail/api/ --data 'api_key=ZzriUzE&slug=welcome&recipient=root@local.host' 

シンプルなi7 2.3GHzでのAPI 1k + rps帯域幅

プログラミング言語のその他の例は、プロジェクトリポジトリのドキュメントにあります。

ブランチ1.4から1.9までのDjangoサポート。 Python 2.6、2.7、pypy、3.4 +、pypy3

スクリーンショット















このバッテリーはいくつかの大きなプロジェクトで使用されており、多くの時間と神経を節約しています。
Djangoコミュニティに役立つことを願っています。

PyPiのページ。
GitHubのプロジェクトリポジトリ。

プルリクエストは歓迎です(支援を希望する場合は、TODO.RUがプロジェクトのルートにあります)。

Source: https://habr.com/ru/post/J253445/


All Articles