ASPNL logo (1 kb)
zondag 6 juli 2008




Microsoft MVP

.NET Codewise Community
<< vorige | overzicht | volgende >>

Email Functionaliteiten In Webapplicaties

Door Tim Musschoot
20 augustus 2003

1. Inleiding

Een van de meest voorkomende vragen op nieuwsgroepen en forums betreft het versturen van email vanuit een ASP pagina. Hoewel email formulieren een van de meest frequente toepassingen zijn van de ASP technologie, blijken veel beginnende web programmeurs er moeite mee te hebben om deze zelf foutloos te implementeren. In dit artikel wordt een overzicht gegeven van de verschillende opties die u hebt, en hoe u deze in de praktijk kunt toepassen.

2. Algemeen

ASP is in feite niets meer dan een serverside scripting technologie, toegepast op webdevelopment. Het laat u toe om een serverside scripting taal zoals VBScript en JScript in een webpagina te gebruiken. In plaats van een volledig nieuw platform op te bouwen, gaan men zich oriënteren op de mogelijkheden van die bestaande scripting talen. Het voordeel van die scripting talen is dat men min of meer toegang heeft tot het volledige server systeem (afhankelijk van de ingestelde permissies uiteraard). Vooral de mogelijkheid om COM objecten te gaan gebruiken maakt dit bijzonder interessant. ASP maakt namelijk gebruik van COM objecten om specifieke zaken te gaan verwezenlijken (denk maar aan database operaties, email functionaliteit, ...). In principe kan men alle externe interfaces die aan hand van een COM object geïmplementeerd zijn gaan aanspreken vanuit een ASP pagina.

Om email-functionaliteiten te gaan gebruiken in een webpagina, gaat men een zogenaamd email object, dat op de webserver is geïnstalleerd, in de webpagina oproepen. Er bestaan nu echter een aantal verschillende van die email objecten:

Voor de betalende componenten verwijs ik u door naar de website van de producent. Daar kunt u voorbeelden zijn hoe u de component kunt gebruiken. In dit artikel wordt CDONTS als referentie gebruikt.

3.CDONTS

3.1 Installatie

Deze component wordt normaal gezien standaard geïnstalleerd als u IIS 4.0 installeert. De component bestaat uit één DLL : cdonts.dll. De afkorting betekent Collaboration Data Objects for NT Server. Zoals het tweede gedeelte van de naam laat vermoeden is dit niet de enige versie die bestaat. Het is een beperkte versie van CDO. Deze laatste is niet gratis, en wordt met Exchange Server geïnstalleerd. Naast email functionaliteit biedt de volledige versie ook de mogelijkheid tot beheer van contactpersonen, afspraken, ... Het wordt door Microsoft omschreven als een Active Messaging Library, die samenwerkt met Exchange Server. Meer info over CDO vindt u op http://www.cdolive.com

Zoals CDO het programma Microsoft Exchange Server nodig heeft, heeft CDONTS de SMTP service nodig die u optioneel met IIS kunt installeren. De component beschikt namelijk niet over een eigen SMTP server, die gebruikt wordt om email te kunnen versturen, maar gebruikt deze van IIS. Om de functionaliteit die deze component biedt te kunnen gebruiken, dient u ervoor te zorgen dat de SMTP service goed geïnstalleerd en geconfigureerd is. Hiervoor verwijs ik u naar het artikel op http://www.more.net/technical/netserv/servers/microsoft/iis4smtpnt4.html#configure

3.2 Gebruik

3.2.1. Creatie van een nieuw object
CDONTS is in feite een bibliotheek met een aantal objecten. Indien u een email wenst aan te maken, dan creëert u een instantie van het NewMail object. Dit doet u als volgt:

Dim objMsg
Set objMsg = Server.CreateObject("CDONTS.NewMail")
' Gebruik hier de functionaliteit van het NewMail object
objMsg = nothing

Zoals alle COM objecten die u in ASP gebruikt, roept u de Server.CreateObject functie aan om een nieuwe instantie van het object aan te maken.

Indien de installatie van de CDONTS dll niet of verkeerd gebeurd is, dan krijgt u hoogstwaarschijnlijk volgende foutmelding te zien:

