1. 程式人生 > 其它 >通過javamail傳送郵件加附件的功能以及附件名稱亂碼的處理

通過javamail傳送郵件加附件的功能以及附件名稱亂碼的處理

技術標籤:Javajava亂碼

傳送郵件新增附件
  1. FileDataSource, 可以傳送本地指定路徑的檔案,比如d:\test.jpg的圖片。
BodyPart bp = new MimeBodyPart();
FileDataSource fileds = new FileDataSource(“d:\\test.jpg”);
bp.setDataHandler(new DataHandler(fileds));
// setStringCoding 檔名轉碼 防止亂碼
String fileNameTmp = setStringCoding(fileds.getName());
bp.
setFileName(fileNameTmp); mp.addBodyPart(bp);
  1. ByteArrayDataSource, 以位元組陣列的形式傳送郵件的檔案。
    getBytesFromURL方法見附錄)
BodyPart bp = new MimeBodyPart();
// getBytesFromURL -> 將網路地址檔案 轉換為字元陣列
ByteArrayDataSource fileds = new 
ByteArrayDataSource(getBytesFromURL("www.baidu.com/pikaqiu.jpg"), "application/octet-stream"
); bp.setDataHandler(new DataHandler(fileds)); String fileNameTmp = setStringCoding(fileName); bp.setFileName(fileNameTmp); mp.addBodyPart(bp);

轉碼,防止中文亂碼的方法。

  //轉碼,中文
    public static String setStringCoding(String name) throws UnsupportedEncodingException {
        return MimeUtility.encodeText(name)
; }
郵件附件名亂碼

我以為加了上面的MimeUtility.encodeText(name);就不會亂碼
然後 …
以下是收到的兩個郵件。

  • foxmail開啟:
    在這裡插入圖片描述
  • outlook開啟:
    在這裡插入圖片描述

後來才發現解決方法是,加上以下程式碼。

   System.getProperties().setProperty("mail.mime.splitlongparameters","false");
附錄 - 根據一個網路地址,獲取該檔案/圖片的位元組陣列。

    public static byte[] getBytesFromURL(String urlPath) {
        byte[] data = null;
        InputStream is = null;
        HttpURLConnection conn = null;
        try {
            URL url = new URL(urlPath);
            conn = (HttpURLConnection) url.openConnection();
            conn.setDoInput(true);
            // conn.setDoOutput(true);
            conn.setRequestMethod("GET");
            conn.setConnectTimeout(6000);
            is = conn.getInputStream();
            if (conn.getResponseCode() == 200) {
                data = readInputStream(is);
            } else{
                data=null;
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if(is != null){
                    is.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            conn.disconnect();
        }
        return data;
    }

    public static byte[] readInputStream(InputStream is) {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        byte[] buffer = new byte[1024];
        int length = -1;
        try {
            while ((length = is.read(buffer)) != -1) {
                baos.write(buffer, 0, length);
            }
            baos.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }
        byte[] data = baos.toByteArray();
        try {
            is.close();
            baos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return data;
    }