Type d'authentification SMTP non reconnu avec Office 365

Je rencontre cette erreur et j’ai essayé de nombreuses options différentes. J’utilise Office 365.

Erreur : 504 5.7.4 Type d'authentification non reconnu [MN2PR20CA0010.namprd20.prod.outlook.com]

Paramètres ici :

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

Testez d’abord votre configuration en utilisant l’outil openssl

  1. Encodez votre utilisateur Office365
echo -n "votre email ici " | openssl enc -base64
xxx_encoded_email_xxx
  1. Encodez votre mot de passe
echo -n "votre mot de passe ici" | openssl enc -base64
xxx_encoded_password_xxx
  1. Ouvrez une connexion
openssl s_client -connect SMTP.office365.com:587 -starttls smtp -quiet -crlf
  1. Testez l’authentification
  • Attendez le message 250 SMTPUTF8
  • Envoyez EHLO SMTP.office365.com
  • Attendez la réponse
    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
    
  • Envoyez AUTH LOGIN
  • Attendez 334 VXNlcm5hbWU6
  • Envoyez votre identifiant utilisateur encodé xxx_encoded_email_xxx
  • Attendez 334 UGFzc3dvcmQ6
  • Envoyez votre mot de passe encodé xxx_encoded_password_xxx
  • Attendez la réponse 235 2.7.0 Authentication successful

Donc, si le test openssl fonctionne mais que le test de connexion exécuté par discourse-doctor échoue toujours avec ces paramètres, quelle est la prochaine étape ? Même si le test openssl réussit, ma connexion Discourse échoue toujours avec l’erreur 504 5.7.4 Type d’authentification non reconnu… Je suppose qu’il ne reconnaît pas la méthode d’authentification LOGIN. J’ai essayé d’ajouter DISCOURSE_SMTP_AUTHENTICATION: login au fichier app.yml, mais cela n’a pas aidé.

Pour info, voici ce que j’ai trouvé. Je suis entré dans l’image Docker et j’ai commencé à bidouiller le script lib/tasks/emails.rake et le fichier config/discourse.conf. Plusieurs heures plus tard, après avoir essayé toutes les combinaisons possibles de smtp.office365.com et .mail.protection.outlook.com avec AUTH login et AUTH plain, j’ai décommenté le bloc situé au-dessus du démarrage de STMP.

# Nous aimerions faire cela, mais Net::SMTP échoue avec 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

L’exécution telle quelle a entraîné un délai d’expiration de lecture.
La modification suivante — appeler new plutôt que start — a permis un envoi réussi.

Net::SMTP.new(smtp[:address], smtp[:port]) do |s|
    s.enable_starttls
    s.auth_login(smtp[:user_name], smtp[:password])
end

C’est ma première expérience avec Ruby, rake et leurs amis. Je ne peux pas expliquer pourquoi cela fonctionne ou si c’est une « bonne chose » pour les cas généraux.
J.

Ah, et je n’ai jamais réussi à faire fonctionner my_domain.mail.protection.outlook.com, que ce soit sur le port 25 ou 587. Ce qui a fonctionné, c’est smtp.office365.com:587.

J’utilise socketlabs.com comme service de livraison d’e-mails et j’ai rencontré un problème similaire. Dans mon cas, la solution consistait à modifier lib/tasks/emails.rake comme suit :
Modifiez la ligne :
Net::SMTP.start(smtp[:address], smtp[:port], 'localhost', smtp[:user_name], smtp[:password])
en
Net::SMTP.start(smtp[:address], smtp[:port], 'localhost', smtp[:user_name], smtp[:password], smtp[:authentication])

Sans cette modification, DISCOURSE_SMTP_AUTHENTICATION: login n’est pas transmis au code SMTP de bas niveau.

Je n’ai pas testé si le code modifié fonctionne toujours avec d’autres méthodes d’authentification, mais cela résout le problème pour l’authentification par connexion.

Je peux confirmer que l’ajout de
smtp[:authentication]
à l’appel Net::SMTP.start et la définition de
DISCOURSE_SMTP_AUTHENTICATION: login
dans app.yml résolvent le problème pour la page de test des e-mails.

Je pense que les e-mails réguliers sont envoyés via la bibliothèque mail, et que la définition de
DISCOURSE_SMTP_AUTHENTICATION: login
dans app.yml suffit pour que la bibliothèque fonctionne correctement.

Néanmoins, je suis d’avis que lib/tasks/emails.rake devrait être corrigé pour utiliser le paramètre DISCOURSE_SMTP_AUTHENTICATION. Cela éviterait certains débogages inutiles.

Ça ressemble à un :bug: à mes yeux. J’ai soumis une PR :

Bonjour,

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

A été corrigé comme ci-dessus dans ma version actuelle, mais j’obtiens toujours la même erreur.

Erreur : 504 5.7.4 Type d’authentification non reconnu avec smtp.office365.com.

Quelqu’un a-t-il des idées ?

Comment modifier le script lib/tasks/emails.rake pour que cela fonctionne ?

En guise de mise à jour générale sur ce problème, Microsoft est en train de supprimer l’authentification héritée pour SMTP et POP3, ce qui va compliquer les choses si vous utilisez O365 comme fournisseur de messagerie. La stratégie par défaut appliquée actuellement interdit l’authentification SMTP, et vous devez l’activer pour chaque boîte aux lettres. J’espère que cela vous sera utile — j’ai passé hier matin à me frapper la tête contre un mur à cause de cela.

C’est vraiment dommage pour POP en particulier, car la configuration de la réception des courriers va devenir beaucoup plus difficile à moins que Discourse n’ajoute le support IMAP pour les boîtes aux lettres entrantes.

Il existe une solution simple pour les courriels entrants qui inclut un conteneur pour les recevoir. Elle s’appelait autrefois « simple », mais quelqu’un a contesté ce nom et elle a été renommée. Je ne parviens plus à la retrouver.

Il existe également un support IMAP pour les boîtes aux lettres de groupe. Cependant, cela fonctionne principalement uniquement avec Gmail.

Bon, en tout cas, l’exécution de votre propre serveur de messagerie devrait être considérée comme une solution de dernier recours. Je pense qu’il s’agissait de « livraison directe », essayez de rechercher ce terme.

Depuis 2023, l’authentification pop3 n’est plus possible dans Exchange.

Si vous utilisez PHPMailer
Essayez en commentant/supprimant la ligne et essayez : //$mail->isSMTP(true);