Server object error 'ASP 0177 : 800401f3'
Server.CreateObject Failed
<asp_pagina_naam>.asp, line <lijn_met_createobject_instructie>
Invalid class string

Indien dit het geval is, moet u de IIS SMTP service herinstalleren.

3.2.2.Attributen van NewMail
In vorige paragraaf werd uitgelegd hoe u een nieuw email object kunt aanmaken. In deze paragraaf gaan we de verschillende eigenschappen van de email invullen (de velden aan, van, onderwerp, ...). Volgende tabel geeft een overzicht van de meestgebruikte velden die u kunt ingeven:

Veldnaam Verplicht Omschrijving
From Ja Het email adres van de afzender van de afzender van de mail
To Ja Het email adres van de geadresseerde. U kunt verschillende email adressen ingeven als u ze van elkaar scheidt door een puntkomma
Cc Neen De geadresseerden uit het Cc veld. U kunt opnieuw verschillende email adressen ingeven als u ze van elkaar scheidt door een puntkomma
Bcc Neen De geadresseerden uit het Bcc veld. U kunt opnieuw verschillende email adressen ingeven als u ze van elkaar scheidt door een puntkomma
Subject Neen Het onderwerp van de mail
BodyFormat Neen 0 : Het bericht bevat HTML code (HTML tekstindeling)
1 : Het bericht bevat geen opmaakcodes, maar gewoon tekst (default)
Body Neen De inhoud van het bericht. Indien u een bericht in HTML opmaak wenst te versturen, dient u hier HTML code in te geven, en moet in het BodyFormat veld de waarde 0 ingesteld worden.
MailFormat Neen 0 : Er wordt MIME encoding gebruikt om het bericht te coderen
1 : Er wordt tekstcodering gebruikt om het bericht te coderen (default)

Deze optie is enkel van belang indien u bijlagen wenst toe te voegen. Indien u een bijlage toevoegt die volgens het base64 algoritme gecodeerd wordt, dan zal deze optie automatisch de waarde 0 krijgen.
Importance Neen 0 : Dit bericht heeft een lage prioriteit
1 : Dit bericht heeft een normale prioriteit (default)
2 : Dit bericht heeft prioriteit hoog

3.2.3.Attachments
Om een bijlage aan uw email toe te voegen kunt u volgende functie gebruiken:
AttachFile(String source, String fileName, long encodingMethod) Hierbij is:

  • source : de locatie waar het bestand zich bevindt (pad + bestandsnaam)
  • fileName : de naam die je aan deze attachment wil geven (optioneel)
  • encodingMethod : de manier waarop de bijlage gecodeerd moet worden (optioneel)
In volgende tabel vindt u de mogelijkheden.

0 UUEncode (default)
1 MIME Encode.
Indien u deze optie selecteert wordt de MailFormat parameter automatisch op 0 (= MIME encoding) geplaatst.

3.2.4.Extra Headers
Wie vertrouwd is met het SMTP protocol (Simple Mail Transfer Protocol) weet dat er naast de standaard headers (from, to, ...) nog een aantal extra headers gebruikt kunnen worden (de zogenaamde X-Headers). Deze kunnen vanaf versie 1.2 van CDO for NTS aan een email toegevoegd worden. Een omschrijving van deze headers is hier niet aan de orde. Het volgende voorbeeld illustreert enkel de manier waarop u zelf headers kunt toevoegen.

Dim objMsg
Set objMsg = Server.CreateObject("CDONTS.NewMail")
objMsg.Value("Reply-To") = "The Boss <myemail@microsoft.com>
' vul de standaard headers in en verstuur de mail
objMsg = nothing

Via de NewMail::Value(<key>) = <value> syntax kunt u zelf headers toevoegen. Let er wel op dat X-Headers niet door alle email clients op dezelfde manier behandeld worden.

3.2.5. Verzenden
De email kan verstuurd worden wanneer u de functie NewMail::Send oproept. Wanneer de email met success werd verstuurd, dan wordt de inhoud ervan ongeldig. Het is niet mogelijk om het object nog voor andere doeleinden te gebruiken. U moet het object gelijkstellen aan nothing (of null in javascript) opdat het gealloceerde geheugen terug vrijgegeven zou worden.

