IPRO - PC Magazine Romania, Mai 2004
SOLUȚII PENTRU PROGRAMATORII ȘI DESIGNERII WEB
Trimitere de e-mail-uri din paginile JSP
de Mircea Scărlătescu
Trimiterea de mesaje e-mail dintr-o pagină web a devenit un lucru comun în ziua de azi. Sistemele de web-mailing, care permit ocolirea protocolului POP3 și asigură accesul la căsuțe poștale prin HTTP, sunt răspândite peste tot prin Internet. Tehnologiile de realizare acoperă toate limbajele de scripting, de la PHP până la cele mai noi, ASP.NET sau JSP.
Nu doar sistemele de mailing au nevoie de astfel de capabilități, ci și siturile de comerț electronic de exemplu, care trebuie să aibă capabilitatea de comunicare între comerciant și posibilul client, sau siturile anumitor instituții, unde vizitatorii pot să trimită sesizări, reclamații, opinii etc.
Ne propunem în cele ce urmează să vă oferim un exemplu pentru trimitere de
e-mail-uri cu ajutorul JSP. Pentru a putea rula exemplul pe care-l vom implementa,
trebuie să aveți instalat un server web JSP 1.1 enabled. Un bun exemplu în acest
sens este Tomcat. Despre instalarea și configurarea Tomcat, puteți consulta
multe documente pe Internet, de la situl www.apache.org
secțiunea dedicată Tomcat, până la o multitudine de tutoriale și exemple găsite
printr-o singură cautare pe Google. Capabilitățile de mail ale Java sunt încapsulate
într-un pachet numit JavaMail, care poate fi descărcat de pe situl Java al firmei
promotoare, Sun: java.sun.com/products/javamail.
Pachetul JavaMail vă oferă API-ul necesar construirii sistemelor de e-mail indiferent
de platformă și relativ simplu. La data redactării acestui articol, cea mai
nouă versiune pentru JavaMail este 1.3.1.
Odată cele două componente instalate și funcționale, putem trece la treabă.
Vom realiza o pagină care va conține un formular, cu adresa destinatarului, adresa expeditorului (adresele de e-mail binențeles☺), subiectul și conținutul mesajului. Vom denumi acest fișier index.jsp. Iată cum va arăta sursa acestuia:
< html>
<head>
<title>Mailer</title>
</head>
<body>
<form action="mailer.jsp"
method="post">
To :<br>
<input type="text" name="to">
<br>
From :<br>
<input type="text" name="from">
<br>
Subject :<br>
<input type="text" name="subject" >
<br>
Message :<br>
<textarea rows="10" cols="80"
name="message"></textarea>
<br>
<input type="submit"
value="Trimite"></form>
</body>
</html>
Nu e nevoie de prea multe explicații privind sursa de mai sus, având în vedere că structura formularului este extrem de ușor de înțeles.
Al doilea fișier din mica noastră aplicație se va numi mailer.jsp (este fișierul apelat la trimiterea formularului de mai sus).
Iată sursa pentru acest fișier:
<%@ page errorPage=
"errorPage.jsp" %>
<html>
<head>
</head>
<body>
<div align=´center´>
<jsp:useBean id="mailer"
class="ro.pcmagazine.art. MailerBean">
<jsp:setProperty name= "mailer" property="*"/> <% mailer.sendMail(); %> </jsp:useBean> Email has been sent successfully. </div> </body> </html>
Prima precizare pentru sursa de mai sus este reprezentată de directiva dată pe prima linie, care precizează serverului că orice excepție aruncată în cadrul acestei pagini JSP va fi aruncată către acel fișier, unde urmează să fie tratată.
Al doilea element important pentru acest cod este reprezentat de utilzarea unui JavaBean, și anume MailerBean.
Tag-ul
<jsp:useBean id="mailer" class="ro.pcmagazine.art. MailerBean">
spune serverului că vom folosi acest bean. Acesta necesită valorile câmpurilor introduse în formularul HTML de mai sus, și transmiterea acestor valori se face prin intermediul liniei:
<jsp:setProperty name= "mailer" property="*"/>
Toate valorile sunt transmise odată, acest lucru fiind posibil pentru că proprietățile necesare pentru funcționarea corectă a Beanului sunt "to", "from", "subject" și "message" iar în formularul nostru va-riabilele sunt denumite exact așa, deci transferul se face extrem de ușor. Desigur, transmiterea acestor parametrii se poate face și individual.
O dată ce aceste proprietăți au fost trimise, putem să folosim metoda sendMail() pentru trimiterea e-mail-ului.
De remarcat că ro.pcmagazine.art.MailerBean, acționează în acest exemplu ca o simplă "cutie neagră", interesându-ne doar ce parametrii necesită și ce rezultate poate să întoarcă. Acest stil de programare este comun pentru programarea modularizată din ziua de azi. Clasele Java precompilate sunt disponibile în multe locuri pe Internet, iar utilizarea acestora este extrem de facilă și productivă în același timp. Am rămas datori cu pagina de tratare a erorilor (errorPage.jsp). Trebuie mai întâi să precizăm că o astfel de împărțire judicioasă a spațiului de lucru în fișiere separate asigură atât o programare ceva mai facilă dar și o inspectare și corectare (dacă este nevoie) mult mai ușoară a programelor. Astfel, un programator care nu a fost implicat direct în scrierea codului, poate să-l corecteze sau să-l actualizeze mult mai ușor. Iată așadar pagina errorPage.jsp:
<%@ page isErrorPage= "true" %> <html> <head> </head> <body> <div align="center"> <%= exception.getMessage() %> </div> </body>
</html>
Acest cod de mai sus precizează mai întâi că această pagină este una de tratare a unei erori, prin directiva
<%@ page isErrorPage= "true" %>
după care nu face altceva decât să afișeze textul excepției (vezi documentația de excepții Java) prin intermediul metodei getMessage(). Desigur, o aplicație JSP complexă va realiza aici și alte operații (înregistrarea erorii într-o bază de date, reîntoarcerea la formularul inițial etc). Pentru cazul nostru "didactic" putem însă considera suficientă această metodă de afișare.
Acum însă să vedem cum scriem Bean-ul care de fapt ne face nouă viața ușoară.
Așa cum poate vă așteptați, în spatele unui cod ușor, cum este cel de mai sus,
se ascunde un cod ceva mai complex. Iată cum arată el, cu precizarea că acest
cod nu este universal valabil, fiind doar o variantă pentru metodele necesare
nouă:
package ro.pcmagazine.ar
import java.io.*;
import java.util.*;
import javax.mail.*;
import javax.mail.event.*;
import javax.mail.internet.*;
public final class Mailer
Bean extends Object
implements
Serializable {
private String to = null;
private String from = null;
private String subject =
null;
private String message =
null;
public static Properties
props = null;
public static Session
session = null;
static {
props =
System.getProperties();
props.put("mail.smtp.host",
"mail.yourisp.com");
session = Session.getDefault
Instance(props, null);
}
public void setTo
(String to) {
this.to = to;
}
public void setFrom
(String from) {
this.from = from;
}
public void setSubject
(String subject) {
this.subject = subject;
}
public void setMessage
(String message) {
this.message = message;
}
public void sendMail()
throws Exception {
if(!this.everythingIsSet())
throw new Exception("Could
not send email.");
try {
MimeMessage message = new
MimeMessage(session);
message.setRecipient(Message.
RecipientType.TO, new
InternetAddress(this.to));
message.setFrom(new Internet
Address(this.from));
message.setSubject(this.
subject);
message.setText(this.
message);
Transport.send(message);
} catch (Messaging
Exception e) {
throw new Exception
(e.getMessage());
} }
private boolean
everythingIsSet() {
if((this.to == null) ||
(this.from == null) ||
(this.subject == null) ||
(this.message == null))
return false;
if((this.to.indexOf("@") ==
-1) ||
(this.to.indexOf(".") ==
-1)) return false;
if((this.from.indexOf("@") ==
-1) ||
(this.from.indexOf(".") ==
-1))
return false;
return true;
} }
Deși pare înfricoșător la început, codul de mai sus este de fapt relativ ușor
de înțeles. Să o luăm pe rând:
- prima linie de cod precizează că acest Bean face parte dintr-un pachet
care se numește ro.pcmagazine.art; imediat importăm pachetele ce sunt necesare
pentru clasa noastră;
- declararea clasei se face la final (clasa finală), deci ea nu mai poate
fi derivată.
Declarăm proprietățile necesare pentru un e-mail standard:
private String to = null; private String from = null; private String subject = null; private String message = null;
Aceste proprietăți sunt declarate private, deci nu sunt vizibile în afara clasei.
Metodele de gen setTo() scrise mai sus vor fi folosite pentru modificarea proprietăților. Mai definim două proprietăți, de data aceasta publice:
public static Properties props = null; public static Session session = null;
Declarăm redirectarea către pagina de eroare (la fel cum am făcut la index.jsp)
<%@ page errorPage=
"errorPage.jsp" %>
Proprietățile declarate mai sus sunt ințializate în cele ce urmează:
static {
props = System.get
Properties();
props.put("mail.site.com ",
"mail.site.com");
session = Session.getDefault
Instance(props, null);
}
Urmează cele două metode importante ale clasei, care sunt everythingIsSet(), funcție care validează datele pentru e-mail.
Această funcție returnează true sau false, în cazul în care toți parametrii necesari au fost definiți corect sau nu.
Astfel de funcții sunt necesare pentru a evita situații în care datele transmise sunt corupte, iar metodele nu vor funcționa corect.
Se știe că e nevoie pe cât posibil ca un program să funcționeze corect în orice situație, oricât de aberantă pare ea la prima vedere.
Metoda descrisă mai sus este apelată din cadrul metodei SendMail, cea care realizează operația de conectare la mailer și trimiterea de e-mail.
Dacă apelul everythingIsSet() returnează true, atunci se creează un obiect de tipul MimeMessage, sunt setate proprietățile necesare pentru acest obiect după care este apelată metoda send() a obiectului Transport.
De remarcat că exemplul de mai sus este doar un caz didactic, având în vedere că mesajele din ziua de azi conțin atașamente, format HTML etc.
Ceea ce ați citit mai sus vă ajută să înțelegeți mecanismul ce trebuie realizat pentru e-mailing, de asemenea vă dă un exemplu de folosire a unor Bean-uri în paginile JSP, și cum putem trata erorile în JSP.
Desigur java.sun.com și java.sun.com/products/javamail vă vor fi folositoare în scrierea de aplicații ceva mai complexe.
Mult succes!
|