SMTP Microsoft 365: “Authentication unsuccessful” su SMTP AUTH — cause, migrazioni e soluzioni OAuth

Da qualche mese molte app e dispositivi che inviano posta tramite smtp.office365.com (porta 587) ricevono “Authentication unsuccessful, basic authentication is disabled”. Non è un bug della tua applicazione: sono cambiate le regole di Microsoft 365. Qui trovi cause, percorsi di migrazione e istruzioni pratiche per risolvere in modo definitivo.

Indice

Panoramica del problema

Scenario tipico: un gestionale, un portale web o una multifunzione deve inviare e‑mail con SMTP client submission (SMTP AUTH) verso Exchange Online (smtp.office365.com, STARTTLS, porta 587). Viene creato un account di servizio senza licenza, e fino a poco tempo fa molti tenant accettavano la Basic Authentication (username+password). Oggi non più: l’autenticazione di base è stata rimossa o è in via di rimozione e, nei tenant nuovi, SMTP AUTH è disabilitato per impostazione predefinita. Risultato: l’app non si autentica e mostra errori 535/5.7.x.

Perché ora fallisce

FattoreDettagliFonte
Licenza obbligatoriaPer client‑submission serve una cassetta postale con licenza Exchange Online / Microsoft 365. Senza licenza la connessione viene rifiutata e non è possibile usare l’indirizzo come mittente autenticato.[1]
Fine della Basic AuthExchange Online rimuove definitivamente la Basic Auth con Client Submission (SMTP AUTH) gradualmente fra 1 marzo 2026 e 30 aprile 2026. Molti tenant l’hanno già disattivata: gli invii legacy con username+password falliscono.[2]
SMTP AUTH disattivato di defaultNei tenant creati dopo gennaio 2020 SMTP AUTH è disabilitato; va abilitato a livello tenant o per singola mailbox se serve davvero.[3]

Come scegliere la strada giusta

Prima di mettere mano al codice, individua il caso d’uso. La tabella seguente sintetizza le opzioni supportate oggi da Microsoft 365.

EsigenzaSoluzione consigliataNote operative
Applicazione aggiornata (librerie moderne, possibilità di gestire token)SMTP AUTH + OAuth 2.0Registra un’app in Entra ID, usa Application permission SMTP.SendAsApp con flusso client credentials. Porta 587, STARTTLS; nome utente = UPN della mailbox; “password” = token OAuth.
Dispositivo/scanner che non supporta OAuthSMTP Relay (con connettore e IP statico) oppure Direct SendNon richiede licenza mailbox. Con SMTP Relay puoi recapitare all’esterno; Direct Send è per invio interno. Nessuno dei due archivia in Sent Items.
Volumi elevati / marketing / B2CProvider esterno (es. servizi di invio transazionale)Indipendente dalle policy di Exchange Online; controlla costi, reputazione IP, tracciamento e requisiti di compliance.

Le tre modalità a confronto

CaratteristicaClient Submission
(SMTP AUTH)
SMTP Relay
(connettore)
Direct Send
AutenticazioneOAuth 2.0 (consigliato). Basic in fase di rimozione.TLS con certificate subject/SAN o IP statico autenticato dal connettore.Nessuna (mittente in dominio accettato).
Porta/Destinazione587 → smtp.office365.com + STARTTLS25 → endpoint MX del tuo dominio (*.mail.protection.outlook.com)25 → endpoint MX del tuo dominio
Licenza mailboxNoNo
Invio a destinatari esterniSì (nel rispetto delle policy del connettore)No (solo interni all’organizzazione)
Salvataggio in Sent ItemsNoNo
Limiti≈ 30 messaggi/min, 10.000 destinatari/giornoPiù permissivo (dipende da policy)Standard per posta anonima verso M365
Compatibilità con dispositivi legacyRichiede supporto OAuth o token bearersOttima (se disponibile IP statico o certificato)Ottima per invio interno

Procedura rapida per SMTP AUTH con OAuth

Questo percorso è la soluzione future‑proof per app e servizi.

Prerequisiti

  • Mailbox di servizio con licenza Exchange Online.
  • SMTP AUTH abilitato a livello tenant o per la mailbox.
  • Supporto TLS 1.2/1.3 in uscita verso Internet.

Passo 1 — Abilita SMTP AUTH

Tenant‑wide (se era disabilitato) e override per l’account di servizio.

# Modulo ExchangeOnlineManagement richiesto
Connect-ExchangeOnline

Verifica stato globale

Get-TransportConfig | FL SmtpClientAuthenticationDisabled

Abilita a livello tenant (se necessario)

Set-TransportConfig -SmtpClientAuthenticationDisabled $false