3.2.6. Voorbeeld
Volgende voorbeeldcode demonstreert hoe u vanuit een ASP pagina een email kunt versturen. Indien u deze code wenst te gebruiken, plak deze dan gewoon in uw pagina, en vervang de gegevens (email adressen, onderwerp, ...) door de gegevens die bij u van toepassing zijn.

Dim myMail
Set myMail = CreateObject("CDONTS.NewMail")
myMail.From = "Example@microsoft.com"
myMail.To = "Someone@microsoft.com"
myMail.Subject = "Sample Message"
myMail.Body = "This is a sample message."
myMail.AttachFile "d:\sample.txt"
myMail.Send
Set myMail = Nothing

4.Windows 2000 en Windows XP

Wie overschakelt naar IIS 5.1 of IIS 6 kan tot onaangename verassingen komen te staan. Alle email formulieren die op CDONTS gebaseerd zijn blijken plots niet meer te werken. De reden hiervoor is dat de oude CDO component vervangen is door een nieuwe versie. Beide versies zijn echter niet code compatibel.
Om dit probleem op te lossen hebt u in principe twee mogelijkheden. Ofwel installeert u de CDONTS component op de nieuwe webserver, ofwel past u uw code aan.

4.1.Installatie CDONTS

Het installeren van de oude component op uw nieuwe server is relatief eenvoudig. U kopieert het bestand cdonts.dll in de system32 directory van Windows, en via regsvr32.exe cdonts.dll registreert u de component in de Windows COM database. Het resultaat is dat uw oude mailformulieren opnieuw zouden kunnen werken. Er kunnen hier echter geen garanties over gegeven worden, en deze methode is ook niet aan te raden.

4.2.Gebruik van CDOSYS

De tweede optie is de beste. Pas uw formulieren aan zodat ze de nieuwe versie gaan gebruiken. Voor een overzicht van de verschilpunten, en de voor- en nadelen van deze nieuwe versie, verwijs ik u door naar de MSDN. Als belangrijkste voordeel van de nieuwe versie (CDO v2.x, of CDOSYS genaamd) ken men de uitbreiding van functionaliteit naar voren brengen.

4.2.1.Creatie van een nieuw object
De creatie van een nieuw object gebeurt uiteraard op dezelfde manier als bij de creatie van een nieuw CDONTS object. De naam van het object dat we aanmaken is verschillend. Ter illustratie van de uitbreiding aan functionaliteit van CDOSYS, maken we tevens een object aan van het type CDO.Configuration. Meer hierover echter in de volgende paragraaf.

Dim iMsg
Dim iConf
set iMsg = CreateObject("CDO.Message")
set iConf = CreateObject("CDO.Configuration")
' Opmaak en verzenden

iMsg = nothing
iConf = nothing

Zoals het als 'common practice' aanzien wordt, worden de objecten eenmaal deze niet meer nodig zijn, opgeruimd.

4.2.2.Attributen en member functies

4.2.2.1.Het Message object
Het Message object (of CDO.Message) stelt het eigenlijke email bericht voor. In volgende tabel wordt een overzicht gegeven van de voornaamste attributen van de object interface.

From Ja String Het email adres en eventueel de naam van de afzender van het bericht. Vb:
“John Doe”<John@doe.com>
To Ja String De lijst met geadresseerden van de email. Meerdere namen worden van elkaar gescheiden door een komma. Vb:
“John Doe”<John@doe.com>, “Jane”<Jane@tarzan.com>
Cc Neen String De lijst met geadresseerden in het Cc veld van de email
Bcc Neen String De lijst met geadresseerden in het Bcc veld van de email
Sender Neen String Het emailadres van de persoon die de email verstuurd heeft. Het verschil met het adres in het From veld is dat deze laatste de werkelijke auteur is van het bericht. De Sender verstuurt het bericht in opdracht van de auteur. Meerdere email adressen zijn niet toegestaan.
ReplyTo Neen String Het emailadres dat gebruikt wordt om antwoorden op dit bericht te ontvangen.
Subject Neen String Het onderwerp van het bericht.
MimeFormatted Neen Boolean Wanneer deze waarde op true gezet wordt, geeft men aan dat de tekst van het bericht HTML opmaak zal bevatten.
HTMLBody Neen String De inhoud van het bericht, in HTML opmaak ( zie (1) )
TextBody Neen String De inhoud van het bericht in textvorm
AutoGenerateTextBody Neen Boolean Indien u deze optie instelt, en u geeft tevens een HTMLBody in, dan zal de TextBody automatisch gegenereerd worden.
DSNOptions Neen Numeriek Instelling voor het ontvangen van een afleverrapport. Afleverrapporten duiden aan wanneer het bericht aan de email server van de ontvanger werd bezorgd. De mogelijke waarden zijn:
0 of 1 : geen afleverrapport
2 : afleverrapport als het bericht niet bezorgd kan worden
4 : afleverrapport als het bericht wel bezorgd kan worden
8 : afleverrapport als het bericht met vertraging bezorgd wordt.
14 : afleverrapport in de 3 bovenstaande gevallen

