web-dev-qa-db-ja.com

PostgreSQLトリガーからメールを送信するにはどうすればよいですか?

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;
13
AntiGMO

通常の優れたdepesz記事 および pg-message-queue を参照してください。

データベースから直接メールを送信するのは良い考えではないかもしれません。 DNSの解決が遅く、すべてが30秒間ハングしてからタイムアウトした場合はどうなりますか?メールサーバーが不安定で、メッセージを受け入れるのに5かかる場合はどうなりますか? max_connectionsに到達するまで、データベースセッションがトリガーでハングアップし、突然、待機するか、手動でトランザクションのキャンセルを開始する以外に何もできなくなります。

私がお勧めするのは、トリガーを使用することです NOTIFY a LISTENing 永続的に実行され、DBに接続されたままのヘルパースクリプト(ただし、トランザクションで)。

トリガーが行う必要があるのは、キューテーブルに行をINSERTして、NOTIFYを送信することだけです。スクリプトはNOTIFYに登録されているため、LISTENメッセージを受け取り、キューテーブルを調べて、残りを実行します。

ヘルパープログラムは、便利な言語で書くことができます。私は通常Pythonとpsycopg2を使用します。

そのスクリプトは、データベースで見つけた情報に基づいて電子メールを送信できます。 PL/PgSQLですべての醜いテキストフォーマットを行う必要はありません。代わりに、より強力なスクリプト言語のテンプレートに置き換えて、NOTIFYが来たときにデータベースから変数データをフェッチすることができます。に。

このアプローチでは、ヘルパーは各メッセージを送信してから、キューテーブルから情報を削除することができます。そうすれば、送信が失敗する原因となる一時的な問題がメールシステムにある場合でも、情報が失われることはなく、成功するまで送信を試みることができます。

データベースでこれを本当に行う必要がある場合は、 PgMail を参照してください。

37
Craig Ringer
  1. ローカルMTAを使用します(これにより、複数のアプリのSMTP構成が一元化されます)
  2. ローカルMTAを実際のMTAにリレーします(これにより、基本的に非同期サポートが提供されます)
  3. Windowsの場合は、blatSMTPコマンドラインクライアントを使用します。 blatへのパスがPATHにあることを確認してください
  4. トリガーで直接行うのではなく、ApacheCamelまたはpgAgentを使用してこれを行う必要があります。

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ミリ秒

3
Neil McGuigan

Plperluを使用してメールを送信できます。

This リンクは、トリガーで使用する方法の例を示しています。

1
Diego

PgMailを使用する可能性があります(インストールが許可されている場合)。

brandolabs.com の指示に従うと、

pgmail('Send From ','Send To ','Subject goes here','Message body here.')
1
Eggi

@CraigRingerに同意します。 Python 100行未満のコードで何かをコーディングできます。次のPythonライブラリ:psycopg2、smtplibを使用することをお勧めします。必要な頻度に応じて変更の通知を受け取るには、cronジョブを実行します(作業環境によって異なります)。これにより、変更が発生するたびに通知を送信するのではなく、データベースへの複数の変更を1つの電子メールに集約できます。

0
Adrian Aksan