Quindi, se il test openssl funziona ma il test di connessione eseguito da discourse-doctor fallisce ancora con quelle impostazioni, qual è il passo successivo? Anche se il test openssl ha esito positivo, la connessione di Discourse fallisce comunque con l’errore 504 5.7.4 Unrecognized authentication type… Presumibilmente non riconosce il metodo di autenticazione LOGIN. Ho provato ad aggiungere DISCOURSE_SMTP_AUTHENTICATION: login al file app.yml, ma ciò non ha risolto il problema.
Per quanto ne so, ecco cosa ho scoperto. Sono entrato nell’immagine Docker e ho iniziato a smanettare con lo script lib/tasks/emails.rake e il file config/discourse.conf. Dopo diverse ore, provando ogni possibile combinazione di smtp.office365.com e .mail.protection.outlook.com con AUTH login e AUTH plain, ho decommentato il blocco sopra l’avvio di SMTP.
# Vorremmo farlo, ma Net::SMTP genera un errore usando starttls
#Net::SMTP.start(smtp[:address], smtp[:port]) do |s|
# s.starttls if !!smtp[:enable_starttls_auto] && s.capable_starttls?
# s.auth_login(smtp[:user_name], smtp[:password])
#end
Eseguendolo così com’è, si è verificato un timeout di lettura.
Modificandolo in questo modo – chiamando new invece di start – l’invio è andato a buon fine.
Net::SMTP.new(smtp[:address], smtp[:port]) do |s|
s.enable_starttls
s.auth_login(smtp[:user_name], smtp[:password])
end
Questa è la mia prima esperienza con Ruby, rake e affini. Non riesco a spiegare perché funzioni o se sia una “cosa buona” per i casi generali.
J.
Oh, inoltre non sono mai riuscito a farlo funzionare con my_domain.mail.protection.outlook.com né sulla porta 25 né sulla 587; ciò che ha funzionato è stato smtp.office365.com:587.
Utilizzo socketlabs.com come servizio di consegna email e ho riscontrato un problema simile. Nel mio caso, la soluzione è stata modificare lib/tasks/emails.rake come segue:
Modificare la riga: Net::SMTP.start(smtp[:address], smtp[:port], 'localhost', smtp[:user_name], smtp[:password])
in Net::SMTP.start(smtp[:address], smtp[:port], 'localhost', smtp[:user_name], smtp[:password], smtp[:authentication])
Senza questa modifica, DISCOURSE_SMTP_AUTHENTICATION: login non viene passato al codice SMTP di livello inferiore.
Non ho testato se il codice modificato funzioni ancora per altri metodi di autenticazione, ma risolve il problema per l’autenticazione login.
Posso confermare che l’aggiunta di smtp[:authentication]
alla chiamata Net::SMTP.start e l’impostazione di DISCOURSE_SMTP_AUTHENTICATION: login
in app.yml risolvono il problema nella pagina di test delle email.
Credo che le email regolari vengano inviate tramite la libreria mail, e che impostare DISCOURSE_SMTP_AUTHENTICATION: login
in app.yml sia sufficiente per far funzionare correttamente la libreria.
Tuttavia, ritengo che lib/tasks/emails.rake dovrebbe essere corretto per utilizzare l’impostazione DISCOURSE_SMTP_AUTHENTICATION. Questo eviterebbe qualche inutile attività di debug.
Come aggiornamento generale su questo problema, Microsoft sta procedendo alla rimozione dell’autenticazione legacy per SMTP e POP3, il che renderà le cose più difficili se utilizzi O365 come provider di posta. La policy applicata di default ora è quella di disabilitare SMTP AUTH e devi abilitarla per ogni casella di posta. Spero che sia utile — ho passato ieri mattina a sbattermi la testa contro questo muro.
È un vero peccato, in particolare per POP, perché configurare la posta in arrivo diventerà molto più complicato a meno che Discourse non aggiunga il supporto IMAP per le caselle di posta in arrivo.
Esiste una soluzione semplice per la posta in arrivo che include un contenitore per riceverla. In passato si chiamava “semplice”, ma qualcuno ha fatto obiezione al nome e l’hanno cambiato, e ora non riesco più a trovarlo.
Beh, in ogni caso, gestire il proprio server di posta dovrebbe essere considerato un’ultima risorsa. Credo si trattasse di “consegna diretta”, prova a cercare quel termine.