qq_36567914 2017-03-04 13:13 采纳率: 100%
浏览 1057
已采纳

有关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");
    }
}

}

  • 写回答

3条回答 默认 最新

  • qq_36567914 2017-03-04 15:08
    关注

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 ansys fluent计算闪退
  • ¥15 有关wireshark抓包的问题
  • ¥15 Ubuntu20.04无法连接GitHub
  • ¥15 需要写计算过程,不要写代码,求解答,数据都在图上
  • ¥15 向数据表用newid方式插入GUID问题
  • ¥15 multisim电路设计
  • ¥20 用keil,写代码解决两个问题,用库函数
  • ¥50 ID中开关量采样信号通道、以及程序流程的设计
  • ¥15 U-Mamba/nnunetv2固定随机数种子
  • ¥30 C++行情软件的tick数据如何高效的合成K线