我需要更快地执行从javaMail.Message类型获取内容和管理标志的过程

问题描述 投票:0回答:1

我试图解决这个问题这么长时间。第一次,我得到了javaMail.Message。我在RecyclerView.Adapter-> OnBindViewHolder中提取邮件内容和其他内容。但是,当我提取内容并管理flag时,需要花费很长时间。这是主页

val props = Properties()
            props.setProperty("mail.debug", "true")
            props.setProperty("mail.imap.port", "143")
            props.setProperty("mail.imap.ssl.enable", "true")
            props.setProperty("mail.imap.socketFactory.port", "993")
            val session = Session.getDefaultInstance(props, authenticator(mailBox.user, mailBox.pass))
            val store = session.getStore("imaps")
            store.connect(mailBox.mailHost,mailBox.user,mailBox.pass)
            val fetchProfile = FetchProfile()
            fetchProfile.add(FetchProfile.Item.CONTENT_INFO)
            fetchProfile.add(FetchProfile.Item.ENVELOPE)
            val emailFolder = store.getFolder("Inbox")
            emailFolder.open(Folder.READ_WRITE)
            val messages: Array<Message> = emailFolder.messages
            emailFolder.fetch(messages,fetchProfile)
            activityUiThread {
                val adapter = testAdapter(this@MailBox,messages,this@MailBox)
                allMail_recycler.adapter = adapter
                dialog.dismiss()
            }

这是适配器

override fun onBindViewHolder(holder : ViewHolder, position: Int) = runBlocking{
    val message = receiveMessage[position]
        /** visibility **/
       // holder.itemView.d3p.visibility = INVISIBLE
        holder.itemView.imV_attach.visibility = INVISIBLE
        /** unChangeable **/
            val bworker = GlobalScope.launch {
            val from = message.from[0].toString().split("<")[0]
            val sentDate= message.receivedDate
            val subject = message.subject
            val content = message.content.toString()
            val recepient = message.allRecipients[0].toString()
            val seen = message.flags.toString()
            val attachent = message.isMimeType("multipart/mixed")
            if (attachent){
                holder.itemView.imV_attach.visibility = VISIBLE
            }
             holder.itemView.mailSender.text = from
             holder.itemView.dateTimeTxt.text = SimpleDateFormat("MMM dd").format(sentDate)
             holder.itemView.subjectTxt.text = subject
             holder.itemView.bodyTxt.text = content
              //  mailBox.data.add(messageModel(from,recepient,subject,content,date,attachent,seen))
            }
            bworker.join()

        holder.itemView.setOnClickListener {
        notifyItemChanged(position)
        eventChange.change(position)
    }
}

这是我的项目

check this

android kotlin javamail
1个回答
0
投票

让我们从简化代码开始。替换这些行:

        props.setProperty("mail.debug", "true")
        props.setProperty("mail.imap.port", "143")
        props.setProperty("mail.imap.ssl.enable", "true")
        props.setProperty("mail.imap.socketFactory.port", "993")
        val session = Session.getDefaultInstance(props, authenticator(mailBox.user, mailBox.pass))

带有这些:

        props.setProperty("mail.debug", "true")
        props.setProperty("mail.imap.ssl.enable", "true")
        val session = Session.getInstance(props)

此:

        val from = message.from[0].toString().split("<")[0]

可能想成为这样的人:

        val from = (InternetAddress)(message.from[0]).getAddress()

(不确定是否需要强制转换。)

我不知道您为什么使用接收到的数据作为发送日期,但这是错误的。您为什么不只使用发送日期?

使用message.content.toString仅适用于简单的纯文本消息。当然,任何带有附件的邮件都不会满足您的需求。请参阅常见问题解答find the main message body

这还将说明为什么您不想每次都提取全部消息内容;这是非常低效的。您可能还需要更改程序,以便仅当用户单击附件时才下载所有附件。对于调试,请尝试注释出对message.content的访问,并用空字符串替换它,然后查看性能是否接近您的期望。

如果仍然无法获得理想的性能,则应查看可能使用的其他FetchProfile项目。您还应该发布JavaMail调试输出,最好在每行上带有时间戳,或者在程序中的每个关键语句周围显示System.currentTimeMillis()的程序输出。

© www.soinside.com 2019 - 2024. All rights reserved.