2010-09-21 7 views
7

Comment envoyer un email de JSP/servlet? Est-il nécessaire de télécharger des bocaux ou pouvez-vous envoyer un e-mail à partir de JSP/servlets sans aucun bocal?Comment envoyer un email de jsp/servlet?

  • À quoi ressemblerait mon code Java?

  • À quoi ressemblerait mon code HTML (le cas échéant)?

  • Plusieurs classes sont-elles nécessaires ou pouvez-vous utiliser une seule classe?

+7

S'il vous plaît google pour des questions si triviales avant de poster sur SO. Les liens ci-dessous font partie des dix premiers résultats. –

+4

Google est lié aux résultats populaires. Les gens utilisent StackOverflow pour obtenir l'opinion des gens par opposition aux algorithmes de Mountain View.C'est tout le point de StackOverflow IMHO. – MonoThreaded

+0

Obtenir méta, c'est le point du système de points. bon q/a obtient plus de points, apparaît plus dans les recherches, etc ... mais, oui, de meilleurs résultats (j'espère). idée similaire à la page rank, tho. – Thufir

Répondre

2

J'utilise paquet javamail et il fonctionne très bien. Les exemples montrés ci-dessus sont bons mais comme je peux le voir ils n'ont pas défini de paramètres dans le fichier externe (par exemple web.xml) qui est recommandé ...

Imaginez que vous voulez changer votre adresse e-mail ou votre hôte SMTP. Il est beaucoup plus facile d'éditer le fichier web.xml que 10 servlets où vous avez utilisé la fonction mail. Par exemple ajouter lignes suivantes dans web.xml

<context-param> 
<param-name>smtp_server</param-name> 
<param-value>smtp.blabla.com</param-value></context-param> 

Ensuite, vous pouvez accéder à ces paramètres de servlet avec

// 1 - init 
    Properties props = new Properties(); 
    //props.put("mail.transport.protocol", "smtp"); 
    props.put("mail.smtp.host", smtp_server); 
    props.put("mail.smtp.port", smtp_port); 
21

La logique de logiciel de messagerie doit aller dans sa propre classe autonome que vous pouvez réutiliser partout. Le fichier JSP doit contenir uniquement la logique de présentation et le balisage. La classe Servlet doit simplement traiter la requête de la manière appropriée et appeler la classe mailer. Voici les étapes que vous devez prendre:

  1. d'abord décider quel SMTP server vous souhaitez utiliser afin que vous seriez en mesure d'envoyer des e-mails. Celui de votre FAI? Celui de Gmail? Yahoo? Fournisseur d'hébergement de site Web? Un auto-maintenu? Peu importe, figurez le nom d'hôte, le port, le nom d'utilisateur et le mot de passe de ce serveur SMTP. Vous allez avoir besoin de cette information.


  2. Créer une classe Java qui utilise la vanille simple JavaMail API pour envoyer un message. L'API JavaMail est livré avec un excellent tutorial et FAQ. Nommez la classe Mailer et donnez-lui une méthode send() (ou ce que vous voulez). Testez à l'aide d'une classe de testeur avec une méthode main() comme ceci:

    public class TestMail { 
        public static void main(String... args) throws Exception { 
         // Create mailer. 
         String hostname = "smtp.example.com"; 
         int port = 2525; 
         String username = "nobody"; 
         String password = "idonttellyou"; 
         Mailer mailer = new Mailer(hostname, port, username, password); 
    
         // Send mail. 
         String from = "[email protected]"; 
         String to = "[email protected]"; 
         String subject = "Interesting news"; 
         String message = "I've got JavaMail to work!"; 
         mailer.send(from, to, subject, message); 
        } 
    } 
    

    Vous pouvez le rendre aussi simple ou avancé que vous le souhaitez. Peu importe, tant que vous avez un cours avec lequel vous pouvez envoyer un mail comme ça.


  3. Maintenant la partie JSP, il est pas tout à fait clair pourquoi vous avez mentionné JSP, mais depuis une page JSP est supposed pour représenter seulement HTML, je parie que vous aimeriez avoir quelque chose comme un formulaire de contact dans une JSP .Voici un exemple de coup d'envoi:

    <form action="contact" method="post"> 
        <p>Your email address: <input name="email"></p> 
        <p>Mail subject: <input name="subject"></p> 
        <p>Mail message: <textarea name="message"></textarea></p> 
        <p><input type="submit"><span class="message">${message}</span></p> 
    </form> 
    

    Oui, simplement, baliser/styler comme bon vous semble.


  4. Maintenant, créer une classe servlet qui écoute sur une url-pattern de /contact (la même que la forme soumet à) et mettre en oeuvre le procédé doPost() (le même procédé que le formulaire utilise) comme suit:

    public class ContactServlet extends HttpServlet { 
        private Mailer mailer; 
        private String to; 
    
        public void init() { 
         // Create mailer. You could eventually obtain the settings as 
         // web.xml init parameters or from some properties file. 
         String hostname = "smtp.example.com"; 
         int port = 2525; 
         String username = "nobody"; 
         String password = "forgetit"; 
         this.mailer = new Mailer(hostname, port, username, password); 
         this.to = "[email protected]"; 
        } 
    
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
         String email = request.getParameter("email"); 
         String subject = request.getParameter("subject"); 
         String message = request.getParameter("message"); 
         // Do some validations and then send mail: 
    
         try { 
          mailer.send(email, to, subject, message); 
          request.setAttribute("message", "Mail succesfully sent!"); 
          request.getRequestDispatcher("/WEB-INF/contact.jsp").forward(request, response); 
         } catch (MailException e) { 
          throw new ServletException("Mailer failed", e); 
         } 
        } 
    } 
    

    C'est tout. Gardez-le simple et propre. Chaque chose a ses propres responsabilités claires.

