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")
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>
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")
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
|