19

pgsql を使用してトリガーを設定します。テーブル データセットを更新すると (ステータスを [Finished] に変更します)、データセットの電子メール値を使用して電子メール アカウントに電子メールが自動的に送信され、この電子メールがサーバーに保存されます。

しかし、メールを送信するトリガー関数を記述し、サーバーでメールを送信する方法がわかりません。前もって感謝します

ページのバージョンは 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;
4

6 に答える 6

49

いつものように優れた depesz の記事pg-message-queueを参照してください。

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

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

トリガーが行う必要があるのはINSERT、行をキュー テーブルに入れ、NOTIFY. スクリプトは、NOTIFY登録されているためメッセージを取得しLISTEN、キュー テーブルを調べて、残りの処理を行います。

便利な言語でヘルパー プログラムを作成できます。私は通常、Pythonをpsycopg2.

そのスクリプトは、データベースで見つけた情報に基づいて電子メールを送信できます。PL/PgSQL で醜いテキストの書式設定をすべて行う必要はありません。代わりに、より強力なスクリプト言語でテンプレートに代入し、データベースから変数データを取得するだけNOTIFYで済みます。

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

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

于 2012-08-17T09:51:04.027 に答える
5
  1. ローカル MTA を使用する (これにより、複数のアプリの SMTP 構成を一元化できます)
  2. ローカル MTA を実際の MTA にリレーします (これにより、基本的に非同期サポートが提供されます)。
  3. Windows の場合は、blat SMTP コマンド ライン クライアントを使用します。blat へのパスが PATH にあることを確認してください
  4. トリガーで直接ではなく、おそらくApache CamelまたはpgAgentを使用してこれを行う必要があります

postgres スーパーユーザーの場合、これは Windows で機能します。トリガー関数は SECURITY DEFINER である必要があります。Linux の sendmail の場合も同様です。

...

copy 
  ( select 'my email body' ) 
to program 
  'blat -to to@example.com -from from@example.com -subject "My Subject" -server localhost:25' 
with (
  format text
);

...

〜60ミリ秒

于 2014-08-17T01:42:05.813 に答える
1

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

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

于 2012-08-17T08:55:06.813 に答える
1

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

brandolabs.comの指示に従うと、次のようになります。

pgmail('Send From ','Send To ','Subject goes here','Message body here.')
于 2012-08-17T09:00:03.927 に答える