Xem bài viết depesz tuyệt vời như thường lệ và pg-message-queue.
Gửi email trực tiếp từ cơ sở dữ liệu có thể không phải là một ý tưởng tuyệt vời. Điều gì sẽ xảy ra nếu phân giải DNS chậm và mọi thứ bị treo trong 30 giây rồi hết thời gian? Điều gì sẽ xảy ra nếu máy chủ thư của bạn gặp sự cố và mất 5 phút để chấp nhận tin nhắn? Bạn sẽ nhận được các phiên cơ sở dữ liệu được treo trong trình kích hoạt của mình cho đến khi bạn ở max_connections
và đột nhiên bạn không thể làm gì khác ngoài chờ đợi hoặc bắt đầu hủy giao dịch theo cách thủ công.
Điều tôi khuyên bạn nên sử dụng NOTIFY
trình kích hoạt của bạn a LISTEN
ing tập lệnh trình trợ giúp vẫn chạy vĩnh viễn và được kết nối với DB (nhưng không phải trong một giao dịch).
Tất cả những gì trình kích hoạt của bạn phải làm là INSERT
một hàng vào bảng hàng đợi và gửi THÔNG BÁO
. Tập lệnh của bạn nhận được NOTIFY
vì nó đã đăng ký LISTEN
đối với nó, kiểm tra bảng hàng đợi và thực hiện phần còn lại.
Bạn có thể viết chương trình trợ giúp bằng bất kỳ ngôn ngữ nào thuận tiện; Tôi thường sử dụng Python với psycopg2
.
Tập lệnh đó có thể gửi email dựa trên thông tin mà nó tìm thấy trong cơ sở dữ liệu. Bạn không phải thực hiện tất cả các định dạng văn bản xấu xí trong PL / PgSQL, thay vào đó bạn có thể thay thế mọi thứ thành một mẫu bằng một ngôn ngữ kịch bản mạnh mẽ hơn và chỉ cần tìm nạp dữ liệu biến từ cơ sở dữ liệu khi mã NOTIFY > đi vào.
Với cách tiếp cận này, người trợ giúp của bạn có thể gửi từng tin nhắn và chỉ sau đó xóa thông tin khỏi bảng hàng đợi. Bằng cách đó, nếu có sự cố tạm thời với hệ thống thư của bạn khiến việc gửi không thành công, bạn sẽ không bị mất thông tin và có thể tiếp tục cố gắng gửi cho đến khi thành công.
Nếu bạn thực sự phải thực hiện việc này trong cơ sở dữ liệu, hãy xem PgMail.