+0

L'API JavaMail est remplie d'appels de méthodes statiques qui rendent votre code difficile à tester. Si vous avez la possibilité d'utiliser Spring, consultez l'API MailSender (http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/mail.html). –

+0

Il semble que votre envoi (from, to, subject, message) soit un peu différent de http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/javamail/javamail.html (méthode sendMail). – user3014926

+0

À quoi ressemblait la méthode send() de votre Mailer? – user3014926

1

page JSP:

<form action="mail.do" method="POST"> 
<table> 
    <tr> 
    <td>To Email-id :<input type="text" name="email" /></td> <!--enter the email whom to send mail --> 
    <td><input type="submit" value="send"></input></td> 
    </tr> 
</table> 
</form> 

Voici le code Servlet:

String uri=req.getRequestURI(); 

if(uri.equals("/mail.do")) 
     { 
      SendEmail sa=new SendEmail(); 
         String to_mail=request.getParameter("email"); 
         String body="<html><body><table width=100%><tr><td>Hi this is Test mail</td></tr></table></body></html>"; 
      sa.SendingEmail(to_email,body); 

     } 

Et la classe SendEmail:

package Email; 

import java.util.Properties; 

import javax.mail.Message; 
import javax.mail.MessagingException; 
import javax.mail.Session; 
import javax.mail.Transport; 
import javax.mail.internet.AddressException; 
import javax.mail.internet.InternetAddress; 
import javax.mail.internet.MimeMessage; 

public class SendEmail { 

    public void SendingEmail(String Email,String Body) throws AddressException, MessagingException 
    { 

      String host ="smtp.gmail.com"; 
      String from ="yourMailId"; //Your mail id 
      String pass ="yourPassword"; // Your Password 
      Properties props = System.getProperties(); 
      props.put("mail.smtp.starttls.enable", "true"); // added this line 
      props.put("mail.smtp.host", host); 
      props.put("mail.smtp.user", from); 
      props.put("mail.smtp.password", pass); 
      props.put("mail.smtp.port", "25"); 
      props.put("mail.smtp.auth", "true"); 
      String[] to = {Email}; // To Email address 
      Session session = Session.getDefaultInstance(props, null); 
      MimeMessage message = new MimeMessage(session); 
      message.setFrom(new InternetAddress(from)); 
      InternetAddress[] toAddress = new InternetAddress[to.length];   
      // To get the array of addresses 
       for(int i=0; i < to.length; i++) 
       { // changed from a while loop 
        toAddress[i] = new InternetAddress(to[i]); 
       } 
      System.out.println(Message.RecipientType.TO); 
      for(int j=0; j < toAddress.length; j++) 
      { // changed from a while loop 
      message.addRecipient(Message.RecipientType.TO, toAddress[j]); 
      } 
      message.setSubject("Email from SciArchives"); 

      message.setContent(Body,"text/html"); 
      Transport transport = session.getTransport("smtp"); 
      transport.connect(host, from, pass); 
      transport.sendMessage(message, message.getAllRecipients()); 
       transport.close(); 
     } 
    } 
