yahhuop 2010-03-26 09:03
浏览 1098
已采纳

javamail接收的邮件,如果附件过大,则报错无法接收

用javamail接收邮件,当附件过大时(5M以上),则会报如下错误信息:
javax.mail.MessagingException: No inputstream from datasource
at javax.mail.internet.MimeMultipart.parsebm(MimeMultipart.java:646)
at javax.mail.internet.MimeMultipart.parse(MimeMultipart.java:383)
at javax.mail.internet.MimeMultipart.getCount(MimeMultipart.java:229)
at com.sipai.mail.PraseMimeMessag.getMailContent(PraseMimeMessag.java:662)
at com.sipai.mail.Email_Autherticatorin.collectmail(Email_Autherticatorin.java:720)

经查看,提示在counts = multipart.getCount()处错误,我现将该块的相关代码贴在后面,这块是用来解析邮件正文和附件的代码。

public void getMailContent(Part part,String emlurltruetmp,String userid) throws Exception {
    // 以下为将eml文件存放到指定位置
    String emlurl = ".eml"; // 得到eml的名字
    String emlname1 = createfilename(userid); // 得到文件目录名字,通过绝对路径取得
    String emltruename = emlurltruetmp + emlname1 + emlurl;// 得到将要存放的文件绝对路径全名称,用户将邮件打包成eml格式
    emltruename=emltruename.replace("\\", "\\\\");
    emlname=emltruename;
    //savemailemlurl(emltruename);//暂时不需要生成eml文件
    // 以上为结束

    String contenttype = part.getContentType();
    try{
        int nameindex = contenttype.indexOf("name");
        boolean conname = false;
        if (nameindex != -1) {
            conname = true;
        }
        if (part.isMimeType("text/plain") && !conname) {

// System.out.println("text/plain");
try{
bodytext.append(todecodeText((String) part.getContent()));
}catch(UnsupportedEncodingException uex){
InputStream is = part.getInputStream();
bodytext.append(is);
}
} else if (part.isMimeType("text/html") && !conname) {
// System.out.println("text/html");
if(bodytext==null || bodytext.toString().trim().equals("")){
try{
bodytext.append(todecodeText((String) part.getContent()));
}catch(UnsupportedEncodingException uex){
InputStream is = part.getInputStream();
bodytext.append(is);
}

            }else{

                bodytext.delete(0, bodytext.length()-1);
                try{
                    bodytext.append(todecodeText((String) part.getContent()));
                }catch(UnsupportedEncodingException uex){
                    InputStream is = part.getInputStream();
                    bodytext.append(is);
                }
            }
        } else if (part.isMimeType("multipart/*")) {
            //System.out.println("multipart/*");
            Multipart multipart = (Multipart) part.getContent();
            int counts=0;
            if (multipart instanceof Multipart){
                try{
                    counts = multipart.getCount();  
                }catch(MessagingException e){
                    e.printStackTrace();
                    //attachflag=false;
                    counts=1;
                }
                for (int i = 0; i < counts; i++) {
                    getMailContent(multipart.getBodyPart(i),emlurltruetmp,userid);
                }   
            }
        } else if (part.isMimeType("message/rfc822")) {
            //System.out.println("message/rfc822");
            getMailContent((Part) part.getContent(),emlurltruetmp,userid);
        } else {

        }
    }catch(Exception e){
        e.printStackTrace();
    }
}
  • 写回答

6条回答 默认 最新

  • lzj0470 2010-03-27 22:14
    关注

    我建议你先写一个SOCKET的传送,然后把你的接收或者传送代码替换掉,我在局域网传送18G的东西,传送时间是1个小时。

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

报告相同问题?

悬赏问题

  • ¥100 求数学坐标画圆以及直线的算法
  • ¥100 c语言,请帮蒟蒻写一个题的范例作参考
  • ¥15 名为“Product”的列已属于此 DataTable
  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 自己瞎改改,结果现在又运行不了了
  • ¥15 链式存储应该如何解决
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站