2010-01-19 4 views
0

J'essaye d'envoyer un message en utilisant Javamail API, avec tomcat en tant que serveur web, mais le code suivant m'a causé une grosse exception chaque fois que j'ai essayé d'envoyer le message sans un fichier et un attachement. Bien que cela fonctionne avec des messages en pièce jointe.Envoyer le résultat du message dans une exception

public static String send(String to,String body,Stringsubject,String file,String from)throws Exception{ 

        if(file!=null||file!=" "){  

     File file1=new File(file); 
     MimeBodyPart mb=new MimeBodyPart(); 
     FileDataSource f=new FileDataSource(file1.getCanonicalPath()); 
     mb.setDataHandler(new DataHandler(f)); 
     mb.setFileName(f.getName()); 
     mm.addBodyPart(mb); 
     } 

     mb1.setText(body); 
     mm.addBodyPart(mb1); 
        message.setFrom(new InternetAddress(from)); 
     Address[] add={ new InternetAddress(to) }; 

       message.setRecipients(Message.RecipientType.TO,add); 
       message.setSubject(subject); 
       message.setContent(mm); 
      //message.setText(body); 
       Transport.send(message); 
      return "Message sent"; 
} 

Exception:

javax.mail.MessagingException: IOException while sending message; 
    nested exception is: 
    java.io.FileNotFoundException: C:\Program Files\Apache Software Foundation\Tomcat 6.0 (Access is denied) 
    at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:779) 
    at javax.mail.Transport.send0(Transport.java:191) 
    at javax.mail.Transport.send(Transport.java:120) 
    at foo.SendMessage.send(SendMessage.java:57) 
    at foo.Mail.doPost(Mail.java:39) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:637) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293) 
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849) 
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583) 
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454) 
    at java.lang.Thread.run(Thread.java:619) 
Caused by: java.io.FileNotFoundException: C:\Program Files\Apache Software Foundation\Tomcat 6.0 (Access is denied) 
    at java.io.FileInputStream.open(Native Method) 
    at java.io.FileInputStream.<init>(FileInputStream.java:106) 
    at javax.activation.FileDataSource.getInputStream(FileDataSource.java:82) 
    at javax.activation.DataHandler.writeTo(DataHandler.java:290) 
    at javax.mail.internet.MimeBodyPart.writeTo(MimeBodyPart.java:1381) 
    at javax.mail.internet.MimeBodyPart.writeTo(MimeBodyPart.java:852) 
    at javax.mail.internet.MimeMultipart.writeTo(MimeMultipart.java:452) 
    at com.sun.mail.handlers.multipart_mixed.writeTo(multipart_mixed.java:98) 
    at javax.activation.ObjectDataContentHandler.writeTo(DataHandler.java:869) 
    at javax.activation.DataHandler.writeTo(DataHandler.java:302) 
    at javax.mail.internet.MimeBodyPart.writeTo(MimeBodyPart.java:1381) 
    at javax.mail.internet.MimeMessage.writeTo(MimeMessage.java:1742) 
    at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:737) 
    ... 18 more 

Ma question est, je l'ai utilisé une condition dans le code ci-dessus avant de faire un fichier comme pièce jointe, alors pourquoi je reçois cette exception?

Répondre

4

if(file!=null||file!=" ") est incorrect. Je soupçonne ce que vous voulez est if (file != null && !file.trim().isEmpty()).

dire précisément if (file != null || file != " ") est la même chose que dire if (true) parce que vous avez utilisé un opérateur OR et depuis file ne peut pas avoir une valeur de « » et nulle simultanément l'une de ces conditions va évaluer vrai, ce qui rend toute l'expression vrai. En outre, file != " " est une mauvaise forme. Lorsque vous testez l'égalité avec des essais, vous devez toujours utiliser la méthode equals(), et non les opérateurs == et !=.

0

Le excpeption imbriqué:

java.io.FileNotFoundException: C:\Program Files\Apache Software Foundation\Tomcat 6.0 (Access is denied) 

C'est, vous ne pouvez pas accéder à C:\Program Files\Apache Software Foundation\Tomcat 6.0. Je suggère de vérifier vos permissions sur ce fichier. Vous devez également nous indiquer quels sont les arguments de send() lorsque vous obtenez cette exception.

+0

Je vais avoir un espace vide dans la variable de fichier, chaque fois que je reçois exception. – Jazzy

+0

Ahh, donc cela revient au commentaire de Jherico sur la clause broken if. Si la clause if était correcte, c'est-à-dire && au lieu de ||, votre code n'essaierait jamais d'ajouter un fichier en pièce jointe au message.Au moment où vous acceptez "" en tant que nom de fichier, vous essayez d'ajouter le répertoire de travail en cours en pièce jointe à votre e-mail, ce qui entraîne l'exception. – liwp

-1

L'astuce est l'exception imbriquée:

Causée par: java.io.FileNotFoundException: C: \ Program Files \ Apache Software Foundation \ Tomcat 6.0 (Accès refusé)

Qu'est-ce que Cela signifie que vous n'êtes pas autorisé à ouvrir la ressource en tant que fichier.

De plus, votre test:

if(file!=null||file!=" "){  
    File file1=new File(file); 
    … 
} 

ne teste pas si le fichier existe ou non, il vérifie uniquement si le nom n'est pas nul, ou n'est pas une chaîne particulière littérale. Une meilleure façon de le faire serait:

if(file!=null && !file.isEmpty()){  
    File file1=new File(file); 
    … 
} 

En général, en utilisant == pour comparaison de chaînes en Java est the wrong thing to do.

Pour des informations plus significatives, vous pouvez envelopper l'envoyer dans un bloc try/catch pour imprimer plus d'informations à ce moment:

try{ 
    Transport.send(message); 
} catch (IOException e) { 
    throw new Exception("Debug: file:'" + file + "' from:'" + from + "'", e); 
} 
+0

Le problème n'est pas le gestionnaire de sécurité; il lancerait une SecurityException si la machine virtuelle n'est pas autorisée à lire le fichier. Le problème est qu'il essaie d'ouvrir un répertoire avec FileInputStream, ce qui n'est pas autorisé. – jarnbjo

+0

@jambjo yup ... assez juste, la réponse est mise à jour ... même si je ne suis pas sûr que c'était assez incorrect pour justifier un vote négatif ... –