Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过IMAP java mail更改电子邮件主题的变通方法_Java_Kotlin_Jakarta Mail_Imap_Pop3 - Fatal编程技术网

通过IMAP java mail更改电子邮件主题的变通方法

通过IMAP java mail更改电子邮件主题的变通方法,java,kotlin,jakarta-mail,imap,pop3,Java,Kotlin,Jakarta Mail,Imap,Pop3,我知道IMAP和POP3的局限性在于它们无法更改收到的电子邮件的主题(例如,您可以在Exchange ActiveSync中执行此操作) 我读过多个类似的案例,其中人们提到了一种解决方法,即在代码中创建电子邮件副本,对其进行处理,然后将其存储在文件夹中并删除原始邮件,例如: 在我的案例中,使用链接中示例中的方法不起作用,电子邮件主题保持不变 如何使用IMAP/POP3通过java mail更改电子邮件主题?经过多次尝试和错误后,我意识到,通过调试电子邮件标题,即使主题行设置正确,也不是outl

我知道IMAP和POP3的局限性在于它们无法更改收到的电子邮件的主题(例如,您可以在Exchange ActiveSync中执行此操作)

我读过多个类似的案例,其中人们提到了一种解决方法,即在代码中创建电子邮件副本,对其进行处理,然后将其存储在文件夹中并删除原始邮件,例如:

在我的案例中,使用链接中示例中的方法不起作用,电子邮件主题保持不变


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

经过多次尝试和错误后,我意识到,通过调试电子邮件标题,即使主题行设置正确,也不是outlook电子邮件客户端中显示的主题,我还需要设置标题
线程主题
。此外,为了使消息具有与以前相同的读取状态,我还需要复制标志

以下是用于重命名单个电子邮件的完整kotlin功能:

fun重命名消息(文件夹:文件夹,消息:消息,主题:字符串){
试一试{
val renamedMessage=MimeMessage(消息为MimeMessage)
重命名的Message.setSubject(主题)
renamedMessage.setHeader(“线程主题”,主题)
renamedMessage.setFlags(message.flags?:flags(),true)
重命名消息。保存更改()
文件夹.appendMessages(arrayOf(重命名消息))
}捕获(e:例外){
println(e.message)//logger.error(e.message,e)
}捕获(t:可丢弃){
println(t.message)//logger.error(t.message,t)
}最后{
//删除原始邮件
message.setFlag(Flags.Flag.DELETED,true)
文件夹。删除()
}
}
下面是如何使用该函数的示例:

//用于POP3
//字符串协议=“pop3”;
//字符串host=“outlook.office365.com”;
//字符串端口=“995”;
//用于IMAP
val protocol=“imap”
val host=“outlook.office365.com”
val port=“993”
//证书
val用户名=”example@outlook.com"
val password=“examplePassword”
val属性:属性=getServerProperties(协议、主机、端口)
val session=session.getDefaultInstance(属性)
试一试{
//连接到消息存储
val store=session.getStore(协议)
store.connect(用户名、密码)
//打开收件箱文件夹
val folderInbox=store.getFolder(“收件箱”)
folderInbox.open(文件夹读写)
//从服务器获取新邮件
val messages=folderInbox.messages
//处理和标记电子邮件
用于(消息中的消息){
//您在此处处理每封电子邮件的代码
重命名消息(folderInbox,消息,“[PROCESSED]${message.subject}”)
}
//断开
folderInbox.close(假)
store.close()
}捕获(e:NoSuchProviderException){
println(“没有协议提供程序:$protocol”)//logger.error(e.message,e)
}捕获(e:MessaginException){
println(“无法连接到消息存储”)//logger.error(e.message,e)
}
fun getServerProperties(协议:String、主机:String、端口:String):属性{
val properties=properties()
//服务器设置
properties.put(String.format(“mail.%s.host”、协议)、主机)
properties.put(String.format(“邮件。%s.port”、协议)、端口)
//SSL设置
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”,协议),端口)
返回属性
}
通过只调用一次
folder.expunge()
,可以更好地优化代码以重命名多封电子邮件