Tipo di autenticazione SMTP non riconosciuto con Office 365

Sto riscontrando questo errore e ho provato numerose soluzioni diverse. Sto utilizzando Office 365.

Errore: 504 5.7.4 Tipo di autenticazione non riconosciuto [MN2PR20CA0010.namprd20.prod.outlook.com]

Impostazioni qui:

  DISCOURSE_SMTP_ADDRESS: smtp.office365.com
  DISCOURSE_SMTP_PORT: 587
  DISCOURSE_SMTP_USER_NAME: email
  DISCOURSE_SMTP_PASSWORD: "PASSWORD"
  DISCOURSE_SMTP_ENABLE_START_TLS: true

Prova prima la tua configurazione utilizzando lo strumento openssl

  1. Codifica il tuo utente Office365
echo -n "la tua email qui " | openssl enc -base64
xxx_encoded_email_xxx
  1. Codifica la tua password
echo -n "la tua password qui" | openssl enc -base64
xxx_encoded_password_xxx
  1. Apri una connessione
openssl s_client -connect SMTP.office365.com:587 -starttls smtp -quiet -crlf
  1. Testa l’autenticazione
  • attendi il messaggio 250 SMTPUTF8
  • invia EHLO SMTP.office365.com
  • attendi la risposta
    250-PR3P189CA0029.outlook.office365.com Hello [88.138.0.68]
    250-SIZE 157286400
    250-PIPELINING
    250-DSN
    250-ENHANCEDSTATUSCODES
    250-AUTH LOGIN XOAUTH2
    250-8BITMIME
    250-BINARYMIME
    250-CHUNKING
    250 SMTPUTF8
    
  • invia AUTH LOGIN
  • attendi 334 VXNlcm5hbWU6
  • invia il tuo login utente codificato xxx_encoded_email_xxx
  • attendi 334 UGFzc3dvcmQ6
  • invia la tua password codificata xxx_encoded_password_xxx
  • attendi la risposta 235 2.7.0 Authentication successful

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.

Sembra un :bug: a me. Ho inviato una PR:

Ciao,

Net::SMTP.start(smtp[:address], smtp[:port], ‘localhost’, smtp[:user_name], smtp[:password], smtp[:authentication])
rescue Exception => e

È stato applicato l’aggiornamento come mostrato sopra nella mia versione corrente, ma ricevo ancora lo stesso errore.

Errore: 504 5.7.4 Tipo di autenticazione non riconosciuto con smtp.office365.com.

Qualcuno ha qualche idea?

Come posso modificare lo script lib/tasks/emails.rake per far funzionare tutto?

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.

C’è anche il supporto IMAP per le caselle di gruppo. Tuttavia, è principalmente compatibile solo con Gmail.

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.

A partire dal 2023, l’autenticazione POP3 non è più possibile in Exchange.

Se stai usando PHPMailer
Prova commentando/rimuovendo la riga e prova: //$mail->isSMTP(true);