2009-12-31 12 views
2

J'ai copié le code d'ici seulement pour envoyer des mails en utilisant le serveur SMTP Gmail. Mais je reçois des exceptions de sécurité. J'ai atteint la cible une fois que j'ai réussi à envoyer 4 mails mais plus tard j'ai fait quelques changements dans mon code selon ma demande d'application et il y a une exception de sécurité. Je suis sûr que ça va marcher mais j'ai quelques problèmes.Problème dans l'envoi de courrier avec Gmail SMTP en utilisant le courrier Java

Quel est le problème avec ce code?

Le code est:

package com.ibm.lims; 

    import java.security.Security; 
    import java.util.Properties; 

    import javax.mail.Message; 
    import javax.mail.MessagingException; 
    import javax.mail.Multipart; 
    import javax.mail.PasswordAuthentication; 
    import javax.mail.Session; 
    import javax.mail.Transport; 
    import javax.mail.internet.InternetAddress; 
    import javax.mail.internet.MimeBodyPart; 
    import javax.mail.internet.MimeMessage; 
    import javax.mail.internet.MimeMultipart; 

    public class mails { 
     private static final String SMTP_HOST_NAME = "smtp.gmail.com"; 
     private static final String SMTP_PORT = "465"; 
     //private static final String emailMsgTxt = "robin borrowed a book"; 
     //private static final String emailSubjectTxt = "online library management system notification"; 
     private static final String emailFromAddress = "[email protected]"; 
     private static final String SSL_FACTORY ="javax.net.ssl.SSLSocketFactory"; 
     //private static final String[] sendTo = {"[email protected]","[email protected]"}; 

     public static void mailer(String[] sendTo,String emailSubjectTxt,String emailMsgTxt) throws Exception{ 
      Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider()); 

      new mails().sendSSLMessage(sendTo,emailSubjectTxt,emailMsgTxt,emailFromAddress); 
      System.out.println("Sucessfully Sent mail to All Users"); 
     } 

     public void sendSSLMessage(String[] recipients,String subject,String message,String from) throws MessagingException { 
      boolean debug = true; 

      Properties props = new Properties(); 
      props.put("mail.smtp.host", SMTP_HOST_NAME); 
      props.put("mail.smtp.auth", "true"); 
      props.put("mail.debug", "true"); 
      props.put("mail.smtp.port", SMTP_PORT); 
      props.put("mail.smtp.socketFactory.port", SMTP_PORT); 
      props.put("mail.smtp.socketFactory.class", SSL_FACTORY); 
      props.put("mail.smtp.socketFactory.fallback", "false"); 

      Session session = Session.getDefaultInstance(props,new javax.mail.Authenticator() { 
       protected PasswordAuthentication getPasswordAuthentication() { 
        return new PasswordAuthentication("[email protected]","weakpaasword"); 
       } 
      } 
     ); 

     MimeMessage message1 =new MimeMessage(session); 
     message1.setFrom(new InternetAddress(from)); 
     for(int i=0;i<=recipients.length;i++){ 
      message1.addRecipient(Message.RecipientType.TO,new InternetAddress(recipients[i])); 
     } 

     message1.setSubject(subject); 

     // Create the message part. 
     MimeBodyPart messageBodyPart =new MimeBodyPart(); 

     //Fill message. 
     messageBodyPart.setText(message); 

     Multipart multipart = new MimeMultipart(); 
     multipart.addBodyPart(messageBodyPart); 

     // Part two is attachment. 

     // Put parts in message 
     message1.setContent(multipart); 

     // Send the message 
     Transport.send(message1); 
     } 

    } 

Je l'appelais de JSP:

