问题描述
我知道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
}
,可以更好地优化代码以重命名多封电子邮件。