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.
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
Fattore | Dettagli | Fonte |
---|---|---|
Licenza obbligatoria | Per 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 Auth | Exchange 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 default | Nei 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.
Esigenza | Soluzione consigliata | Note operative |
---|---|---|
Applicazione aggiornata (librerie moderne, possibilità di gestire token) | SMTP AUTH + OAuth 2.0 | Registra 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 OAuth | SMTP Relay (con connettore e IP statico) oppure Direct Send | Non 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 / B2C | Provider 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
Caratteristica | Client Submission (SMTP AUTH) | SMTP Relay (connettore) | Direct Send |
---|---|---|---|
Autenticazione | OAuth 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/Destinazione | 587 → smtp.office365.com + STARTTLS | 25 → endpoint MX del tuo dominio (*.mail.protection.outlook.com ) | 25 → endpoint MX del tuo dominio |
Licenza mailbox | Sì | No | No |
Invio a destinatari esterni | Sì | Sì (nel rispetto delle policy del connettore) | No (solo interni all’organizzazione) |
Salvataggio in Sent Items | Sì | No | No |
Limiti | ≈ 30 messaggi/min, 10.000 destinatari/giorno | Più permissivo (dipende da policy) | Standard per posta anonima verso M365 |
Compatibilità con dispositivi legacy | Richiede supporto OAuth o token bearers | Ottima (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
- Crea una App registration “single‑tenant”.
- Aggiungi Application permission su “Office 365 Exchange Online”:
SMTP.SendAsApp
. - Concedi Admin consent all’organizzazione.
- 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/risposta | Causa probabile | Rimedio |
---|---|---|
535 5.7.3 Authentication unsuccessful | Basic Auth disabilitata; token mancante/scaduto; SMTP AUTH disabilitato sulla mailbox | Usa OAuth 2.0 e rinnova i token; abilita SmtpClientAuthentication per la mailbox |
550 5.7.30 Basic authentication is not supported for Client Submission | Tenant nella finestra di rimozione definitiva della Basic Auth | Passa a OAuth o a SMTP Relay |
Time‑out in STARTTLS/Handshake | TLS < 1.2; proxy ispeziona TLS; porta 587/25 bloccata | Forza 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 permessi | Aggiungi Send As sulla casella target |
Non arrivano copie in posta inviata | Uso di SMTP Relay o Direct Send | Passa 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)
- Recupera l’IP pubblico statico da cui invierà il dispositivo/app.
- In EAC crea un Inbound connector “From your organization’s email server”, autenticazione “By verifying the sender IP address”.
- Nel dispositivo configura come smart host l’endpoint MX del dominio (es.
contoso-com.mail.protection.outlook.com
), porta 25, TLS attivo. - 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
- Identifica tutti i sistemi che inviano via
smtp.office365.com:587
con Basic. - Per ciascuno, scegli: OAuth (se aggiornabile) / SMTP Relay / Provider esterno.
- Se OAuth: crea app Entra ID →
SMTP.SendAsApp
→ Admin consent → New‑ServicePrincipal in Exchange → permessi su mailbox → implementa token + XOAUTH2. - Se Relay: crea connettore, configura IP/certificato, aggiorna device a porta 25 verso MX, testa invio.
- Aggiorna SPF/DKIM/DMARC e monitora message trace.
- 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”.