できないからといって、そうすべきだとは限りません。これを行うためのより良い方法があります。 PLから直接実行しないでください。私の警告を無視したい場合は、PL / PerlUを使用して、他の電子メールクライアントと同じように記述してください。好きなCPANモジュールを使用して、生活を楽にすることができます。
しない2つの理由:
1)トランザクションが中止/ロールバックした場合はどうなりますか?電子メールを送信しましたが、データベースに対応する変更を加えていません。トランザクション内で非トランザクション処理を行っています。
2)2分後にtcpタイムアウトが発生するまで、電子メールが応答を待ってハングした場合はどうなりますか?顧客にメールを送ることを忘れますか?トランザクションを中止します(メールを送信できません。パーツを発送したとは言えません!)?
これは悪いです 考え。それをしないでください。このエラーをPostgreSQLに感謝し、別のデーモンに移動します。
はるかに優れている アプローチは、LISTENとNOTIFYを使用し、テーブルをキューに入れることです。次に、次のようなテーブルを作成できます。
CREATE TABLE email_queue (
id serial not null unique,
email_from text,
email_to text not null,
body text not null
);
CREATE FUNCTION email_queue_trigger() RETURNS TRIGGER
LANGUAGE PLPGSQL AS $F$
BEGIN
NOTIFY emails_waiting;
END;
$F$;
次に、ストアドプロシージャをそのテーブルに挿入します。
次に、emails_waitingでリッスンする2番目のクライアントアプリを用意します(sqlステートメントLISTEN emails_waiting
)そして次のようにします:
- email_queueにレコードがあるかどうかを確認します。そうでない場合は3に進みます。
- データの読み取り、電子メールの送信、レコードの削除、およびコミット。
- キューが空の場合、x秒間スリープします
- ウェイクアップ時に、非同期をチェックします。通知(クライアントライブラリによって異なります。ドキュメントを確認してください)。ある場合は1に進み、ない場合は3に進みます。
これにより、トランザクションを送信するためにメールをキューに入れ、これを別のアプリケーションに自動的に渡して、必要に応じてMTAに接続できるようになります。
その2番目のクライアントアプリは、知っているツールを使用して、選択した言語で作成できます。トランザクションからすべてのネットワーク処理を実行するという利点があるため、2番目のSMTPサーバーを介して送信しているときに接続がハングした場合、データベーストランザクション全体がタイムアウトしてトランザクションを中止するまで2分間待機しません。 。したがって、将来の要件の変更に対しても安全です。