Extracted connect()

This commit is contained in:
dankito 2024-11-21 15:53:30 +01:00
parent a1fe8befce
commit a6ac33d8ed
1 changed files with 26 additions and 19 deletions

View File

@ -4,6 +4,7 @@ import jakarta.mail.BodyPart
import jakarta.mail.Folder import jakarta.mail.Folder
import jakarta.mail.Part import jakarta.mail.Part
import jakarta.mail.Session import jakarta.mail.Session
import jakarta.mail.Store
import jakarta.mail.internet.MimeMultipart import jakarta.mail.internet.MimeMultipart
import net.codinux.invoicing.model.Invoice import net.codinux.invoicing.model.Invoice
import net.codinux.invoicing.reader.EInvoiceReader import net.codinux.invoicing.reader.EInvoiceReader
@ -21,17 +22,12 @@ class MailReader(
fun listAllMessagesWithEInvoice(account: MailAccount): List<MailWithInvoice> { fun listAllMessagesWithEInvoice(account: MailAccount): List<MailWithInvoice> {
val properties = mapAccountToJavaMailProperties(account)
try { try {
val session = Session.getInstance(properties) connect(account) { store ->
session.getStore("imap").use { store ->
store.connect(account.serverAddress, account.username, account.password)
val inbox = store.getFolder("INBOX") val inbox = store.getFolder("INBOX")
inbox.open(Folder.READ_ONLY) inbox.open(Folder.READ_ONLY)
return listAllMessagesWithEInvoiceInFolder(inbox).also { listAllMessagesWithEInvoiceInFolder(inbox).also {
inbox.close(false) inbox.close(false)
} }
} }
@ -42,18 +38,6 @@ class MailReader(
return emptyList() return emptyList()
} }
private fun mapAccountToJavaMailProperties(account: MailAccount) = Properties().apply {
put("mail.store.protocol", "imap")
put("mail.imap.host", account.serverAddress)
put("mail.imap.port", account.port?.toString() ?: "993") // Default IMAP over SSL
put("mail.imap.ssl.enable", "true")
put("mail.imap.connectiontimeout", "5000")
put("mail.imap.timeout", "5000")
}
private fun listAllMessagesWithEInvoiceInFolder(folder: Folder): List<MailWithInvoice> = folder.messages.mapNotNull { message -> private fun listAllMessagesWithEInvoiceInFolder(folder: Folder): List<MailWithInvoice> = folder.messages.mapNotNull { message ->
try { try {
if (message.isMimeType("multipart/*")) { if (message.isMimeType("multipart/*")) {
@ -121,4 +105,27 @@ class MailReader(
private fun map(date: Date): LocalDate = private fun map(date: Date): LocalDate =
date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate() date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate()
private fun <T> connect(account: MailAccount, connected: (Store) -> T?): T? {
val properties = mapAccountToJavaMailProperties(account)
val session = Session.getInstance(properties)
session.getStore("imap").use { store ->
store.connect(account.serverAddress, account.username, account.password)
return connected(store)
}
}
private fun mapAccountToJavaMailProperties(account: MailAccount) = Properties().apply {
put("mail.store.protocol", "imap")
put("mail.imap.host", account.serverAddress)
put("mail.imap.port", account.port?.toString() ?: "993") // Default IMAP over SSL
put("mail.imap.ssl.enable", "true")
put("mail.imap.connectiontimeout", "5000")
put("mail.imap.timeout", "5000")
}
} }