(1)Wanneer u de MimeFormatted optie activeert, maar geen HTMLBody instelt, dan wordt de HTMLBody automatisch van het bericht verwijderd. Omgekeerd zal het instellen van een HTMLBody tot gevolg hebben dat de MimeFormatted optie wordt geactiveerd.

In bovenstaande tabel komt geen optie voor die toelaat de prioriteit van het email bericht in te stellen. Dit wil echter niet zeggen dat dit niet mogelijk is. De manier waarop u dit kunt doen is echter niet zo eenvoudig als het instellen van het onderwerp van de email bvb...
Eén van de properties van het Message object heet Fields. Dit object is een container object dat een aantal andere objecten kan bevatten. Het uitleggen van de betekenis van deze collectie zou ons te ver van het onderwerp van dit artikel brengen. et belangrijkste is dat u de prioriteit van het email bericht kunt instellen via een object in deze container. Dit wordt geïllustreerd in volgend voorbeeld:

Dim iMsg
Dim iConf
set iMsg = CreateObject("CDO.Message")
set iConf = CreateObject("CDO.Configuration")
with iMsg
   set .Configuration = iConf
   .from = "someone@somewhere"
   .to = "someone@somewhere"
   .subject = "test email"
   .fields.Item("urn:schemas:httpmail:importance") = 2
   .fields.Update
end with

Door het aanpassen van een object in de Fields collectie stelt men de email prioriteit in. De mogelijke waarden zijn : 0 voor lage prioriteit, 1 voor normale prioriteit en 2 voor hoge prioriteit. Nadat u de prioriteit hebt ingesteld, moet u de Update functie aanroepen. Indien dit niet gebeurt worden de aanpassingen niet doorgevoerd.

Een overzicht van de member functies vindt u in de volgende tabel: AddAttachment(String url, String username, String passwd) Met deze functie voegt u een bijlage toe aan het email bericht. De argumenten van deze functie zijn: - url : de bestandsnaam van de bijlage, of de URL waar de bijlage gevonden kan worden - username : de loginnaam die nodig is om de bijlage op te halen (optioneel) - passwd : het paswoord dat bij de logingegevens hoort (optioneel) Send() De email wordt verstuurd eenmaal u de Send() functie aanroept.

Naast deze voornaamste member functies worden nog een aantal extra mogelijkheden geboden, zoals het aanmaken van een reply op een bericht, een forward van een bericht, ... Hier gaan we echter niet op in. Voor de geïnteresseerden verwijs ik naar de MSDN voor meer uitleg (zoek naar het IMessage object).

4.2.2.2.Het Configuration object
Zoals reeds vermeld maakt CDOSYS geen gebruik meer van de MAPI interface. Dit laat u toe om rechtstreeks een verbinding te maken met een al dan niet externe SMTP server. De instellingen voor deze server gebeuren in het configuration object. Daarvoor maakt men gebruik van deze attributen:
smtpserver De naam of het IP adres van de SMTP server waarnaar u de mail wenst te versturen.
smtpserverport Het poortnummer van de SMTP server (default : 25)
smtpaccountname De accountnaam op de SMTP server (optioneel)
sendemailaddress Uw email adres (optioneel)
Sendusing De manier waarop het bericht verzonden moet worden:
1 : verstuur de email via de pickup dir van de locale SMTP server.
2 : verstuur de email via de SMTP server poort van een remote server.
3 : verstuur de email via de Exchange Server URI.
Standaard kiest u voor de tweede optie indien u met een gewone SMTP server verbinding maakt. Voor meer uitleg over de derde optie leest u best een artikel na dat uitlegt hoe Exchange Server werkt. De eerste optie kunt u gebruiken indien u de SMTP service die bij Windows 2000 en Windows XP Pro zit goed geïnstalleerd en geconfigureerd hebt.