<% 
     String requestedopration = request.getParameter("operation"); 
     if("Borrow".equalsIgnoreCase(requestedopration)){ 
      Borrow borrow = new Borrow(); 
      borrow.setBook_id(request.getParameter("bookid")); 
      borrow.setUser_id((String)session.getAttribute("userid")); 

      boolean c=LimsHandler.getInstance().borrowbook(borrow); 
      if(c){ 
      final String[] sendTo = {"[email protected]","[email protected]"}; 

     mails.mailer(sendTo,"lims notification","robin borrowed a book"); 

    %> 

Mais je reçois des exceptions de sécurité. Je reçois comme exception:

HTTP Status 500 - 

type Exception report 

message 

description The server encountered an internal error() that prevented it from fulfilling this request. 

exception 
org.apache.jasper.JasperException: java.lang.ArrayIndexOutOfBoundsException: 2 
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:413) 
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342) 
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:806) 

root cause 
java.lang.ArrayIndexOutOfBoundsException: 2 
    com.ibm.lims.mails.sendSSLMessage(mails.java:64) 
    com.ibm.lims.mails.mailer(mails.java:35) 
    org.apache.jsp.borrow_jsp._jspService(borrow_jsp.java:144) 
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:806) 
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:369) 
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342) 
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:806) 

note The full stack trace of the root cause is available in the Apache Geronimo (Embedded Tomcat/6.0.20-20090724) logs. 
Apache Geronimo (Embedded Tomcat/6.0.20-20090724) 
+0

Veuillez publier le texte de ces exceptions de sécurité. Les trouvez-vous dans les journaux de votre serveur d'applications Web ou apparaissent-ils sur la page HTML renvoyée? –

+2

Est-ce que ce sont vos vraies informations d'identification dans cet article? Je supprimerais ceux si j'étais vous? –

+0

Je pensais que les employés d'IBM avaient des mentors. – BalusC

Répondre

1

De 1.4.0 sur vous JDK n'avez pas besoin de spécifier le fournisseur SSL car il est intégré dans le JDK. Jetez un oeil à explanation et des exemples de Sun de comment utiliser GMail par JavaMail:

0

Il ne semble pas que vous avez le jeu de protocole de transport de courrier pour ssl. Essayez d'ajouter props.put ("mail.transport.protocol", "smtps") ;. Sur la base de cet extrait du site JavaMail, vous devrez peut-être ajouter "mail.smtps.auth", "true".

String host = "smtp.gmail.com; 
String username = "user"; 
String password = "passwd"; 
Properties props = new Properties(); 
props.put("mail.smtps.auth", "true"); 
// ... 
MimeMessage msg = new MimeMessage(session); 
// set the message content here 
Transport t = session.getTransport("smtps"); 
try { 
t.connect(host, username, password); 
t.sendMessage(msg, msg.getAllRecipients()); 
} finally { 
t.close(); 
} 

Oui, les méthodes sont différentes, mais les mêmes propriétés sont utilisées.

+0

Désolé, la propriété mail.transport.protocol ne semble pas affecter quoi que ce soit dans un test unitaire rapide ... en regardant le code source de courrier Java, il ressemblait ça le ferait. session.setProtocolForAddress ("rfc822", "smtps") fait l'affaire, bien que cela puisse également être défini dans les fichiers de propriétés. –

+0

en fait, j'ai été en mesure d'envoyer les mails.i envoyé 4 5 mails.mais plus tard exception est survenue.est un problème de serveur. String [] destinataires a été écrit en tant que chaîne reciepients [] dans le code fourni par ce site.i a changé c'est que la raison? –

0

Votre code semble bien, sauf que la boucle est incorrecte. Utilisez "<" au lieu de "< =" alors vous n'obtiendrez pas ArrayIndexOutOfBoundException.

for (int i = 0; i < recipients.length; i++) { 
    message1.addRecipient(Message.RecipientType.TO, 
    new InternetAddress(recipients[i])); 
} 
+0

plz aider le problème existe toujours. –

+0

Section de réponse éditée. Utilisez "<" au lieu de "<=", vous n'obtiendrez pas ArrayIndexOutOfBoundException. –