內(nèi)容來(lái)自:
http://www.oschina.net/bbs/thread/528
以下代碼經(jīng)過(guò)測(cè)試了的能通過(guò)
我在用javaMail做收郵件時(shí)怎么郵件內(nèi)容重復(fù)(一種文本格式的,一種html格式的),并且圖片無(wú)法正常顯示:
答:內(nèi)容重復(fù),,因?yàn)楹芏噜]件工具在發(fā)送HTML郵件的時(shí)候,,為了防止接收端無(wú)法閱讀html郵件,,都附送了一份純文本的郵件。解析的時(shí)候需要對(duì)這種情況進(jìn)行過(guò)濾
這是我用的代碼:請(qǐng)高手指教:
package com.espeed.test;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Properties;
import javax.mail.BodyPart;
import javax.mail.Flags;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.Part;
import javax.mail.Session;
import javax.mail.Store;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeUtility;
public class PraseMimeMessage{
private MimeMessage mimeMessage=null;
private String saveAttachPath="";//附件下載后的存放目錄
private StringBuffer bodytext=new StringBuffer();
//存放郵件內(nèi)容的StringBuffer對(duì)象
private String dateformat="yy-MM-dd HH:mm";//默認(rèn)的日前顯示格式
/**
* 構(gòu)造函數(shù),初始化一個(gè)MimeMessage對(duì)象
*/
public PraseMimeMessage() {
}
public PraseMimeMessage(MimeMessage mimeMessage) {
this.mimeMessage=mimeMessage;
}
public void setMimeMessage(MimeMessage mimeMessage){
this.mimeMessage=mimeMessage;
}
/**
* 獲得發(fā)件人的地址和姓名
*/
public String getFrom1()throws Exception{
InternetAddress address[]=(InternetAddress[])mimeMessage.getFrom();
String from=address[0].getAddress();
if(from==null){
from="";
}
String personal=address[0].getPersonal();
if(personal==null){
personal="";
}
String fromaddr=personal+"<"+from+">";
return fromaddr;
}
/**
* 獲得郵件的收件人,,抄送,,和密送的地址和姓名,,根據(jù)所傳遞的參數(shù)的不同
* "to"----收件人 "cc"---抄送人地址 "bcc"---密送人地址
* @throws Exception */
public String getMailAddress(String type){
String mailaddr="";
try {
String addtype=type.toUpperCase();
InternetAddress []address=null;
if(addtype.equals("TO")||addtype.equals("CC")||addtype.equals("BBC")){
if(addtype.equals("TO")){
address=(InternetAddress[])mimeMessage.getRecipients(Message.RecipientType.TO);
}
else if(addtype.equals("CC")){
address=(InternetAddress[])mimeMessage.getRecipients(Message.RecipientType.CC);
}
else{
address=(InternetAddress[])mimeMessage.getRecipients(Message.RecipientType.BCC);
}
if(address!=null){
for (int i = 0; i < address.length; i++) {
String email=address[i].getAddress();
if(email==null)email="";
else{
email=MimeUtility.decodeText(email);
}
String personal=address[i].getPersonal();
if(personal==null)personal="";
else{
personal=MimeUtility.decodeText(personal);
}
String compositeto=personal+"<"+email+">";
mailaddr+=","+compositeto;
}
mailaddr=mailaddr.substring(1);
}
}
else{
}
} catch (Exception e) {
// TODO: handle exception
}
return mailaddr;
}
/**
* 獲得郵件主題
*/
public String getSubject()
{
String subject="";
try {
subject=MimeUtility.decodeText(mimeMessage.getSubject());
if(subject==null)subject="";
} catch (Exception e) {
// TODO: handle exception
}
return subject;
}
/**
* 獲得郵件發(fā)送日期
*/
public String getSendDate()throws Exception{
Date senddate=mimeMessage.getSentDate();
SimpleDateFormat format=new SimpleDateFormat(dateformat);
return format.format(senddate);
}
/**
* 解析郵件,,把得到的郵件內(nèi)容保存到一個(gè)StringBuffer對(duì)象中,,解析郵件
* 主要是根據(jù)MimeType類(lèi)型的不同執(zhí)行不同的操作,一步一步的解析
*/
public void getMailContent(Part part)throws Exception{
String contenttype=part.getContentType();
int nameindex=contenttype.indexOf("name");
boolean conname=false;
if(nameindex!=-1)conname=true;
if(part.isMimeType("text/plain")&&!conname){
bodytext.append((String)part.getContent());
}else if(part.isMimeType("text/html")&&!conname){
bodytext.append((String)part.getContent());
}
else if(part.isMimeType("multipart/*")){
Multipart multipart=(Multipart)part.getContent();
int counts=multipart.getCount();
for(int i=0;i<counts;i++){
getMailContent(multipart.getBodyPart(i));
}
}else if(part.isMimeType("message/rfc822")){
getMailContent((Part)part.getContent());
}
else{}
}
/**
* 獲得郵件正文內(nèi)容
*/
public String getBodyText(){
return bodytext.toString();
}
/**
* 判斷此郵件是否需要回執(zhí),,如果需要回執(zhí)返回"true",否則返回"false"
* @throws MessagingException */
public boolean getReplySign() throws MessagingException{
boolean replysign=false;
String needreply[]=mimeMessage.getHeader("Disposition-Notification-To");
if(needreply!=null){
replysign=true;
}
return replysign;
}
/**
* 獲得此郵件的Message-ID
* @throws MessagingException */
public String getMessageId() throws MessagingException{
return mimeMessage.getMessageID();
}
/**
* 【判斷此郵件是否已讀,,如果未讀返回返回false,反之返回true】
* @throws MessagingException */
public boolean isNew() throws MessagingException{
boolean isnew =false;
Flags flags=((Message)mimeMessage).getFlags();
Flags.Flag[]flag=flags.getSystemFlags();
for (int i = 0; i < flag.length; i++) {
if(flag[i]==Flags.Flag.SEEN){
isnew=true;
break;
}
}
return isnew;
}
/**
* 判斷此郵件是否包含附件
* @throws MessagingException */
public boolean isContainAttach(Part part) throws Exception{
boolean attachflag=false;
String contentType=part.getContentType();
if(part.isMimeType("multipart/*")){
Multipart mp=(Multipart)part.getContent();
//獲取附件名稱可能包含多個(gè)附件
for(int j=0;j<mp.getCount();j++){
BodyPart mpart=mp.getBodyPart(j);
String disposition=mpart.getDescription();
if((disposition!=null)&&((disposition.equals(Part.ATTACHMENT))||(disposition.equals(Part.INLINE)))){
attachflag=true;
}else if(mpart.isMimeType("multipart/*")){
attachflag=isContainAttach((Part)mpart);
}else{
String contype=mpart.getContentType();
if(contype.toLowerCase().indexOf("application")!=-1) attachflag=true;
if(contype.toLowerCase().indexOf("name")!=-1) attachflag=true;
}
}
}else if(part.isMimeType("message/rfc822")){
attachflag=isContainAttach((Part)part.getContent());
}
return attachflag;
}
/**
* 【保存附件】
* @throws Exception
* @throws IOException
* @throws MessagingException
* @throws Exception */
public void saveAttachMent(Part part) throws Exception {
String fileName="";
if(part.isMimeType("multipart/*")){
Multipart mp=(Multipart)part.getContent();
for(int j=0;j<mp.getCount();j++){
BodyPart mpart=mp.getBodyPart(j);
String disposition=mpart.getDescription();
if((disposition!=null)&&((disposition.equals(Part.ATTACHMENT))||(disposition.equals(Part.INLINE)))){
fileName=mpart.getFileName();
if(fileName.toLowerCase().indexOf("GBK")!=-1){
fileName=MimeUtility.decodeText(fileName);
}
saveFile(fileName,mpart.getInputStream());
}
else if(mpart.isMimeType("multipart/*")){
fileName=mpart.getFileName();
}
else{
fileName=mpart.getFileName();
if((fileName!=null)){
fileName=MimeUtility.decodeText(fileName);
saveFile(fileName,mpart.getInputStream());
}
}
}
}
else if(part.isMimeType("message/rfc822")){
saveAttachMent((Part)part.getContent());
}
}
/**
* 【設(shè)置附件存放路徑】
*/
public void setAttachPath(String attachpath){
this.saveAttachPath=attachpath;
}
/**
* 【設(shè)置日期顯示格式】
*/
public void setDateFormat(String format){
this.dateformat=format;
}
/**
* 【獲得附件存放路徑】
*/
public String getAttachPath()
{
return saveAttachPath;
}
/**
* 【真正的保存附件到指定目錄里】
*/
private void saveFile(String fileName,InputStream in)throws Exception{
String osName=System.getProperty("os.name");
String storedir=getAttachPath();
String separator="";
if(osName==null)osName="";
if(osName.toLowerCase().indexOf("win")!=-1){
//如果是window 操作系統(tǒng)
separator="/";
if(storedir==null||storedir.equals(""))storedir="c:\tmp";
}
else{
//如果是其他的系統(tǒng)
separator="/";
storedir="/tmp";
}
File strorefile=new File(storedir+separator+fileName);
BufferedOutputStream bos=null;
BufferedInputStream bis=null;
try {
bos=new BufferedOutputStream(new FileOutputStream(strorefile));
bis=new BufferedInputStream(in);
int c;
while((c=bis.read())!=-1){
bos.write(c);
bos.flush();
}
} catch (Exception e) {
// TODO: handle exception
}finally{
bos.close();
bis.close();
}
}
/**
* PraseMimeMessage類(lèi)測(cè)試
* @throws Exception */
public static void main(String[] args) throws Exception {
String host="mail.21gmail.com";
String username="[email protected]";
String password="123456789";
Properties props=new Properties();
Session session=Session.getDefaultInstance(props,null);
Store store=session.getStore("pop3");
store.connect(host,username,password);
Folder folder=store.getFolder("INBOX");
folder.open(Folder.READ_ONLY);
Message message[]=folder.getMessages();
PraseMimeMessage pmm=null;
for (int i = 0; i < message.length; i++) {
System.out.println("****************************************第"+(i+1)+"封郵件**********************************");
pmm=new PraseMimeMessage((MimeMessage)message[i]);
System.out.println("主題 :"+pmm.getSubject());
pmm.setDateFormat("yy年MM月dd日 HH:mm");
System.out.println("發(fā)送時(shí)間 :"+pmm.getSendDate());
System.out.println("是否回執(zhí) :"+pmm.getReplySign());
System.out.println("是否包含附件 :"+pmm.isContainAttach((Part)message[i]));
System.out.println("發(fā)件人 :"+pmm.getFrom1());
System.out.println("收件人 :"+pmm.getMailAddress("TO"));
System.out.println("抄送地址 :"+pmm.getMailAddress("CC"));
System.out.println("密送地址 :"+pmm.getMailAddress("BCC"));
System.out.println("郵件ID :"+i+":"+pmm.getMessageId());
pmm.getMailContent((Part)message[i]); //根據(jù)內(nèi)容的不同解析郵件
pmm.setAttachPath("d:/temp"); //設(shè)置郵件附件的保存路徑
pmm.saveAttachMent((Part)message[i]); //保存附件
System.out.println("郵件正文 :"+pmm.getBodyText());
System.out.println("*********************************第"+(i+1)+"封郵件結(jié)束*************************************");
}
}
}