Chỉ vì bạn có thể không có nghĩa là bạn nên làm. Có nhiều cách tốt hơn để làm điều này. Đừng làm điều đó trực tiếp từ PL. Nếu bạn muốn bỏ qua các cảnh báo của tôi, hãy sử dụng PL / PerlU và viết nó giống như bạn làm với bất kỳ ứng dụng email nào khác. Bạn có thể sử dụng bất kỳ mô-đun CPAN nào mà bạn thích để giúp cuộc sống của bạn dễ dàng hơn.
Hai lý do không nên:
1) Điều gì sẽ xảy ra nếu giao dịch của bạn bị hủy / lùi lại? Bạn đã gửi email nhưng không thực hiện thay đổi tương ứng nào đối với db. Bạn đang thực hiện những thứ phi giao dịch bên trong một giao dịch.
2) Điều gì sẽ xảy ra nếu email của bạn bị treo khi chờ phản hồi cho đến khi bạn nhận được thời gian chờ tcp sau 2 phút? Bạn sẽ quên việc gửi email cho khách hàng? Hủy giao dịch (không thể gửi email, không thể nói rằng chúng tôi đã chuyển một phần!)?
Đây là một điều tồi tệ ý kiến. Đừng làm điều đó. Cảm ơn PostgreSQL về lỗi này và chuyển nó sang một daemon khác.
A tốt hơn nhiều cách tiếp cận là sử dụng LISTEN và NOTIFY, và các bảng xếp hàng. Sau đó, bạn có thể tạo một bảng như sau:
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$;
Sau đó, chèn thủ tục đã lưu trữ của bạn vào bảng đó.
Sau đó, có một ứng dụng khách thứ hai LISTEN trên các lượt nghe email_waiting (câu lệnh sql LISTEN emails_waiting
) và sau đó thực hiện như sau:
- Kiểm tra xem có bản ghi trong email_queue hay không. Nếu không, hãy chuyển đến 3.
- đọc dữ liệu, gửi email, xóa bản ghi và cam kết.
- Khi hàng đợi trống sẽ chuyển sang chế độ ngủ trong x giây
- Khi đánh thức, hãy kiểm tra xem có bất đồng bộ không. thông báo (phụ thuộc vào thư viện khách hàng, kiểm tra tài liệu). Nếu có, hãy chuyển đến 1, nếu không, hãy chuyển đến 3.
Điều này cho phép các email của bạn được xếp hàng đợi để gửi trong giao dịch của bạn và để email này tự động được chuyển đến một ứng dụng khác, ứng dụng này sau đó có thể kết nối với MTA nếu bạn chọn.
Ứng dụng khách thứ hai đó có thể được viết bằng ngôn ngữ bạn chọn, sử dụng bất kỳ công cụ nào bạn biết. Nó có lợi thế là thực hiện tất cả nội dung mạng ngoài giao dịch, vì vậy nếu bạn đang gửi qua máy chủ SMTP thứ hai và kết nối bị treo, toàn bộ giao dịch cơ sở dữ liệu của bạn sẽ không đợi 2 phút để hết thời gian và hủy giao dịch . Do đó, nó cũng an toàn hơn trước những thay đổi về yêu cầu trong tương lai.