Abilita per la mailbox di servizio

Set-CASMailbox user@dominio -SmtpClientAuthenticationDisabled $false

Controllo puntuale

Get-CASMailbox user@dominio | FL SmtpClientAuthenticationDisabled 

Passo 2 — Registra l’app in Entra ID

  1. Crea una App registrationsingle‑tenant”.
  2. Aggiungi Application permission su “Office 365 Exchange Online”: SMTP.SendAsApp.
  3. Concedi Admin consent all’organizzazione.
  4. Genera un client secret o usa un certificato (consigliato per ambienti server).

Passo 3 — Registra il Service Principal in Exchange

Dopo il consenso, abilita l’app ad accedere alla mailbox target (necessario per IMAP/POP, consigliato per chiarezza anche con SMTP).

Connect-ExchangeOnline

Crea il Service Principal in Exchange (usa AppId/ObjectId dell'Enterprise Application)

New-ServicePrincipal -AppId  -ObjectId  -DisplayName "SMTP OAuth App"

Concedi accesso alla mailbox target (lettura non obbligatoria per SMTP, ma utile per scenari POP/IMAP)

Add-MailboxPermission -Identity user@dominio -User  -AccessRights FullAccess

Se devi inviare "Send As" un'altra casella, concedi esplicitamente SendAs

Add-RecipientPermission -Identity altro@dominio -Trustee  -AccessRights SendAs 

Passo 4 — Ottieni il token

Per client credentials usa lo scope https://outlook.office365.com/.default. Il token ha durata tipica ~60 minuti: automatizza il refresh.

POST https://login.microsoftonline.com/{tenant}/oauth2/v2.0/token
Content-Type: application/x-www-form-urlencoded

clientid=
&clientsecret=
&granttype=clientcredentials
&scope=https%3A%2F%2Foutlook.office365.com%2F.default 

Passo 5 — Configura l’SMTP

  • Host: smtp.office365.com
  • Porta: 587 (STARTTLS)
  • TLS minimo: 1.2
  • Username: UPN della mailbox (es. user@dominio.tld)
  • Password: token (Bearer) in formato SASL XOAUTH2

Esempi di codice pronti da usare

.NET (C#) con MSAL + MailKit

using System.Threading.Tasks;
using MailKit.Net.Smtp;
using MailKit.Security;
using MimeKit;
using Microsoft.Identity.Client;

class Program
{
static async Task Main()
{
var tenantId = "";
var clientId = "";
var clientSecret = "";
var from = "[service@dominio.tld](mailto:service@dominio.tld)"; // UPN/mailbox con licenza
```
    var app = ConfidentialClientApplicationBuilder.Create(clientId)
        .WithClientSecret(clientSecret)
        .WithAuthority($"https://login.microsoftonline.com/{tenantId}")
        .Build();

    var result = await app
        .AcquireTokenForClient(new[] { "https://outlook.office365.com/.default" })
        .ExecuteAsync();

    var token = result.AccessToken;

    var msg = new MimeMessage();
    msg.From.Add(MailboxAddress.Parse(from));
    msg.To.Add(MailboxAddress.Parse("destinatario@esempio.tld"));
    msg.Subject = "Prova SMTP OAuth2";
    msg.Body = new TextPart("plain") { Text = "Ciao da SMTP OAuth2" };

    using var smtp = new SmtpClient();
    await smtp.ConnectAsync("smtp.office365.com", 587, SecureSocketOptions.StartTls);
    var oauth2 = new MailKit.Security.SaslMechanismOAuth2(from, token);
    await smtp.AuthenticateAsync(oauth2);
    await smtp.SendAsync(msg);
    await smtp.DisconnectAsync(true);
}
```
} 

Python con MSAL + smtplib (XOAUTH2)

import base64, smtplib
from email.mime.text import MIMEText
import msal

tenantid = ""
clientid = ""
clientsecret = ""
user = "[service@dominio.tld](mailto:service@dominio.tld)"  # UPN della mailbox

Token OAuth2 (client credentials)

app = msal.ConfidentialClientApplication(
client_id,
authority=f"[https://login.microsoftonline.com/{tenantid}](https://login.microsoftonline.com/{tenantid})",
clientcredential=clientsecret,
)
result = app.acquiretokenfor_client(scopes=["[https://outlook.office365.com/.default](https://outlook.office365.com/.default)"])
token = result["access_token"]

XOAUTH2 (SASL): base64("user=^Aauth=Bearer ^A^A")

auth_str = f"user={user}\x01auth=Bearer {token}\x01\x01"
authb64 = base64.b64encode(authstr.encode()).decode()

msg = MIMEText("Ciao da SMTP OAuth2")
msg["From"] = user
msg["To"] = "[destinatario@esempio.tld](mailto:destinatario@esempio.tld)"
msg["Subject"] = "Prova SMTP OAuth2"

with smtplib.SMTP("smtp.office365.com", 587) as s:
s.ehlo()
s.starttls()
s.ehlo()
s.docmd("AUTH", "XOAUTH2 " + auth_b64)
s.sendmail(msg["From"] [msg["To"]], msg.as_string()) 

Node.js con MSAL Node + Nodemailer

const { ConfidentialClientApplication } = require("@azure/msal-node");
const nodemailer = require("nodemailer");

const tenantId = "";
const clientId = "";
const clientSecret = "";
const user = "[service@dominio.tld](mailto:service@dominio.tld)"; // UPN mailbox

const cca = new ConfidentialClientApplication({
auth: {
clientId,
authority: `https://login.microsoftonline.com/${tenantId}`,
clientSecret,
},
});

(async () => {
const { accessToken } = await cca.acquireTokenByClientCredential({
scopes: ["[https://outlook.office365.com/.default](https://outlook.office365.com/.default)"],
});

const transport = nodemailer.createTransport({
host: "smtp.office365.com",
port: 587,
secure: false,
requireTLS: true,
auth: { type: "OAuth2", user, accessToken },
tls: { minVersion: "TLSv1.2" },
});

await transport.sendMail({
from: user,
to: "[destinatario@esempio.tld](mailto:destinatario@esempio.tld)",
subject: "Prova SMTP OAuth2",
text: "Messaggio inviato con token OAuth2",
});

console.log("Inviato!");
})().catch(console.error); 

Nota importante su MFA e SMTP

SMTP AUTH non supporta l’uso di password + MFA nel protocollo. Con OAuth 2.0, però, la MFA può essere richiesta durante il rilascio del token (flussi delegati). Per i servizi non interattivi è preferibile il flusso client credentials con SMTP.SendAsApp. In ogni caso, evita account “umani”: usa caselle dedicate con privilegi minimi e scadenza automatica dei segreti.

Alternative per dispositivi che non supportano OAuth

SMTP Relay con connettore

È la scelta più robusta per stampanti e MFP legacy. Prevede la creazione di un inbound connector in Exchange Online che riconosce l’origine tramite certificato o IP statico. Il dispositivo invia a porta 25 sull’endpoint MX del tuo dominio (non a smtp.office365.com). Pro e contro:

  • Pro: non serve licenza; supporta invio verso Internet; niente token; alta compatibilità.
  • Contro: richiede IP pubblico statico o certificato; la porta 25 può essere filtrata da ISP/firewall; niente Sent Items.

Checklist rapida: IP pubblico statico (o certificato valido con Subject/SAN del dominio), DNS e SPF corretti, connettore configurato per accettare dal tuo IP/certificato, MFP con TLS 1.2/1.3.

Direct Send

Il dispositivo invia a porta 25 verso l’endpoint MX del dominio senza autenticazione. È adatto quando devi spedire solo a destinatari interni all’organizzazione.

  • Pro: semplice; nessuna licenza; nessuna credenziale da proteggere.
  • Contro: non relaya verso Internet; niente Sent Items; dipende dalla reputazione IP e dalle regole anti‑spam.

Diagnostica e correzione degli errori comuni

Errore/rispostaCausa probabileRimedio
535 5.7.3 Authentication unsuccessfulBasic Auth disabilitata; token mancante/scaduto; SMTP AUTH disabilitato sulla mailboxUsa OAuth 2.0 e rinnova i token; abilita SmtpClientAuthentication per la mailbox
550 5.7.30 Basic authentication is not supported for Client SubmissionTenant nella finestra di rimozione definitiva della Basic AuthPassa a OAuth o a SMTP Relay
Time‑out in STARTTLS/HandshakeTLS < 1.2; proxy ispeziona TLS; porta 587/25 bloccataForza TLS 1.2/1.3; escludi l’ispezione; apri le porte in uscita
Mittente non autorizzato (5.7.60)La mailbox autenticata invia “Send As” un’altra casella senza permessiAggiungi Send As sulla casella target
Non arrivano copie in posta inviataUso di SMTP Relay o Direct SendPassa a Client Submission oppure archivia lato applicazione

Controlli amministrativi utili

  • Report “SMTP AUTH Clients Submission” in EAC: individua quali origini stanno ancora usando Basic o Modern Auth.
  • Message trace: verifica consegna/bounce e codici di errore.
  • Security defaults in Entra ID: se attivo, SMTP AUTH è già disabilitato a livello organizzazione.

Limiti, sicurezza e deliverability

  • Limiti SMTP AUTH: ~30 messaggi/min e ~10.000 destinatari/giorno (indicativi). Per volumi superiori valuta soluzioni dedicate (Graph/ACS/servizi esterni).
  • Token: scadenza ~60 minuti → implementare il refresh automatico e retry idempotenti.
  • Segreti: preferisci certificati a client‑secret; ruota e custodisci i segreti in un vault sicuro.
  • Permessi minimi: usa mailbox di servizio dedicate; concedi Send As solo ove necessario.
  • SPF/DKIM/DMARC: allinea i record per il dominio mittente; con SMTP Relay e Direct Send controlla in particolare SPF e firma DKIM.

Procedure operative complete

Abilitare SMTP AUTH per una mailbox specifica

Connect-ExchangeOnline
Set-CASMailbox service@dominio -SmtpClientAuthenticationDisabled $false
Get-CASMailbox service@dominio | FL SmtpClientAuthenticationDisabled

Abilitare/disabilitare SMTP AUTH a livello tenant

Connect-ExchangeOnline

Disabilita globalmente (hardening)

Set-TransportConfig -SmtpClientAuthenticationDisabled $true

Abilita globalmente (se richiesto da un progetto)

Set-TransportConfig -SmtpClientAuthenticationDisabled $false 

Creare un connettore per SMTP Relay (IP‑based)

  1. Recupera l’IP pubblico statico da cui invierà il dispositivo/app.
  2. In EAC crea un Inbound connector “From your organization’s email server”, autenticazione “By verifying the sender IP address”.
  3. Nel dispositivo configura come smart host l’endpoint MX del dominio (es. contoso-com.mail.protection.outlook.com), porta 25, TLS attivo.
  4. Verifica con un test di invio verso interno ed esterno (se previsto).

Quando serve davvero un provider esterno

  • Il software è proprietario e non verrà aggiornato a OAuth, e non puoi usare un connettore (no IP statico/porta 25 bloccata).
  • Hai bisogno di tracking, template, reportistica avanzata, reputazione IP dedicata o webhooks.
  • Superi costantemente i limiti di invio di Exchange Online.

In questi casi valuta servizi specializzati o, in ambito Microsoft, l’uso di piattaforme alternative basate su API con throughput elevato.

FAQ essenziali

Posso inviare con un account senza licenza?
No per Client Submission: è richiesta una mailbox con licenza. Con SMTP Relay/Direct Send non serve.

Posso continuare a usare username+password?
No: la Basic Auth è in rimozione definitiva. Aggiorna a OAuth o migra a Relay/servizi esterni.

La mia MFP non supporta OAuth, cosa faccio?
Usa SMTP Relay con connettore e IP statico, oppure Direct Send per invio interno.

Perché su porta 465 non funziona?
Exchange Online supporta Client Submission su 587 con STARTTLS; 465 non è previsto.

Come gestisco “Send As” di caselle diverse?
Con Client Submission assegna Send As alla casella target e usa l’indirizzo nel campo From. Con app‑only aggiungi anche il permesso Send As al service principal.

Esempio di checklist di migrazione

  1. Identifica tutti i sistemi che inviano via smtp.office365.com:587 con Basic.
  2. Per ciascuno, scegli: OAuth (se aggiornabile) / SMTP Relay / Provider esterno.
  3. Se OAuth: crea app Entra ID → SMTP.SendAsApp → Admin consent → New‑ServicePrincipal in Exchange → permessi su mailbox → implementa token + XOAUTH2.
  4. Se Relay: crea connettore, configura IP/certificato, aggiorna device a porta 25 verso MX, testa invio.
  5. Aggiorna SPF/DKIM/DMARC e monitora message trace.
  6. Rimuovi definitivamente password memorizzate e disabilita SMTP AUTH ove non più necessario.

Conclusioni

L’errore “Authentication unsuccessful, basic authentication is disabled” non dipende dal tuo codice: è l’effetto combinato di due cambiamenti lato Microsoft 365. Da un lato serve una mailbox con licenza per il client‑submission; dall’altro la Basic Auth è stata (o sarà a breve) eliminata dalla piattaforma. Aggiornare l’autenticazione a OAuth 2.0 (permesso SMTP.SendAsApp, flusso client credentials) o passare a SMTP Relay/soluzioni esterne risolve definitivamente e mette al sicuro l’operatività futura.


Riferimenti interni: [1] Guida all’invio da dispositivi/app (confronto Client Submission/Relay/Direct Send, requisiti di licenza e limiti). [2] Comunicazione ufficiale di ritiro della Basic Auth su Client Submission con timeline 2026. [3] Procedura “Enable/Disable SMTP AUTH in Exchange Online”.

Indice