いつものように優れたdepeszの記事とpg-message-queueを参照してください。
データベースから直接電子メールを送信することは、良い考えではないかもしれません。 DNSの解決が遅く、すべてが30秒間ハングしてからタイムアウトした場合はどうなりますか?メールサーバーが不安定で、5分かかる場合はどうなりますか メッセージを受け入れるには? max_connections
になるまで、データベースセッションがトリガーでハングアップします。 突然、待つか、手動でトランザクションをキャンセルし始める以外に何もできなくなります。
私がお勧めするのは、トリガーを NOTIFY
にすることです。 LISTEN
永続的に実行され、DBに接続されたままのヘルパースクリプトを作成します(ただし、トランザクションでは接続されません)。
トリガーが行う必要があるのは、 INSERT
だけです。 行をキューテーブルに入れ、 NOTIFY
を送信します 。スクリプトはNOTIFY
を取得します LISTEN
に登録されているためメッセージ そのために、キューテーブルを調べて、残りを実行します。
ヘルパープログラムは、便利な言語で書くことができます。私は通常、Pythonを psycopg2
で使用します 。
そのスクリプトは、データベースで見つけた情報に基づいて電子メールを送信できます。 PL / PgSQLですべての醜いテキストフォーマットを行う必要はありません。代わりに、より強力なスクリプト言語のテンプレートに置き換えて、 NOTIFY
> 入ってくる。
このアプローチでは、ヘルパーは各メッセージを送信してから、キューテーブルから情報を削除することができます。そうすれば、メールシステムに一時的な問題が発生して送信が失敗した場合でも、情報が失われることはなく、成功するまで情報の送信を試みることができます。
データベースでこれを本当に行う必要がある場合は、PgMailを参照してください。