Dans l’informatique, nous avons souvent besoin d’envoyer des emails de masse. Il peut s’agir d’une plateforme de ticketing qui informe de l’évolution d’un ticket, d’une application de vente qui envoie des confirmations de commandes, factures PDF etc. Bref, les usages ne manquent pas. ✉️
Et le problème c’est que bien souvent il faut payer des solutions professionnelles comme MailGun, Brevo, etc. Et le moins que l’on puisse dire c’est que les prix sont généralement élevés pour un besoin si simple. Je prends l’exemple des prix de Brevo ci-dessous qui est une des alternatives les plus connues (et encore l’offre à 6,33 n’existait pas il y a encore quelques temps).
J’ai toujours eu du mal à comprendre que ce genre de besoins puissent être vendus si cher – en particulier lorsque vous n’avez pas besoins de fonctionnalités supplémentaires comme le tracking ou les statistiques d’ouverture. Mais pour les usages simples, vous pouvez tout à fait utiliser votre compte Gmail / Google Workspace ou Office 365 (dans la mesure où le volume d’emails reste réduit).
Si vous souhaitez utiliser une BAL Microsoft 365 pour envoyer des emails transactionnels, n’oubliez pas que vous devez respecter les règles suivantes :
Je vous propose de voir comment nous pouvons faire de relay SMTP avec un compte M365 qui dispose d’une BAL partagée Exchange Online. ⬇️
Déjà, il vous faut un compte utilisateur M365 (UserMailBox) qui dispose d’une licence même un Exchange Online Plan 1 suffira dans votre cas. Ensuite, nous allons créer une boîte partagée (SharedMailBox). Dans mon cas, je lui ai donné le nom de « noreply » (vous comprenez sans aucun doute pourquoi). C’est l’adresse email qui sera affichée pour les expéditions.
Au niveau des délégations, j’ai donné à mon compte utilisateur (UserMailbox) la délégation de pouvoir faire du Send on Behalf et du Send as (c’est nécessaire car je ne vais pas m’authentifier directement avec la boîte partagée mais avec mon compte utilisateur à moi). Donc dans les 2 options ci-dessous, rajoutez bien la BAL associée à votre compte utilisateur.
Une fois que c’est fait, nous devons activer l’option « SMTP AUTH« . Par défaut, cette option est désactivée sur l’ensemble de notre Tenant et c’est très bien.
Mais nous allons toutefois activer cette option pour cette seule boîte mail partagée. Pour ce faire procédez-comme suit depuis une invite d’Exchange Online :
# Connexion à Exchange Online
Connect-ExchangeOnline
# Vérifier l’état actuel
Get-CASMailbox -Identity noreply@domaine.fr | Select SmtpClientAuthenticationDisabled
# Activer si besoin
Set-CASMailbox -Identity noreply@domaine.fr -SmtpClientAuthenticationDisabled $false
Nous allons donc utiliser notre compte personnel pour nous connecter à la boîte mail partagée. Pour ce faire et considérant que notre Tenant est sécurisé avec du MFA – nous allons avoir besoin d’une application password pour notre compte utilisateur.
Pour ce faire avec votre compte, allez directement sur l’URL suivante : https://mysignins.microsoft.com/security-info et créez un nouvel application password. Attention, la génération est unique donc notez bien le mot de passe. Il vous permettra d’éviter le MFA pour ce besoin de relay SMTP.
Nous pouvons désormais tester !
Vous pouvez utiliser le script suivant depuis votre ordinateur pour tester l’envoie d’un email :
$O365User = "prenom.nom@domaine1.fr"
$FromAddress = "noreply@domaine1.fr"
$ToAddress = "destinataire@domaine2.com"
$AppPassword = "app-password" # A remplacer
$msg = New-Object System.Net.Mail.MailMessage
$msg.From = $FromAddress
$msg.To.Add($ToAddress)
$msg.Subject = "Test local SMTP"
$msg.Body = "✅ Mail envoyé depuis mon poste (SmtpClient)."
$smtp = New-Object System.Net.Mail.SmtpClient("smtp.office365.com", 587)
$smtp.EnableSsl = $true
$smtp.Credentials = New-Object System.Net.NetworkCredential($O365User, $AppPassword)
$smtp.Send($msg)
Write-Host "✅ Mail envoyé avec succès."
Après quelques secondes, vous devriez bien recevoir l’email de test dans votre BAL.
Pour aller plus loin, nous pouvons optimiser notre configuration afin qu’elle puisse être consommée par d’autres outils comme Azure Automation tout en protégant notre Application Password dans un Azure Key Vault. 🔐
Pour ce faire, procédez comme suit. Créez un Key Vault et ajoutez un secret avec l’application password que vous avez précédemment généré.
Une fois que c’est bon, vous pouvez créer un nouveau compte Azure Automation. J’ai fait de nombreux articles sur ce service donc je ne vais pas tout reprendre en termes de configuration. Ce qui est important c’est que dans la configuration de votre Azure Automation, vous devez définir des permissions sur l’Object Principal ID afin de lui permettre de voir le contenu de votre Key Vault et d’en consommer les données.
N’oubliez donc pas de lui attribuer les permissions « Key Vault Secrets User« . Cela va nous permettre de construire un code propre dans Azure Automation sans pour autant y mettre en clair notre mot de passe. 🔐
Si tout est bon, vous pouvez maintenant créer un Runbook avec le code PowerShell exemple que je vous propose ci-dessous :
# ====== PARAMÈTRES ======
$KeyVaultName = "keyvault-name"
$SecretName = "smtp-app-password" # Nom de mon secret qui contient mon app password
$O365User = "prenom.nom@domaine1.fr" # compte O365 lié au mot de passe d’appli
$From = "noreply@domaine1.fr" # shared mailbox (Send As requis)
$To = "destinataire@domaine2.com"
$Subject = "Test SMTP via Azure Automation + Key Vault (PS 5.1)"
$Body = "Hello, mail envoyé depuis Azure Automation (SMTP AUTH O365)."
$IsBodyHtml = $false
# =========================
# 1) Auth Azure via Managed Identity de l’Automation Account
Connect-AzAccount -Identity | Out-Null
# 2) Récupération du secret dans Key Vault
$secretObj = Get-AzKeyVaultSecret -VaultName $KeyVaultName -Name $SecretName
if ($secretObj.SecretValueText) {
$pwd = $secretObj.SecretValueText
} else {
$pwd = [Runtime.InteropServices.Marshal]::PtrToStringUni(
[Runtime.InteropServices.Marshal]::SecureStringToBSTR($secretObj.SecretValue)
)
}
# 3) Construction du message
$message = New-Object System.Net.Mail.MailMessage
$message.From = $From
$To.Split(';') | ForEach-Object { if ($_ -and $_.Trim()) { $message.To.Add($_.Trim()) } }
$message.Subject = $Subject
$message.Body = $Body
$message.IsBodyHtml = $IsBodyHtml
# 4) Client SMTP Office 365
$smtp = New-Object System.Net.Mail.SmtpClient("smtp.office365.com", 587)
$smtp.EnableSsl = $true
$smtp.Credentials = New-Object System.Net.NetworkCredential($O365User, $pwd)
try {
$smtp.Send($message)
Write-Output "✅ Mail envoyé depuis $From vers $($message.To -join ', ')"
}
catch {
Write-Error "❌ Échec envoi SMTP : $($_.Exception.Message)"
}
finally {
if ($message) { $message.Dispose() }
if ($smtp) { $smtp.Dispose() }
}
Il ne vous reste plus qu’à exécuter votre runbook pour confirmer le succès et l’envoie de votre email de test.
L’email a bien été envoyé… et nous l’avons reçu ci-dessous.
Nous avons mis en place une solution de Relay SMTP pour faire de l’email transactionnel via une BAL partagée sur notre tenant M365. Cette BAL partagée ne nous coûte rien en termes de licences.
De plus, avec Azure Automation, nous pouvons relayer des emails sans avoir à communiquer un mot de passe en clair dans notre code. Nous pourrions même aller plus loin avec une Azure Function par exemple afin de permettre la consommation de ce relay SMTP par d’autres services / personnes de notre organisation.
Free Mobile : Une Innovation avec l'Intégration d'un VPN Gratuit dans ses Forfaits Introduction Free…
Proton suspend des comptes de journalistes : 3 raisons qui soulèvent des inquiétudes Introduction Proton…
NAS UGREEN DXP2800 2 baies Pendant plus de dix ans, j’ai été un utilisateur fidèle…
Authentification multi facteur obligatoire sur Azure : Phase 2 dès octobre 2025 Introduction L'authentification multi…
Bruxelles inflige une amende record de 3 milliards d'euros à Google pour pratiques publicitaires Introduction…
Introduction Trello, la célèbre plateforme de gestion de projets, a récemment fait parler d'elle avec…