我试图解决这个问题这么长时间。第一次,我得到了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)
}
}
这是我的项目
让我们从简化代码开始。替换这些行:
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()的程序输出。