微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

通过IMAP Java邮件更改电子邮件主题的解决方法

如何解决通过IMAP Java邮件更改电子邮件主题的解决方法

我知道IMAP和POP3受限制是因为它们无法更改已接收电子邮件主题(例如,可以在Exchange ActiveSync中做到这一点)

我已经阅读了多个类似的案例,其中人们提到了一种变通方法,即在代码中创建电子邮件的副本,对其进行处理,然后将其存储在文件夹中并删除原始副本,例如在这里https://community.oracle.com/thread/1589468

在我的情况下,使用链接中示例中的方法无效,电子邮件主题保持不变。

如何使用IMAP / POP3通过Java邮件更改电子邮件主题

解决方法

经过反复试验,我通过调试电子邮件的标题意识到,即使主题行设置正确,Outlook电子邮件客户端也不显示该主题行,因此我需要设置标题{ {1}}。另外,为了使消息具有与以前相同的读取状态,我还需要复制标志。

这是重命名单个电子邮件的完整的kotlin功能:

Thread-Topic

以下是该函数的使用示例:

fun renameMessage(folder: Folder,message: Message,subject: String) {
   try {
      val renamedMessage = MimeMessage(message as MimeMessage)

      renamedMessage.setSubject(subject)
      renamedMessage.setHeader("Thread-Topic",subject)
      renamedMessage.setFlags(message.flags ?: Flags(),true)

      renamedMessage.saveChanges()
      folder.appendMessages(arrayOf(renamedMessage))
   } catch (e: Exception) {
      println(e.message) //logger.error(e.message,e)
   } catch (t: Throwable) {
      println(t.message) //logger.error(t.message,t)
   } finally {
      //deleting original message
      message.setFlag(Flags.Flag.DELETED,true)
      folder.expunge()
   }
}
// for POP3
//String protocol = "pop3";
//String host = "outlook.office365.com";
//String port = "995";

// for IMAP
val protocol = "imap"
val host = "outlook.office365.com"
val port = "993"

//credentials
val userName = "example@outlook.com"
val password = "examplePassword"


val properties: Properties = getServerProperties(protocol,host,port)
val session = Session.getDefaultInstance(properties)

try {
   // connects to the message store
   val store = session.getStore(protocol)
   store.connect(userName,password)

   // opens the inbox folder
   val folderInbox = store.getFolder("INBOX")
   folderInbox.open(Folder.READ_WRITE)

   // fetches new messages from server
   val messages = folderInbox.messages

   // process and tag email 
   for (message in messages){
      //Your code to process each email here
      renameMessage(folderInbox,message,"[PROCESSED] ${message.subject}")
   }

   // disconnect
   folderInbox.close(false)
   store.close()

} catch (e: NoSuchProviderException) {
   println("No provider for protocol: $protocol") //logger.error(e.message,e)
} catch (e: MessagingException) {
   println("Could not connect to the message store") //logger.error(e.message,e)
}

通过仅调用一次fun getServerProperties(protocol: String,host: String,port: String): Properties { val properties = Properties() // server setting properties.put(String.format("mail.%s.host",protocol),host) properties.put(String.format("mail.%s.port",port) // SSL setting properties.setProperty(String.format("mail.%s.socketFactory.class","javax.net.ssl.SSLSocketFactory") properties.setProperty(String.format("mail.%s.socketFactory.fallback","false") properties.setProperty(String.format("mail.%s.socketFactory.port",port) return properties } ,可以更好地优化代码以重命名多封电子邮件。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。