O assunto que chegou a uma caixa real: "Fora do escritorio: Re:
=?UTF-8?Q?Re=3A_Fora_do_escrit=C3=B3rio?=". Duas coisas erradas, e a
segunda maior do que parece.
Um assunto com acento viaja como palavra codificada (RFC 2047). Colei o
cabecalho em bruto, portanto aquilo foi lido tal e qual por uma pessoa.
E foi tambem o que derrotou a verificacao do "Re:" ja existente:
codificado, todo o assunto comeca por "=?", nunca por "Re:", e por isso
foi acrescentado outro por cima. Descodificar corrige os dois sintomas
de uma vez. Os prefixos acumulados ("Re: RE: Re:") passam a ser
reduzidos a um.
O que estava por tras: aquele assunto era "Re: Fora do escritorio" -
alguem tinha respondido a propria mensagem automatica, e ela respondeu
de novo. Faltava a supressao por remetente. O RFC 5230 seccao 4.1 pede
exactamente isto e propoe sete dias: sem ela, uma conversa de cinco
mensagens produzia cinco copias do mesmo aviso, e quem respondesse ao
aviso recebia outro - que e como uma pessoa e um respondedor automatico
acabam a falar um para o outro indefinidamente.
A supressao falha aberta: um registo que nao se consegue ler deixa a
resposta sair. Ser avisado duas vezes e uma falha menor do que nunca
saber que a caixa esta ausente, que e o proposito da funcionalidade. O
envio so e registado depois de a resposta estar mesmo na fila, para que
um envio falhado nao silencie a mensagem seguinte da mesma pessoa.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
18 lines
899 B
SQL
18 lines
899 B
SQL
-- Who has already been told the mailbox is unattended.
|
|
--
|
|
-- RFC 5230 section 4.1: an autoresponder answers a given sender at most once
|
|
-- per period. Without this every message produces its own copy of the same
|
|
-- notice - a conversation of five mails produced five - and someone replying
|
|
-- to the automatic message itself was answered again, which is how a person
|
|
-- and an autoresponder end up talking past each other.
|
|
CREATE TABLE vacation_replies (
|
|
mailbox_id UUID NOT NULL REFERENCES mailboxes(id) ON DELETE CASCADE,
|
|
-- Lowercased, so one person is one row however they spell their address.
|
|
recipient VARCHAR(320) NOT NULL,
|
|
last_sent_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
PRIMARY KEY (mailbox_id, recipient)
|
|
);
|
|
|
|
-- The sweep that discards rows older than any suppression period reads this.
|
|
CREATE INDEX idx_vacation_replies_sent ON vacation_replies (last_sent_at);
|