Pgsqlを使用してトリガーを設定します。テーブルのデータセットを更新すると(ステータスを[完了]に変更)、データセットのメール値を使用してメールアカウントにメールが自動的に送信され、このメールがサーバーに保存されます。
しかし、トリガー機能を書き込んでメールを送信したり、サーバーでメールを送信したりする方法がわかりません。前もって感謝します
Pgバージョンは9.1、CentOS 5.8
CREATE OR REPLACE FUNCTION sss()
RETURNS trigger AS
$BODY$begin
if(NEW.publisher== 'aaaa')
then
//send email and save to server 192.168.171.64
end if;
return NEW;
end
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION sss()
OWNER TO postgres;
GRANT EXECUTE ON FUNCTION sss() TO postgres;
通常の優れたdepesz記事 および pg-message-queue を参照してください。
データベースから直接メールを送信するのは良い考えではないかもしれません。 DNSの解決が遅く、すべてが30秒間ハングしてからタイムアウトした場合はどうなりますか?メールサーバーが不安定で、メッセージを受け入れるのに5分かかる場合はどうなりますか? max_connections
に到達するまで、データベースセッションがトリガーでハングアップし、突然、待機するか、手動でトランザクションのキャンセルを開始する以外に何もできなくなります。
私がお勧めするのは、トリガーを使用することです NOTIFY
a LISTEN
ing 永続的に実行され、DBに接続されたままのヘルパースクリプト(ただし、トランザクションで)。
トリガーが行う必要があるのは、キューテーブルに行をINSERT
して、NOTIFY
を送信することだけです。スクリプトはNOTIFY
に登録されているため、LISTEN
メッセージを受け取り、キューテーブルを調べて、残りを実行します。
ヘルパープログラムは、便利な言語で書くことができます。私は通常Pythonとpsycopg2
を使用します。
そのスクリプトは、データベースで見つけた情報に基づいて電子メールを送信できます。 PL/PgSQLですべての醜いテキストフォーマットを行う必要はありません。代わりに、より強力なスクリプト言語のテンプレートに置き換えて、NOTIFY
が来たときにデータベースから変数データをフェッチすることができます。に。
このアプローチでは、ヘルパーは各メッセージを送信してから、キューテーブルから情報を削除することができます。そうすれば、送信が失敗する原因となる一時的な問題がメールシステムにある場合でも、情報が失われることはなく、成功するまで送信を試みることができます。
データベースでこれを本当に行う必要がある場合は、 PgMail を参照してください。
Postgresスーパーユーザーの場合、これはWindowsで機能します。トリガー関数はSECURITYDEFINERである必要があります。 Linuxのsendmailについても同様です。
...
copy
( select 'my email body' )
to program
'blat -to [email protected] -from [email protected] -subject "My Subject" -server localhost:25'
with (
format text
);
...
〜60ミリ秒
Plperluを使用してメールを送信できます。
This リンクは、トリガーで使用する方法の例を示しています。
PgMailを使用する可能性があります(インストールが許可されている場合)。
brandolabs.com の指示に従うと、
pgmail('Send From ','Send To ','Subject goes here','Message body here.')
@CraigRingerに同意します。 Python 100行未満のコードで何かをコーディングできます。次のPythonライブラリ:psycopg2、smtplibを使用することをお勧めします。必要な頻度に応じて変更の通知を受け取るには、cronジョブを実行します(作業環境によって異なります)。これにより、変更が発生するたびに通知を送信するのではなく、データベースへの複数の変更を1つの電子メールに集約できます。