Avatar billede roo104 Nybegynder
10. januar 2004 - 18:59 Der er 46 kommentarer og
1 løsning

Javamail med attachment

Jeg har et mærkeligt problem med tomcat, den vil ikke lige sende en mail med en vedhæftet fil. Bruger jeg tomcat fra netbeans vil den gerne sende en vedhæftet fil med. Det er samme jsp fil der bliver kørt, så der er ingen forskel i koden. Tomcat fra netbeans må gøre et eller andet som almindelig tomcat ikke har med. Netbeans starter tomcat med denne kommando.
C:\j2sdk\j2sdk1.4.2\jre\bin\java -classpath "C:\j2sdk\netbeans3.5\tomcat406\bin\bootstrap.jar";"C:\j2sdk\j2sdk1.4.2\lib\tools.jar" -Dcatalina.home="C:\j2sdk\netbeans3.5\tomcat406" -Dcatalina.base="C:\Documents and Settings\Administrator\.netbeans\3.5\tomcat406_base" org.apache.catalina.startup.Bootstrap "start"

Fejl beskeden som jeg får er:
Messaging fejl : javax.mail.SendFailedException: Sending failed; nested exception is: class javax.mail.MessagingException: IOException while sending message; nested exception is: java.io.FileNotFoundException: New Text Document.txt (The system cannot find the file specified)

Hvad hulan er der galt ?
Har i info nok, ellers må i bare sige til så paster jeg glædeligt :)
Avatar billede arne_v Ekspert
10. januar 2004 - 19:02 #1
Umiddelbart lyder det mest som at Tomcat i NetBeans kører med
et default directory, så den kan finde filen, men at en standalone
Tomcat ikke kan !

Har du prøver med fuld sti til filen ?
Avatar billede roo104 Nybegynder
10. januar 2004 - 19:15 #2
hvad tænker du på ?
Avatar billede arne_v Ekspert
10. januar 2004 - 19:30 #3
Du forsøger at attache en fil "New Text Document.txt" ?

Den ligger et sted.

Hvis du prøvede med "C:/et/eller/andet/dir/New Text Document.txt" kunne
du be elle rafkræfte en hypoteste om at det er fordi standalone
Tomcat kigger i det forkerte directory.
Avatar billede roo104 Nybegynder
10. januar 2004 - 20:06 #4
Ahhh, nu forstår jeg.
Meget mærkeligt hvis jeg laver / i steder for \ sender den en mail med vedhæftet til, men den omdøber filnavnet. Hvis jeg fx valgte c:/database.data omdøbers den  til C__database.data. Det er lidt tættere på noger der virker nu :-)

Fra Netbeans kunne jeg sagtens bruge \ og den omdøbte heller ikke
Avatar billede arne_v Ekspert
10. januar 2004 - 20:12 #5
Har du ikke mulighed for at angive hvilket navn den skal attaches som ?
Avatar billede roo104 Nybegynder
10. januar 2004 - 20:20 #6
Min kode ser sådan her ud:

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

    Properties prop = new Properties();
    prop.put("mail.transport.default", "smtp");
    prop.put("mail.smtp.host", "smtp servernavn");

    try {
        Session mySession = Session.getInstance(prop, null);

        Message message = new MimeMessage(mySession);
        message.setSubject(request.getParameter("subject"));

        InternetAddress toAddr = new InternetAddress(request.getParameter("reciever"));
        message.setRecipient(Message.RecipientType.TO,toAddr);

        Multipart part = new MimeMultipart();

        BodyPart msgBody = new MimeBodyPart();
        msgBody.setText(request.getParameter("message"));

        BodyPart attachment = new MimeBodyPart();

        FileDataSource fileDataSource = new FileDataSource(file);

        attachment.setDataHandler( new DataHandler( fileDataSource ) );

        if (file.indexOf( File.separator ) != -1) {
            String fileName = file.substring(file.lastIndexOf( File.separator)+1,
            file.length());
            attachment.setFileName(fileName);
        }
        else {
            attachment.setFileName(file);
        }

        part.addBodyPart(msgBody);
        part.addBodyPart(attachment);

        message.setContent(part);

        InternetAddress fromAddr= new InternetAddress("xxx@xxx", "Test" );
        message.setFrom(fromAddr);

        Transport.send(message);
        out.print("Mail sendt");
    }
    catch (AddressException ae) { out.println("Invalid addresse : " + ae); }
    catch (MessagingException me) { out.println("Messaging fejl : " + me); }
    catch (Exception e) { out.println("Fejl : " + e); }
}
Avatar billede arne_v Ekspert
10. januar 2004 - 20:36 #7
Du sætter jo allerede filnavnet:

      if (file.indexOf( File.separator ) != -1) {
            String fileName = file.substring(file.lastIndexOf( File.separator)+1,
            file.length());
            attachment.setFileName(fileName);
        }
        else {
            attachment.setFileName(file);
        }

