Va bene, un altro membro del team ha menzionato che il polling IMAP non ha mai funzionato correttamente, è stato in parte rimosso e queste poche impostazioni sembrano essere dei residui di quando si mirava all’implementazione.
*EDIT: Trovata una dichiarazione al riguardo: IMAP support for group inboxes - #39 by martin
Sembra un passo indietro, poiché per me POP3 è obsoleto e impraticabile al giorno d’oggi, dove le persone utilizzano solitamente più client di posta (telefono + PC minimo). Quindi non vedo alcun motivo per abilitare i listener POP3 in un’istanza Dovecot.
Tuttavia, sono riuscito a implementare l’API diretta del ricevitore di posta di Discourse nel nostro Postfix esistente senza il container del ricevitore di posta e persino senza i suoi script Ruby, ma seguendo principalmente l’integrazione Postfix utilizzata nel container del ricevitore di posta di Discourse: mail-receiver/Dockerfile at main · discourse/mail-receiver · GitHub
/etc/postfix/main.cf:
# Per l'indirizzo email di risposta di Discourse, sovrascriviamo il trasporto predefinito tramite la mappatura dei trasporti
transport_maps=hash:/etc/postfix/transport
/etc/postfix/transport
# Un servizio chiamato "discourse" viene utilizzato come endpoint di trasporto per le email all'indirizzo di risposta Discourse definito
forum.reply@dietpi.com discourse:
/etc/postfix/master.cf
# Definiamo il servizio di trasporto "discourse" come pipe daemon in curl in ascolto su un socket UNIX (privato)
# Non può essere non privilegiato o chrooted affinché la pipe in curl funzioni
discourse unix - n n - - pipe user=nobody:nogroup argv=/usr/bin/curl -X POST -F email=\u003c- -H Api-Username:system -H Api-Key:fooooobaaaaarbaaaaaaz https://dietpi.com/forum/admin/email/handle_mail
- Quindi la mappatura dei trasporti passa le email all’indirizzo di risposta al nostro servizio personalizzato
discourse. - Le migliori prestazioni dovrebbero essere un socket UNIX, e può essere privato (il primo
-), poiché nient’altro deve utilizzarlo comunque. “privato” significa che il socket si trova in/var/spool/postfix/private/discourse, in una directory a cui ha accesso solo l’utentepostfix, all’interno della directory chroot di Postfix/var/spool/postfix. - Ma non può essere non privilegiato o chrooted affinché
pipeincurlfunzioni (n n). - Quindi minimizziamo i permessi utilizzando l’utente/gruppo
nobody:nogroup. - Seguendo l’API del ricevitore, l’email deve essere allegata a un campo modulo
email, il che può essere fatto tramite la chiamata STDIN<-di curl. Le intestazioniApi-UsernameeApi-Keydevono essere aggiunte, la prima è solitamentesystem, la seconda può essere generata in Discourse, come chiave API granulare con solo i permessireceive_emails. Quindi utilizzando l’endpoint HTTP rispettivamente.
Saltiamo intenzionalmente i controlli della politica di rifiuto rapido eseguiti dal container del ricevitore:
- Controlla l’esistenza delle intestazioni
FromeTo, se il mittente è un indirizzo completo con dominio e se è in una blacklist che può essere opzionalmente definita tramite la variabile del containerBLACKLISTED_SENDER_DOMAINS. E invia gli indirizzi del mittente e del destinatario a un altro endpoint API HTTP di Discourse che verifica se il destinatario corrisponde al modello di indirizzo email di risposta configurato e se l’indirizzo del mittente appartiene a un utente registrato, a meno che il forum non sia configurato per creare nuovi utenti inattivi in base alle email in arrivo, cosa che stranamente era abilitata per impostazione predefinita nel nostro caso? - La maggior parte di questo, e altro ancora, viene controllato dal nostro servizio ricevitore SMTP Postfix pubblico comunque, e tutto passa attraverso
rspamdche implica controlli DKIM, SPF e DMARC. - Ma soprattutto, gli stessi controlli vengono eseguiti dal backend finale del ricevitore di posta di Discourse comunque. Unico svantaggio: i mittenti non ricevono un’email di rifiuto/rimbalzo dal mailer daemon, ma gli errori in caso di mittente/destinatario non validi vengono invece/solo registrati nel nostro Discourse. Ma se mittente e destinatario erano corretti, solo il contenuto dell’email non è quello previsto (in particolare manca l’intestazione Message-ID), i mittenti ricevono un’email corretta da Discourse. Le email di rifiuto/rimbalzo SMTP mancanti vanno benissimo secondo me, dato che altrimenti l’implementazione ha un overhead minimo, ha una richiesta di rete e un’elaborazione backend in meno per email, ecc.
- In generale: fare attenzione agli spazi negli argomenti dei comandi
master.cf. La quotazione per mantenere gli spazi letterali non funziona. Invece un tale argomento dovrebbe essere racchiuso tra parentesi graffe:{un argomento con spazi}. Ma in questo caso, nessun argomento contiene spazi, quelli tra la chiave dell’intestazione e il valore sono anche opzionali.
Funziona benissimo finora e si integra perfettamente nella nostra configurazione esistente con trasporto virtuale predefinito a Dovecot, e la mappatura dei trasporti utilizzata anche per inoltrare alcune email a indirizzi esterni, poiché non tutti nel team desiderano/richiedono una casella di posta aggiuntiva sul nostro server. Se un indirizzo catch-all è definito nella mappatura degli alias virtuali, l’indirizzo di risposta di Discourse deve essere aggiunto a quella tabella, mappandolo a se stesso (come altri utenti/indirizzi virtuali locali).