通過javamail傳送郵件加附件的功能以及附件名稱亂碼的處理
阿新 • • 發佈:2021-02-05
傳送郵件新增附件
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);
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;
}