Met MercatorTunnel.dll versie 10.10.165 of hoger is het mogelijk om e-mails te verzenden via de Office 365 Graph Api. Deze manier van e-mail versturen maakt geen gebruik van het SMTP-protocol. Om redenen van backwards compatibility van bestaande programmering blijft de code echter gelijk aan die op deze pagina.
De grootste moeilijkheid bij het opzetten van dit systeem is de configuratie van de toegangsrechten in het Azure-portaal.
Het eerste stukje informatie dat nodig is, is de directory ID (Tenant). Deze informatie is beschikbaar in het Azure-portaal, door te klikken op het tandwiel (Instellingen).
Vervolgens moet een toepassing worden gecreëerd en geconfigureerd. Daarvoor moet u
- selecteer Microsoft Entra ID in het menu aan de linkerkant
- selecteer Toepassingsregistraties
- klik op Nieuwe registratie
- Geef deze toepassing een naam, bijvoorbeeld MercatorMails
- Let op de applicatie ID (klant), dit is uw ClientId
- Klik op Een certificaat of secret toevoegen
- Klik op New client secret
- Kies een tijdsduur
- Dit is uw ClientSecret. Merk op dat deze waarde slechts eenmaal zichtbaar is.
- Klik op Geautoriseerde API's en configureer deze machtigingen
In het algemeen is de Userid het hoofd e-mailadres van het account.
Dan is de code om een e-mail te versturen gewoon :
IneoSmtp.Smtp.SendMailOffice365GraphParameters sendMailOffice365GraphParameters = new Smtp.SendMailOffice365GraphParameters
(
"ClientId",
"ClientSecret",
"Tenant",
"UserId"
);
IneoSmtp.Smtp smtp = new IneoSmtp.Smtp
{
SendMailOffice365GraphParams = sendMailOffice365GraphParameters,
SenderEmail = "sender@mail.com",
Recipient = "\"Paul Petit\"<destinataire1@mail.com>",
CC = "destinataire2@mail.com",
Subject = "Test de mail via Office 365",
Filenames = @"C:\Test\test.pdf",
};
if (smtp.SendMail())
MessageBox.Show("OK");
else
MessageBox.Show(smtp.Error);
Als SenderEmail niet identiek aan UserId is, moeten de rechten "Send as" worden gegeven aan de UserId mailbox.
Het is belangrijk op te merken dat de ClientSecret een beperkte levensduur heeft. Daarom moet het op een centrale plaats worden ondergebracht, zodat het gemakkelijk kan worden bijgewerkt. Voordat deze vervalt, moet de ClientSecret worden vernieuwd in het Azure-portaal en moet de nieuwe waarde ervan worden gebruikt in het hierboven beschreven mechanisme.
Om een gecentraliseerde en veilige opslag van de ClientSecret mogelijk te maken, stellen wij de volgende methode voor:
1. Maak een vrije tabel aan met de naam Secrets
2. Voeg een memo toe aan deze tabel met de naam Secret
alter table free_table_secrets add Secret varchar(max) not null default ''
3. Versleutel deze kolom SECRET
4. Voeg in deze vrije tabel een rij toe:
- Id = Off365Secr
- Secret = de waarde van de ClientSecret
5. Wijzig de bovenstaande code door de ClientSecret als volgt op te halen:
string clientSecret = MercatorController.xFunctions.xLookUpString("free_table_secrets", "id", "Off365Secr", "secret");
We kunnen ook een centralisatie van de 4 parameters opzetten, door 4 records in de vrije tabel aan te maken :
- Off365ClId : ClientId
- Off365ClSe : ClientSecret
- Off365Tena : Tenant
- Off365UId : UserId
Deze accessor verschaft rechtstreeks het object SendMailOffice365GraphParameters :
public static IneoSmtp.Smtp.SendMailOffice365GraphParameters SendMailOffice365GraphParameters
{
get //!\ niet statisch opslaan omdat de clientSecret zal veranderen
{
var l = Api.Zselect<SecretDescriptor>(Globals.RepData, "select id,secret from free_table_secrets where id like 'Off365%'");
if (l == null)
throw new ApplicationException("SendMailOffice365GraphParameters SQL error : " + Api.LastError);
foreach(string key in new string[4] { "Off365ClId", "Off365ClSe", "Off365Tena", "Off365UId" })
if (!l.Any(p => p.Id == key))
throw new ApplicationException($"SendMailOffice365GraphParameters key \"{key}\" is missing !");
return new IneoSmtp.Smtp.SendMailOffice365GraphParameters(
l.First(p => p.Id == "Off365ClId").Secret,
l.First(p => p.Id == "Off365ClSe").Secret,
l.First(p => p.Id == "Off365Tena").Secret,
l.First(p => p.Id == "Off365UId").Secret);
}
}
public class SecretDescriptor
{
public string Id { get; set; }
public string Secret { get; set; }
}
In de klasse IneoSmtp.Smtp is het zo dat SendMailOffice365GraphParams niet null is, bepalend dat de e-mail via de Graph Api naar Office365 wordt gestuurd. Alle andere eigenschappen behouden een soortgelijke werking. De volgende eigenschappen zijn echter nutteloos, en worden daarom genegeerd:
- MailServer
- ServerPort
- Username
- Password
- EnableSsl
- AlternateViews
Te lezen: Deprecation of Basic authentication in Exchange Online