Modules/Messaging/Mail/MailFetcher.vb
2023-09-06 10:24:46 +02:00

183 lines
6.4 KiB
VB.net

Imports DigitalData.Modules.Base
Imports DigitalData.Modules.Logging
Imports Limilabs.Client.IMAP
Imports Limilabs.Client
Imports Limilabs.Mail
Namespace Mail
Public Class MailFetcher
Inherits BaseClass
Private ReadOnly MailSession As MailSession
Private ReadOnly MailBuilder As New MailBuilder
Public ReadOnly Property Connected2Server As Boolean
Get
Return MailSession.Session.Connected
End Get
End Property
Public ReadOnly Property Client As Imap
Get
Return MailSession?.Client
End Get
End Property
Public Sub New(pLogConfig As LogConfig)
MyBase.New(pLogConfig)
MailSession = New MailSession(pLogConfig, New Imap)
Log.Enabled = pLogConfig.Debug
End Sub
Public Function Connect(pServer As String, pPort As Integer, pUser As String, pPassword As String, pAuthType As String) As MailSession.SessionInfo
Return MailSession.ConnectToServerWithBasicAuth(pServer, pPort, pUser, pPassword, pAuthType, New MailSession.MailSessionOptions)
End Function
Public Function ConnectToO365(pUser As String, pClientId As String, pTenantId As String, pClientSecret As String)
Dim oOptions = New MailSession.MailSessionOptions With {.EnableTls1_2 = True}
Return MailSession.ConnectToServerWithO365OAuth(pUser, pClientId, pTenantId, pClientSecret, oOptions)
End Function
Public Function Connect(pServer As String, pPort As Integer, pUser As String, pPassword As String, pAuthType As String, pOptions As MailSession.MailSessionOptions) As MailSession.SessionInfo
Return MailSession.ConnectToServerWithBasicAuth(pServer, pPort, pUser, pPassword, pAuthType, pOptions)
End Function
Public Function Disconnect() As Boolean
Return MailSession.DisconnectFromServer()
End Function
Public Async Function FetchAllMails() As Task(Of List(Of IMail))
Return Await FetchMailsAsync(Flag.All)
End Function
Public Async Function FetchUnreadMails() As Task(Of List(Of IMail))
Return Await FetchMailsAsync(Flag.Unseen)
End Function
Public Function ListAllMails() As List(Of Long)
Return ListMails(Flag.All)
End Function
Public Function ListUnseenMails() As List(Of Long)
Return ListMails(Flag.Unseen)
End Function
Public Async Function FetchMailsAsync(pMailFlag As Flag) As Task(Of List(Of IMail))
Dim oMailIds = ListMails(pMailFlag)
Dim oMails As New List(Of IMail)
For Each oId In oMailIds
Dim oMail As IMail = Await FetchMailAsync(oId)
oMails.Add(oMail)
Next
Return oMails
End Function
Public Function ListMails(pMailFlag As Flag) As List(Of Long)
Try
If MailSession.Session.Connected Then
Dim oClient As Imap = MailSession.Client
Dim oStatus = oClient.SelectInbox()
Dim oMailIds = oClient.Search(pMailFlag)
Logger.Debug("Fetched [{0}] mail objects.", oMailIds.Count)
Return oMailIds
Else
Logger.Error("No connection to Server. Exiting.")
Return Nothing
End If
Catch ex As Exception
Logger.Error(ex)
Return Nothing
End Try
End Function
Public Async Function ListMailsAsync(pMailFlag As Flag) As Task(Of List(Of Long))
Try
If MailSession.Session.Connected Then
Dim oClient As Imap = MailSession.Client
Dim oStatus = Await oClient.SelectInboxAsync()
Dim oMailIds = Await oClient.SearchAsync(pMailFlag)
Logger.Debug("Fetched [{0}] mail objects.", oMailIds.Count)
Return oMailIds
Else
Logger.Error("No connection to Server. Exiting.")
Return Nothing
End If
Catch ex As Exception
Logger.Error(ex)
Return Nothing
End Try
End Function
Public Function FetchMail(pMailId As Long) As IMail
Try
If MailSession.Session.Connected Then
Dim oClient As Imap = MailSession.Client
Logger.Debug("Fetching mail with Id [{0}]", pMailId)
Dim oBuffer As Byte() = oClient.GetMessageByUID(pMailId)
Dim oMail As IMail = MailBuilder.CreateFromEml(oBuffer)
Return oMail
Else
Logger.Error("No connection to Server. Exiting.")
Return Nothing
End If
Catch ex As Exception
Logger.Error(ex)
Return Nothing
End Try
End Function
Public Async Function FetchMailAsync(pMailId As Long) As Task(Of IMail)
Try
If MailSession.Session.Connected Then
Dim oClient As Imap = MailSession.Client
Logger.Debug("Fetching mail with Id [{0}]", pMailId)
Dim oBuffer As Byte() = Await oClient.GetMessageByUIDAsync(pMailId)
Dim oMail As IMail = MailBuilder.CreateFromEml(oBuffer)
Return oMail
Else
Logger.Error("No connection to Server. Exiting.")
Return Nothing
End If
Catch ex As Exception
Logger.Error(ex)
Return Nothing
End Try
End Function
Public Function DeleteMail(pMailId As Long) As Boolean
Try
If MailSession.Session.Connected Then
Dim oClient As Imap = MailSession.Client
Logger.Debug("Fetching mail with Id [{0}]", pMailId)
oClient.DeleteMessageByUID(pMailId)
Return True
Else
Logger.Error("No connection to Server. Exiting.")
Return False
End If
Catch ex As Exception
Logger.Error(ex)
Return False
End Try
End Function
End Class
End Namespace