PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

PL/Perl envia email no Postgresql


Só porque você pode não significa que você deve. Existem maneiras melhores de fazer isso. Não faça isso diretamente de um PL. Se você quiser ignorar meus avisos, use PL/PerlU e escreva-o como faria com qualquer outro cliente de e-mail. Você pode usar qualquer módulo CPAN que desejar para facilitar sua vida.

Dois motivos para não:

1) E se sua transação for abortada/revertida? Você enviou o e-mail, mas não fez nenhuma alteração correspondente no banco de dados. Você está fazendo coisas não transacionais dentro de uma transação.

2) E se o seu e-mail travar aguardando uma resposta até que você obtenha um tempo limite de tcp após 2 minutos? Você vai esquecer de enviar e-mail para o cliente? Abortar a transação (não pode enviar e-mail, não posso dizer que enviamos a peça!)?

Este é um ruim idéia. Não faça isso. Agradeça ao PostgreSQL por este erro e mova-o para outro daemon.

Um muito melhor abordagem é usar LISTEN e NOTIFY e tabelas de filas. Você pode então criar uma tabela como esta:
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$;

Em seguida, insira o procedimento armazenado nessa tabela.

Em seguida, tenha um segundo aplicativo cliente que LISTEN nos emails_waiting escuta (instrução sql LISTEN emails_waiting ) e então faz o seguinte:
  1. Verifica se há registros no email_queue. Se não, vá para 3.
  2. lê dados, envia e-mail, exclui o registro e confirma.
  3. Quando a fila está vazia, dorme por x segundos
  4. Na ativação, verifica se há assíncrono. notificações (depende das bibliotecas do cliente, verifique os documentos). Se houver, vá para 1, se não, vá para 3.

Isso permite que seus e-mails sejam enfileirados para envio em sua transação e que isso seja passado automaticamente para outro aplicativo que pode se conectar ao MTA, se você preferir.

Esse segundo aplicativo cliente pode ser escrito no idioma de sua escolha, usando as ferramentas que você conhece. Ele tem a vantagem de fazer todas as coisas da rede fora da transação, portanto, se você estiver enviando através de um segundo servidor SMTP e a conexão travar, toda a transação do banco de dados não esperará 2 minutos para expirar e abortar a transação . Também é mais seguro contra futuras mudanças nos requisitos.