Doel
Mails verzenden vanuit een ASP.NET MVC 5 web application: als gebruikers zich inschrijven voor een activiteit automatisch een mail zenden.
De basics
Op zich is het verzenden van een mail niet moeilijk: gebruik maken van de classes SmtpClient en MailMessage uit de namespace System.Net.Mail.
Idee
Om dit netjes af te handelen, wil ik graag de instellingen voor de SMTP-client uitlezen uit web.config, daar een SmtpClient-object mee instantiëren en die gebruiken in een MVC Controller of de Domain Controller. Om het helemaal netjes te maken (versta: performantie) wil ik die SMTP Client maar 1 x instellen (waardoor de instellingen uit web.config maar 1 x ingelezen moeten worden).
Wat is er?
Ik heb aan oplossing uitgewerkt die parallel loopt met hoe Auth0 wordt geïmplementeerd: in Startup.Configuration(IAppBuilder app) roep ik de ConfigureMail-methode op om daar OWIN interface IAppBuilder als parameter aan door te geven:
Op deze manier wordt de web.config slechts 1x uitgelezen. Zouden de gegevens daarin veranderen, dan wordt AppPool automatisch gerecycled en die gegevens spontaan opnieuw ingelezen.
Die ConfigureMail-methode is als volgt gedefinieerd:
Het relevante gedeelte van web.config ziet er als volgt uit:
Waar loopt het mis?
Op het feit dat ik geen idee heb hoe ik vanuit een MVC Controller of de Domain Controller aan die ingestelde SMTP Client geraak, ook niet na verscheidene uren googelen (allicht gebruik ik niet de juiste term). Voor .NET Core lijkt het wat makkelijker te vinden, maar het gebruikte framework is .NET Framework v4.6.1 (niet ideaal, ik weet het, maar omwille van beschikbaarheid op web hosting).
Wat verwacht ik van jullie?
THX!!!
Mails verzenden vanuit een ASP.NET MVC 5 web application: als gebruikers zich inschrijven voor een activiteit automatisch een mail zenden.
De basics
Op zich is het verzenden van een mail niet moeilijk: gebruik maken van de classes SmtpClient en MailMessage uit de namespace System.Net.Mail.
Idee
Om dit netjes af te handelen, wil ik graag de instellingen voor de SMTP-client uitlezen uit web.config, daar een SmtpClient-object mee instantiëren en die gebruiken in een MVC Controller of de Domain Controller. Om het helemaal netjes te maken (versta: performantie) wil ik die SMTP Client maar 1 x instellen (waardoor de instellingen uit web.config maar 1 x ingelezen moeten worden).
Wat is er?
Ik heb aan oplossing uitgewerkt die parallel loopt met hoe Auth0 wordt geïmplementeerd: in Startup.Configuration(IAppBuilder app) roep ik de ConfigureMail-methode op om daar OWIN interface IAppBuilder als parameter aan door te geven:
C#:
1
2
3
4
5
6
7
8
| public partial class Startup { public void Configuration(IAppBuilder app) { ConfigureAuth(app); ConfigureMail(app); } } |
Op deze manier wordt de web.config slechts 1x uitgelezen. Zouden de gegevens daarin veranderen, dan wordt AppPool automatisch gerecycled en die gegevens spontaan opnieuw ingelezen.
Die ConfigureMail-methode is als volgt gedefinieerd:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
| public partial class Startup { private static string mailServer = ConfigurationManager.AppSettings["mail:SmtpServer"]; private static string mailPort = ConfigurationManager.AppSettings["mail:SmtpPort"]; private static string mailUser = ConfigurationManager.AppSettings["mail:User"]; private static string mailPassword = ConfigurationManager.AppSettings["mail:Password"]; private static string mailSenderName = ConfigurationManager.AppSettings["mail:SenderName"]; public void ConfigureMail(IAppBuilder app) { // Create a mailClient that can be used in the app int mailPortNumber; if (!int.TryParse(mailPort, out mailPortNumber)) { mailPortNumber = 587; // default TLS value } SmtpClient smtpClient = new SmtpClient(mailServer, mailPortNumber); smtpClient.UseDefaultCredentials = false; smtpClient.Credentials = new System.Net.NetworkCredential(mailUser, mailPassword); smtpClient.DeliveryMethod = SmtpDeliveryMethod.Network; smtpClient.EnableSsl = true; // Add the SMTP-client to the app, so it can be used in MVC/Domain Controller --> CORRECT???? app.Properties.Add("smtpClient", smtpClient); } } |
Het relevante gedeelte van web.config ziet er als volgt uit:
XML:
1
2
3
4
5
6
7
| <appSettings> <add key="mail:SmtpServer" value="smtp.office365.com" /> <add key="mail:SmtpPort" value="587" /> <add key="mail:User" value="mailaccount" /> <add key="mail:Password" value="password-mailaccount" /> <add key="mail:SenderName" value="sendername" /> </appSettings> |
Waar loopt het mis?
Op het feit dat ik geen idee heb hoe ik vanuit een MVC Controller of de Domain Controller aan die ingestelde SMTP Client geraak, ook niet na verscheidene uren googelen (allicht gebruik ik niet de juiste term). Voor .NET Core lijkt het wat makkelijker te vinden, maar het gebruikte framework is .NET Framework v4.6.1 (niet ideaal, ik weet het, maar omwille van beschikbaarheid op web hosting).
Wat verwacht ik van jullie?
- is mijn redenering om het zo aan te pakken hoegenaamd wel de juiste?
- hoe raak ik dan aan dat object?
THX!!!
[ Voor 5% gewijzigd door edeboeck op 07-03-2020 16:38 . Reden: Gedeelte van web.config toegevoegd ]