Bepaalde SMTP servers vereisen authenticatie vooraleer u een mail kunt versturen. Ook in dit geval kunt u de server gebruiken, mits het instellen van de login gegevens.

smtpauthenticate 0 : geen authenticatie (default)
1 : SMTP server authenticatie
2 : NTLM authenticatie.
sendusername De loginnaam voor de SMTP server (domain\username)
sendpassword Uw paswoord.
Smtpusessl Indien u de mail over SSL wenst te versturen, is deze parameter true. Dit kan echter enkel werken indien uw server dit ondersteunt.

Het Configuration object maakt deel uit van het Message object. De instellingen worden opgeslagen in het attribuut met naam Message.Configuration.

In de praktijk gaat men de attributen van het Configuration object niet rechtstreeks gaan aanspreken. Alle attributen zijn omvat in een collectie die Fields heet. Om bijvoorbeeld het attribuut smtpserver te gaan instellen doet men dit:

Dim iConf
Set iConf = CreateObject("CDO.Configuration")
Set Flds = iConf.Fields
Flds(“smtpserver”) = “mail.yourdomain.com”
Flds.Update

4.2.3.Voorbeeldcode

Dim iMsg
Dim iConf
Dim iBp
Dim Flds
Set iMsg = CreateObject("CDO.Message")
Set iConf = CreateObject("CDO.Configuration")
Set Flds = iConf.Fields
Flds(“sendusing”) = 2
Flds(“smtpserver”) = "mail.mydomain.com"
Flds(“smtpserverport”) = 25
Flds(“smtpauthenticate”) = 0 ' anoniem
Flds.Update
With iMsg
   Set .Configuration = iConf
   .To = "John@doe.com"
   .From = "fourth@doe.com"
   .Sender = "finally@doe.com"
   .Subject = "Betreft vergaderverzoek"
   .TextBody = "Gelieve de vergadering van aanstaande maandag te verplaatsen”
   Set iBp = .AddAttachment("c:\bijlage.doc")
   iBp.ContentMediaType="application/msword"
   Set iBp = .AddAttachment("c:\anderebijlage.html")
   iBp.ContentMediaType="text/html"
   .Send
End With


Het resultaat van de functie AddAttachment(...) is een object van het type IBodyPart. In dit artikel wordt niet ingegaan op de details van dit object. Het enige wat we vermelden is dat men hiervan het attribuut ContentMediaType kan instellen. Dit is een vorm van identificatie van het type bijlage. De mogelijkheden zijn onder andere “application/msword” voor een Word document, “image/gif” voor een GIF afbeelding, ... Dergelijke specificaties zijn voornamelijk van belang voor de emailsoftware op de client. Deze kan op die manier bepalen hoe de bijlage geopend kan worden.

5. Besluit

Ondanks de herhaalde vraag op verschillende forums en mailing lists betreffende het installeren van CDONTS op een Windows XP machine, wordt deze methode ten stelligste afgeraden. De technologie waarop deze component gebaseerd is, is verouderd. Het spijtige aan CDOSYS is het feit dat de code niet compatibel is met deze van zijn voorganger. Een migratie van alle modules die gebruik maken van email functionaliteit zal dus noodzakelijk zijn.

Het gebruik van email functionaliteit in een webapplicatie is een stuk eenvoudiger geworden in ASP.NET. De componenten die in het .NET framework aanwezig zijn maken gebruik van CDOSYS. De mogelijkheden die daar geboden worden zijn gelijkaardig aan deze beschreven in de CDOSYS sectie.

copyright 2003 Tim Musschoot

<< vorige | ^ naar boven | overzicht | volgende >>
copyright 2000-2007 ASPNL