Prøv og forbeder det test lidt.

        if (file.indexOf("/") != -1) {
            String fileName = file.substring(file.lastIndexOf("/")+1);
            attachment.setFileName(fileName);
        }
        else if (file.indexOf("\\") != -1) {
            String fileName = file.substring(file.lastIndexOf("\\")+1);
            attachment.setFileName(fileName);
        }
        else {
            attachment.setFileName(file);
        }
Avatar billede roo104 Nybegynder
10. januar 2004 - 20:47 #8
if (file.indexOf("/") != -1) {
            String fileName = file.substring(file.lastIndexOf("/")+1);
            attachment.setFileName(fileName);
        }
        else if (file.indexOf("\\") != -1) {
            String fileName = file.substring(file.lastIndexOf("\\")+1);
            attachment.setFileName(fileName);
        }
        else {
            attachment.setFileName(file);
        }

Virker ikke under nogle Tomcat. Får samme fejl som strandalone tomcat
Avatar billede arne_v Ekspert
10. januar 2004 - 20:52 #9
Med angivelse af fuld sti som argument ?
Avatar billede roo104 Nybegynder
10. januar 2004 - 20:53 #10
hov nu sker der noget, men så skal man indtaste /, så virker browse funktionen i html bare ikke :(, eller kan man lave en replace ?
Avatar billede arne_v Ekspert
10. januar 2004 - 20:56 #11
Prøv evt. om den virker med \ også ?
Avatar billede roo104 Nybegynder
10. januar 2004 - 20:58 #12
nej \ duer ikke :(
Avatar billede arne_v Ekspert
10. januar 2004 - 21:01 #13
"c:/database.data" virker men "c:\\database.data" virker ikke ?

.replace('\\','/') virker jo tiltalende så.
Avatar billede roo104 Nybegynder
10. januar 2004 - 21:05 #14
"c:\\database.data" eller "c:\database.data" virker ikke
String file = request.getParameter("file").replace('\\','/');
Virker heller ikka da jeg kun får fil navnnet og ikke hele stien
Avatar billede arne_v Ekspert
10. januar 2004 - 21:20 #15
Jeg tror jeg mistede den røde tråd
Avatar billede roo104 Nybegynder
10. januar 2004 - 21:26 #16
Efter at have lavet noget der vist kaldes en path test, får jeg noget besynderligt.

if (file.indexOf("/") != -1) {
            String fileName = file.substring(file.lastIndexOf("/")+1);
            attachment.setFileName(fileName);
            out.print(1);

"c:\\database.data" eller "c:\database.data" sender mig ned i else(3) delen og ikke if else(2) ?
"c:/database.data" går rigtignok ind i if delen (1)
        }
        else if (file.indexOf("\\") != -1) {
            String fileName = file.substring(file.lastIndexOf("\\")+1);
            attachment.setFileName(fileName);
            out.print(2);
        }
        else {
            attachment.setFileName(file);
            out.print(3);
        }
Avatar billede arne_v Ekspert
10. januar 2004 - 21:30 #17
Mystisk.

Kunne du prøve med:

out.print(file);

inden og se om der er lavet noget suspekt URLencoding eller lignende ?
Avatar billede roo104 Nybegynder
10. januar 2004 - 21:30 #18
if (file.indexOf("/") != -1) {
            String fileName = file.substring(file.lastIndexOf("/")+1);
            attachment.setFileName(fileName);
            out.print(1);
if (file.indexOf("/") != -1) {
            String fileName = file.substring(file.lastIndexOf("/")+1);
            attachment.setFileName(fileName);

"c:\\database.data" eller "c:\database.data" sender mig ned i else(3) delen og ikke if else(2) ?
"c:/database.data" går rigtignok ind i if delen (1)

Der mangler en edit funktion på eksperten :)
            out.print(1);
Avatar billede roo104 Nybegynder
10. januar 2004 - 21:31 #19
ej det ville den ikke, men du kan nok se havd jeg mente.
out.print(file) giver mig database.data
Avatar billede arne_v Ekspert
10. januar 2004 - 21:33 #20
Siger du at out.print(file) giver

database.data for \

men

C:/database.data for /

?
Avatar billede roo104 Nybegynder
10. januar 2004 - 21:38 #21
C:/database.data for C:/database.data
men bare database.data for C:\database.data
Avatar billede roo104 Nybegynder
10. januar 2004 - 21:40 #22
den får kun filnavnet med når jeg submiter med en \ i
Avatar billede arne_v Ekspert
10. januar 2004 - 21:41 #23
Tja - så er det jo ikke overraskende at den ender i den sidste else !
Avatar billede arne_v Ekspert
10. januar 2004 - 21:42 #24
Har du mulighed for at omkode frontend så / er acceptabelt ?
Avatar billede roo104 Nybegynder
10. januar 2004 - 21:46 #25
uhh den forstod jeg nok ikke helt, men jeg har fuld adgang over serveren, så ja vil jeg tro
Avatar billede roo104 Nybegynder
10. januar 2004 - 21:48 #26
har kigget lidt på det med at file fields i html.
Mit ser sådan her ud <form name="form" method="get" action="mailattach.jsp" enctype="multipart/form-data"> har prøvet med flere forskellige enctypes men uden held

Bruger kun get for at teste hvad der bliver sendt med
Avatar billede arne_v Ekspert
10. januar 2004 - 21:51 #27
Hvad sker der uden enctype ?
Avatar billede roo104 Nybegynder
10. januar 2004 - 21:57 #28
det samme, jeg havde den ikke med under alle mine tests
Avatar billede arne_v Ekspert
10. januar 2004 - 21:59 #29
Hvordan ser file feltet ud ?
Avatar billede roo104 Nybegynder
10. januar 2004 - 22:00 #30
OK, det er noget html noget, hvis jeg kører det uden jsp kode som ren html kommer \ heller ikke med!
Avatar billede roo104 Nybegynder
10. januar 2004 - 22:03 #31
<input type="file" name="file">
Avatar billede arne_v Ekspert
10. januar 2004 - 22:07 #32
Nu er jeg lidt desorienteret.

type="file" bruges til upload af en fil fra den maskine browseren kører
på til den maskine serveren kører på.

At filen hedder C:\database.data ude på klienten er vel ret
uintereesant på serveren.

Jeg troede at man fra browseren bare angav et filnavn med type="text"
og at filnavnet så blev fundet på serveren.
Avatar billede roo104 Nybegynder
10. januar 2004 - 22:10 #33
prøv at se hvordan formen ser ud: http://212.242.204.129:8080/test/mailattach.jsp
Du kan prøve at sende en mail til mig og se hvorden den opfører sig
Avatar billede arne_v Ekspert
10. januar 2004 - 22:15 #34
Det er jo en rigtig type="file", men så skal C:\ og C:/ jo da smides væk.

Hvilket dir filen ligger i på min PC er da ret ligegyldigt.

På din server ender de i et upload eller temp dir og ikke
i det originale dir.

(ellers så skal en ondsindet person hurtigt få zappet din PC !)
Avatar billede roo104 Nybegynder
10. januar 2004 - 22:18 #35
hvordan ville man så lave en vedhæft fil ting i html, så brugeren kan browse sin harddisk og ved hæfte filen
Avatar billede roo104 Nybegynder
10. januar 2004 - 22:19 #36
Hvordan skulle en ondsindet person få lagt noget på min pc, det er jo hans egen han browser ?
Avatar billede arne_v Ekspert
10. januar 2004 - 22:22 #37
Altså:
  - der genereres en HTML form
  - client browser en fil på hans PC
  - submit sender filnavn + fil indhold til server
  - server gemmer fil i upload/temp dir
  - server attacher fil til email
  - server sender email

Det er den rigtige måde.

Men placering på client PC skal ikke sendes op til server.
Avatar billede arne_v Ekspert
10. januar 2004 - 22:23 #38
Sikkerheds problemet opstår hvis du på server eller modtagere af email
forsøger at gemme filen med den originale sti.
Avatar billede arne_v Ekspert
10. januar 2004 - 22:24 #39
f.eks. C:\WINNT\system32\KERNEL32.DLL
Avatar billede roo104 Nybegynder
10. januar 2004 - 22:24 #40
jeg får heller ikke endelsen med i mailen den bliver kastet væk, men den skal sendes med når formen submites
Avatar billede roo104 Nybegynder
10. januar 2004 - 22:30 #41
Eller hvordan burde det så blive lavet ?
Avatar billede roo104 Nybegynder
10. januar 2004 - 22:31 #42
Skal jeg have en upload funktion også ? så så sender filen først hvorefter mailen bliver lavet og filen vedhæftet ?
Avatar billede roo104 Nybegynder
10. januar 2004 - 22:42 #43
her er noget http://java.sun.com/developer/technicalArticles/javaserverpages/emailapps/ prøver at kigge på det.
Arne hvis du smider et svar skal jeg nok lade værd med at plage dig mere :)
Avatar billede arne_v Ekspert
10. januar 2004 - 22:48 #44
ok
Avatar billede arne_v Ekspert
10. januar 2004 - 22:49 #45
Du kan jo prøve det tag library.

Men du skal som sagt ikke forvente at få path med.

Extension burde komme med.
Avatar billede roo104 Nybegynder
10. januar 2004 - 22:52 #46
Der er meget på nettet om web mail med javamail, så der er håb forude endnu :)
Avatar billede arne_v Ekspert
10. januar 2004 - 22:57 #47
Der er lavet masser af web javamail, men ikke så meget med
attachments !
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester