7

JavaMail で非 ASCII ファイル名の添付ファイルを送信できますが、ダウンロードできません。ファイル名にASCII以外の文字が含まれている添付ファイルに対して、特にjava.io.FileNotFoundExceptionを取得しています。

参考:messageBodyPart.setFileName(MimeUtility.encodeText(filename[i])) テキストをエンコードしMimeUtility.decodeText(bodyPart.getFileName())、非ASCIIファイル名をデコードするようなものを使用しています

これに対する回避策はありますか?

EDIT @Bill、これは添付ファイルを読み取るコードの一部です。コードに properties.setProperty("mail.mime.decodeparameters", "true") および properties.setProperty("mail.mime.decodefilename", "true") プロパティも追加しました。

if (message[a].getContent() instanceof MimeMultipart) {
                Multipart multipart = (Multipart) message[a].getContent();
                for (int i = 0; i < multipart.getCount(); i++) {
                    bodyPart = multipart.getBodyPart(i);                     
                    disposition = bodyPart.getDisposition();                    
                    if (disposition != null && (disposition.equals(BodyPart.ATTACHMENT) || (disposition.equals(BodyPart.INLINE)))) {
                        DataHandler handler = bodyPart.getDataHandler(); 
                        String path = bodyPart.getFileName();
                        String[] str = path.split("/");                         
                        String fileName = str[str.length - 1];                       

                        String filePath = ReadConfigPropertiesFile.getPropertyValue("server.buildpath");
                        System.out.println(fileName);
                        File tempDir = new File(filePath + user);
                        if (!tempDir.exists()) {
                            tempDir.mkdir();
                        }
                        File saveFile = new File(tempDir + "/" + fileName);
                        int count = 0;
                        while (saveFile.exists()) {
                          count++;
                          saveFile = new File(tempDir + "/" + count + "_" + fileName);
                        } 

                        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(saveFile));
                        byte[] buff = new byte[2048];
                        InputStream is = bodyPart.getInputStream();
                        int ret = 0;
                        while ((ret = is.read(buff)) > 0) {
                            bos.write(buff, 0, ret);
                        }
                        bos.close();
                        is.close();
                        //System.out.println(bodyPart.getContentType());


                    }else {
                        //display body (message) of the attachment;
                        //System.out.println(bodyPart.getContent().toString());

                   }
           }
     }

上記のコードは、BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(saveFile))行で FileNotFoundException 例外を発生させます。これは、ファイル名が非 ASCII 文字 (ሰላም.pdf など) である添付ファイルに対して発生しています。他のすべては正常に動作します。

4

2 に答える 2

7

この回答は、@semytech (OP) のコメントから取得されました。そこで見つけるのが難しかったので、より見やすくするために回答として追加します。ヘブライ語のファイル名で役立ちました。

MimeBodyPart attachment = new MimeBodyPart();
attachment.setFileName(MimeUtility.encodeText(filename, "UTF-8", null));
于 2016-02-14T14:23:24.433 に答える
0

自分でエンコードやデコードを行う必要はありません。

エンコード/デコードを行うよう JavaMail に指示するために設定できるプロパティのセットが 2 つあります。

  • mail.mime.encode ファイル名/mail.mime.decode ファイル名
  • mail.mime.encodeparameters/mail.mime.decodeparameters

詳細については、javax.mail.internetパッケージの javadoc を参照してください。

最初のセットでは、自分で行っているのと同様に、非標準のエンコード手法を使用しています。これは、この手法を使用する一部の古いメーラーでは問題なく機能します。

2 番目のセットは、MIME 標準のエンコード技術を使用します。このバージョンは、最新のほとんどのメーラーで動作します。

これは、FileNotFoundException が発生する理由を説明していませんが、例外が発生したときに何をしているのかを知るのに十分な詳細を提供していません。

于 2013-03-09T18:48:29.057 に答える