【问题标题】:Big attachment cause outofmemory Exception in android javamailandroid javamail中的大附件导致内存不足异常
【发布时间】:2014-03-12 04:11:42
【问题描述】:

我正在使用 javamail 将邮件添加到 android 应用程序中的文件夹。

在这个应用程序中,我使用下面链接中的 javamail api http://code.google.com/p/javamail-android/downloads/list

我为此使用 IMAP 协议。

下面是我的代码。

     // add atachment
      messageBodyPart = new MimeBodyPart();

      DataSource source = new FileDataSource(file.getAbsolutePath()); 

      messageBodyPart.setDataHandler(new DataHandler(source));

      messageBodyPart.setFileName(file.getName()); 


      _multipart.addBodyPart(messageBodyPart); 

然后我使用下面的行将消息附加到文件夹。

          try{
                 Log.v(tag, "Sending Mail");    

                 f.appendMessages(msg1);     

                 sucess_flag=1;
                 Log.v(tag, "Mail Send");
             }
             catch(Exception e)
             {
                e.printStackTrace(); 

             }catch(Throwable e)
             {
                    e.printStackTrace(); 
             }

但我仍然遇到内存不足的异常。

我已经 lsof 尝试了下面的代码,但没有成功。 // 添加附件 messageBodyPart = new MimeBodyPart();

     FileInputStream fs=new FileInputStream(file.getAbsoluteFile());
     DataSource source =new ByteArrayDataSource(fs, mimetype);
      messageBodyPart.setDataHandler(new DataHandler(source));

      messageBodyPart.setFileName(file.getName()); 


      _multipart.addBodyPart(messageBodyPart); 

我想如果我创建 Inputstream 那么它将以小块发送但它不起作用。

【问题讨论】:

    标签: android jakarta-mail


    【解决方案1】:

    FileDataSource 是正确的方法,或者只是使用newer versions of JavaMail 中的attachFile 方法。

    JavaMail 需要准确地计算出消息的大小,然后才能附加它。为此,它需要读取消息的所有数据。如果消息足够小,它将缓存这些数据,以便在发送消息时不必再次读取它。默认情况下,它将尝试将整个消息缓存在内存中。您可以设置mail.imap.appendbuffersize Session property 来限制将被缓存的消息的大小。

    【讨论】:

    • 嗨,我已经设置了属性。 props.put("mail.imap.appendbuffersize", 8192); 但结果相同。我刚刚使用下面的链接下载了最新版本。 java.net/projects/javamail/pages/Home
    • 您使用的是“imap”协议还是“imaps”协议。如果是后者,则属性为“mail.imaps.appendbuffersize”。如果还是不行,打开 JavaMail Session 调试并发布调试输出。
    • 嗯..我正在使用我认为是 IMAPS 的 gmail 服务器。
    • 只要确保属性设置与您使用的协议一致即可。
    • 您好,我使用了props.put("mail.imaps.appendbuffersize", 8192);,但结果相同。我已下载最新版本的 java 邮件。
    猜你喜欢
    • 2012-12-15
    • 1970-01-01
    • 1970-01-01
    • 2011-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-26
    相关资源
    最近更新 更多