有关javamail的问题,为什么我不能将附件报错至d盘的子文件夹,而只能存在d盘

为什么我在设置附件下载地址的时候,能成功放在e盘d盘,但无法放到那下面的子目录中。。。import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
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 TestMail {
 
private MimeMessage mimeMessage = null ; 
private String saveAttachPath = ""; // 附件下载后的存放目录
private StringBuffer bodyText = new StringBuffer(); // 存放邮件内容的StringBuffer对象

/**
 * 构造函数,初始化一个MimeMessage对象
 */

public TestMail(MimeMessage mimeMessage) {
    this.mimeMessage = mimeMessage;
}

public void setMimeMessage(MimeMessage mimeMessage) {
    this.mimeMessage = mimeMessage;
}

/**
 *  * 获得发件人的地址和姓名  
 */
public String getFrom() throws Exception{
    InternetAddress address[] = (InternetAddress[])mimeMessage.getFrom(); 
    String from = address[0].getAddress() ; 
    if(from == null){
        from  = " " ;
        System.out.println("未知发送来源");
    }

    String personal = address[0].getPersonal() ;
    if(personal == null){
        personal  = " " ;
        System.out.println("未知发送者");
    }

    String fromAddr = null ; 
    if (personal != null || from != null) {
        fromAddr = personal + "<" + from + ">";
        System.out.println("发送者是:" + fromAddr);
    } else {
        System.out.println("无法获得发送者信息.");
    }
    return fromAddr;
}

/**
 *  * 获得邮件主题  
 */
public String getSubject() throws MessagingException {
    String subject = " " ;
    try{
        subject = MimeUtility.decodeText(mimeMessage.getSubject());  
        if (subject == null) {
            subject = "";
        }
    }catch(Exception e){
        e.printStackTrace(); 
    }
    return subject ; 
}

/**
 * 判断此邮件是否已读,如果未读返回false,反之返回true
 */
public boolean isNew() throws MessagingException {
    boolean isNew = false ; 
    Flags flags = mimeMessage.getFlags() ;
    Flags.Flag[] flag = flags.getSystemFlags() ; //返回Flags对象中所有的系统标记
    for(int i = 0 ; i<flag.length ; i++){
        if(flag[i] == Flags.Flag.SEEN)
                isNew = true ; 
    }
    return isNew;
}

/**
 * 判断此邮件是否包含附件
 */
public boolean isContainAttach(Part part) throws Exception{
    boolean attachFlag = false;
    if(part.isMimeType("multipart/*")){
        Multipart mp = (Multipart) part.getContent();
        for(int i = 0 ; i<mp.getCount() ; i++){
            BodyPart mPart = mp.getBodyPart(i);
            String disposition = mPart.getDisposition();
            if((disposition != null)
                    && ((disposition.equals(Part.ATTACHMENT)) || (disposition.equals(Part.INLINE))))
                            //ATTACHMENT<附件> 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;
     
}

/**
 * 保存附件
 * @param part 邮件中多个组合体中的其中一个组合体
 * @param destDir  附件保存目录
 * @throws UnsupportedEncodingException
 * @throws MessagingException
 * @throws FileNotFoundException
 * @throws IOException
 */
public static void saveAttachment(Part part, String destDir) throws UnsupportedEncodingException, MessagingException,
        FileNotFoundException, IOException {
    if (part.isMimeType("multipart/*")) {
        Multipart multipart = (Multipart) part.getContent();    //复杂体邮件
        //复杂体邮件包含多个邮件体
        int partCount = multipart.getCount();
        for (int i = 0; i < partCount; i++) {
            //获得复杂体邮件中其中一个邮件体
            BodyPart bodyPart = multipart.getBodyPart(i);
            //某一个邮件体也有可能是由多个邮件体组成的复杂体
            String disp = bodyPart.getDisposition();
            if (disp != null && (disp.equalsIgnoreCase(Part.ATTACHMENT) || disp.equalsIgnoreCase(Part.INLINE))) {
                InputStream is = bodyPart.getInputStream();
                saveFile(is, destDir, decodeText(bodyPart.getFileName()));
            } else if (bodyPart.isMimeType("multipart/*")) {
                saveAttachment(bodyPart,destDir);
            } else {
                String contentType = bodyPart.getContentType();
                if (contentType.indexOf("name") != -1 || contentType.indexOf("application") != -1) {
                    saveFile(bodyPart.getInputStream(), destDir, decodeText(bodyPart.getFileName()));
                }
            }
        }
    } else if (part.isMimeType("message/rfc822")) {
        saveAttachment((Part) part.getContent(),destDir);
    }
}

/**
 * 读取输入流中的数据保存至指定目录
 * @param in 输入流
 * @param fileName 文件名
 * @param destDir 文件存储目录
 * @throws FileNotFoundException
 * @throws IOException
 */
private static void saveFile(InputStream in, String destDir, String fileName)
        throws FileNotFoundException, IOException {
    BufferedInputStream bis = new BufferedInputStream(in);
    BufferedOutputStream bos = new BufferedOutputStream(
            new FileOutputStream(new File(destDir+fileName)));
    int len = -1;
    while ((len = bis.read()) != -1) {
        bos.write(len);
        bos.flush();
    }
    bos.close();
    bis.close();
}

/**
 * 文本解码
 * @param encodeText 解码MimeUtility.encodeText(String text)方法编码后的文本
 * @return 解码后的文本
 * @throws UnsupportedEncodingException
 */
public static String decodeText(String encodeText) throws UnsupportedEncodingException {
    if (encodeText == null || "".equals(encodeText)) {
        return "";
    } else {
        return MimeUtility.decodeText(encodeText);
    }
}


/**
 * 测试
 */
public static void main(String args[]) throws Exception{
    String host = "pop.163.com";
    String username = "*********";
    String password = "*************";    //邮箱信息
    String protocol = "pop3";

    Properties prop = new Properties();//Properties类用于读取Java的配置文件
    prop.setProperty("mail.pop3.store","pop3");
    prop.setProperty("mail.pop3.host","pop.163.com");
    Session session = Session.getDefaultInstance(prop, null);//Session类用于定义应用程序所需的环境信息


    Store store = session.getStore(protocol);
    store.connect(host, username, password);

    Folder folder = store.getFolder("INBOX");
    folder.open(Folder.READ_ONLY);
    Message message[] = folder.getMessages();
    System.out.println("邮件数量: " + message.length);
    TestMail re = null;

    for (int i = 0;i < message.length; i++){
        re = new TestMail((MimeMessage) message[i]);
        System.out.println("邮件 " +(i+1) + " 发送人地址: " + re.getFrom());
        System.out.println( " 是否已读: " + re.isNew());
        System.out.println( " 是否包含附件: "
                + re.isContainAttach((Part) message[i]));
        System.out.println( " 主题: " + re.getSubject());
        System.out.println();
        re.saveAttachment((Part)message[i],"D:\\cp1");
    }
}

}

0

3个回答

已经知道答案了,在destDir和fileName之间加“\”,否则地址不对

0

是保存。。。打错了。。。。。

0

其实没有必要纠结于此,再加一段,保存完附件报错后,读取E盘目录下的那个 文件,复制到你想要的目录下,然后删除原来的文件,

0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!