-1

Cette configuration de base a bien fonctionné:

importation mail.jar et activation.jar dans dossier WEB_INF/lib à l'intérieur du projet.

obtenir mail.jar de JavaMail (dernière version du site officiel).

obtenir activation.jar de http://www.oracle.com/technetwork/java/javase/jaf-136260.html

1. Tout d'abord de: emailForm.jsp

Ceci est un formulaire utilisé pour transmettre l'expéditeur, le destinataire Détails, le contenu et le message Sujet au emailUtility

 <%@ page language="java" contentType="text/html; charset=ISO-8859-1" 
pageEncoding="ISO-8859-1"%> 
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
    <html> 
    <head> 
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> 
    <title>Send email</title> 
    </head> 
    <body> 
     <form action="emailUtility.jsp" method="post"> 
      <table border="0" width="35%" align="center"> 
       <caption><h2>Send email using SMTP</h2></caption> 
       <tr> 
        <td width="50%">Sender address </td> 
        <td><input type="text" name="from" size="50"/></td> 
       </tr> 
       <tr> 
        <td width="50%">Recipient address </td> 
        <td><input type="text" name="to" size="50"/></td> 
       </tr> 
       <tr> 
        <td>Subject </td> 
        <td><input type="text" name="subject" size="50"/></td> 
       </tr> 
       <tr> 
        <td>Message Text </td> 
        <td><input type="text" name="messageText"></td> 
       </tr> 
       <tr> 
        <td colspan="2" align="center"><input type="submit" value="Send"/></td> 
       </tr> 
      </table> 

     </form> 
    </body> 
    </html> 

2. Deuxième jsp: emailUtility.jsp

Il s'agit de l'action de formulaire mentionnée dans le fichier jsp précédent (emailForm.jsp).

<html> 
<head> 
<title>email utility</title> 
</head> 
<body> 
<%@ page import="java.util.*" %> 
<%@ page import="javax.mail.*" %> 
<%@ page import="javax.mail.internet.*" %> 
<%@ page import="javax.activation.*" %> 
<% 
String host = "smtp.gmail.com"; 
String to = request.getParameter("to");  

String from = request.getParameter("from"); 

String subject = request.getParameter("subject"); 

String messageText = request.getParameter("messageText"); 

boolean sessionDebug = false; 
// Create some properties and get the default Session. 
Properties props = System.getProperties(); 
props.put("mail.host", host); 
props.put("mail.transport.protocol", "smtp"); 
props.setProperty("mail.transport.protocol", "smtp");  
props.setProperty("mail.host", "smtp.gmail.com"); 
props.put("mail.smtp.auth", "true"); 
props.put("mail.smtp.port", "465"); 
props.put("mail.debug", "true"); 
props.put("mail.smtp.socketFactory.port", "465"); 
props.put("mail.smtp.socketFactory.class","javax.net.ssl.SSLSocketFactory"); 
props.put("mail.smtp.socketFactory.fallback", "false"); 

Session mailSession = Session.getDefaultInstance(props, 
    new javax.mail.Authenticator(){ 
     protected PasswordAuthentication getPasswordAuthentication() { 
      return new PasswordAuthentication(
      "[email protected]", "password_here");// Specify the Username and the PassWord 
     } 
    }); 
// Set debug on the Session 
// Passing false will not echo debug info, and passing True will. 

mailSession.setDebug(sessionDebug); 

// Instantiate a new MimeMessage and fill it with the 
// required information. 

Message msg = new MimeMessage(mailSession); 
msg.setFrom(new InternetAddress(from)); 
InternetAddress[] address = {new InternetAddress(to)}; 
msg.setRecipients(Message.RecipientType.TO, address); 
msg.setSubject(subject); 
msg.setSentDate(new Date()); 
msg.setText(messageText); 

// Hand the message to the default transport service 
// for delivery. 
Transport.send(msg); 
out.println("Mail was sent to " + to); 
out.println(" from " + from); 
out.println(" using host " + host + "."); 
%> 
</table> 
</body> 
</html> 

3. Aller à l'URL suivante

http://localhost:8080/projectname/emailForm.jsp

4. Redémarrez le serveur si elle donne u erreur de serveur.

Questions connexes