forked from JetBrains/email-parser
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathparse.kt
90 lines (82 loc) · 2.96 KB
/
parse.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
/*
* Copyright 2016-2017 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package quoteParser
import java.io.File
import java.io.FileInputStream
import java.io.InputStream
import java.util.Properties
import jakarta.mail.Session
import jakarta.mail.internet.MimeMessage
import jakarta.mail.internet.MimeMultipart
import jakarta.mail.internet.MimePart
import jakarta.mail.internet.ParseException
/**
* Check weather given message contains *In-Reply-To* header or
* *References* header.
* @param msg
* @return true if message contains at least one of the headers specified above
* @see getMimeMessage
*/
fun containInReplyToHeader(msg: MimeMessage) =
msg.getHeader("In-Reply-To") != null || msg.getHeader("References") != null
/**
* Construct *MimeMessage* from File object
* @param emlFile
* @return MimeMessage object
*/
fun getMimeMessage(emlFile: File): MimeMessage {
val source: InputStream = FileInputStream(emlFile)
val props: Properties = System.getProperties()
val session: Session = Session.getDefaultInstance(props)
val msg: MimeMessage = MimeMessage(session, source)
return msg
}
/**
* Construct MimeMessage and then get the content of the text/plain part
* of this message. So if you already have MimeMessage object it is better
* to call **getEmailText(MimePart)** function in order to avoid additional
* costs.
* @param emlFile
* @return plain text content of the message as a string
* @throws ParseException if message does not contain text/plain part
*/
fun getEmailText(emlFile: File): String {
val msg: MimeMessage = getMimeMessage(emlFile)
return getEmailText(msg)
}
/**
* Get the content of the text/plain part of the message.
* @param part MimePart to get plain text from.
* @return plain text content of the message as a string
* @exception ParseException if message does not contain text/plain part
*/
fun getEmailText(part: MimePart): String {
val text = searchForContent(part)
return text ?: throw ParseException("Could not find text/plain part.")
}
private fun searchForContent(part: MimePart): String? {
val content = part.content ?: throw ParseException("Could not find content of this email.")
if (part.isMimeType("text/plain")) {
return content as String
}
if (content is MimeMultipart) {
for (i in 0..content.count - 1) {
val c = searchForContent(content.getBodyPart(i) as MimePart)
return c ?: continue
}
}
return null
}