Messaging: Add Email2 Class using Limilabs Mail.dll
This commit is contained in:
241
Modules.Messaging/Email2.vb
Normal file
241
Modules.Messaging/Email2.vb
Normal file
@@ -0,0 +1,241 @@
|
||||
Imports DigitalData.Modules.Logging
|
||||
Imports DigitalData.Modules.Filesystem
|
||||
Imports Limilabs.Mail
|
||||
Imports Limilabs.Client.IMAP
|
||||
Imports Limilabs.Mail.MIME
|
||||
|
||||
Public Class Email2
|
||||
Private ReadOnly Logger As Logger
|
||||
Private ReadOnly LogConfig As LogConfig
|
||||
Private ReadOnly FileEx As Filesystem.File
|
||||
|
||||
Public Sub New(pLogConfig As LogConfig)
|
||||
LogConfig = pLogConfig
|
||||
Logger = pLogConfig.GetLogger()
|
||||
FileEx = New Filesystem.File(pLogConfig)
|
||||
End Sub
|
||||
|
||||
Public Enum EmailSecurity
|
||||
SSL
|
||||
STARTTLS
|
||||
End Enum
|
||||
|
||||
Private Function Get_PortForSecurityOption(pSecurity As EmailSecurity) As Integer
|
||||
Select Case pSecurity
|
||||
Case EmailSecurity.SSL
|
||||
Return 993
|
||||
|
||||
Case EmailSecurity.STARTTLS
|
||||
Return 143
|
||||
|
||||
Case Else
|
||||
Return 0
|
||||
End Select
|
||||
End Function
|
||||
|
||||
Public Function Test_Login(pServer As String, pUsername As String, pPassword As String, pSecurity As EmailSecurity, Optional pFolder As String = "Inbox", Optional pPort As Integer = 0) As Boolean
|
||||
Logger.Debug("Testing Login to Server [{0}:{1}] with user [{2}]", pServer, pPort, pUsername)
|
||||
|
||||
Try
|
||||
Using oClient As New Imap()
|
||||
Logger.Debug("Connecting to IMAP server [{0}]", pServer)
|
||||
|
||||
Dim oPort As Integer = pPort
|
||||
If oPort = 0 Then
|
||||
oPort = Get_PortForSecurityOption(pSecurity)
|
||||
End If
|
||||
|
||||
If pSecurity = EmailSecurity.SSL Then
|
||||
oClient.ConnectSSL(pServer, oPort)
|
||||
ElseIf pSecurity = EmailSecurity.STARTTLS Then
|
||||
oClient.Connect(pServer, oPort)
|
||||
oClient.StartTLS()
|
||||
Else
|
||||
Throw New ArgumentOutOfRangeException("Security")
|
||||
End If
|
||||
|
||||
Logger.Debug("Logging in with user [{0}]", pUsername)
|
||||
oClient.UseBestLogin(pUsername, pPassword)
|
||||
|
||||
Logger.Debug("Fetching Inbox")
|
||||
Dim oStatus As FolderStatus = oClient.SelectInbox()
|
||||
|
||||
Logger.Debug("Test finished!")
|
||||
oClient.Close()
|
||||
End Using
|
||||
|
||||
Return True
|
||||
Catch ex As Exception
|
||||
Logger.Warn("Login failed for server [{0}:{1}] with user [{2}]!", pServer, pPort, pUsername)
|
||||
Logger.Error(ex)
|
||||
|
||||
Return False
|
||||
End Try
|
||||
End Function
|
||||
|
||||
Public Function Get_Messages(pServer As String, pUsername As String, pPassword As String, pSecurity As EmailSecurity, Optional pFolder As String = "Inbox", Optional pPort As Integer = 0) As List(Of IMail)
|
||||
Logger.Debug("Fetching Messages from Server [{0}:{1}] with user [{2}]", pServer, pPort, pUsername)
|
||||
|
||||
Dim oMails As New List(Of IMail)
|
||||
|
||||
Try
|
||||
Using oClient As New Imap()
|
||||
Logger.Debug("Connecting to IMAP server [{0}]", pServer)
|
||||
|
||||
Dim oPort As Integer = pPort
|
||||
If oPort = 0 Then
|
||||
oPort = Get_PortForSecurityOption(pSecurity)
|
||||
|
||||
End If
|
||||
|
||||
If pSecurity = EmailSecurity.SSL Then
|
||||
oClient.ConnectSSL(pServer, oPort)
|
||||
|
||||
ElseIf pSecurity = EmailSecurity.STARTTLS Then
|
||||
oClient.Connect(pServer, oPort)
|
||||
oClient.StartTLS()
|
||||
|
||||
Else
|
||||
Throw New ArgumentOutOfRangeException("Security")
|
||||
|
||||
End If
|
||||
|
||||
Logger.Debug("Logging in with user [{0}]", pUsername)
|
||||
oClient.UseBestLogin(pUsername, pPassword)
|
||||
|
||||
Logger.Debug("Fetching Folder [{0}]", pFolder)
|
||||
Dim oStatus As FolderStatus = oClient.Select(pFolder)
|
||||
|
||||
Logger.Debug("Fetching Unseen UUIDs")
|
||||
Dim oUUIDs As List(Of Long) = oClient.Search(Flag.Unseen)
|
||||
Dim oMailBuilder As New MailBuilder()
|
||||
|
||||
Logger.Debug("Fetching Unseen Mails")
|
||||
For Each oUUID As Long In oUUIDs
|
||||
Dim oEmlFile As Byte() = oClient.GetMessageByUID(oUUID)
|
||||
Dim oEmail As IMail = oMailBuilder.CreateFromEml(oEmlFile)
|
||||
oMails.Add(oEmail)
|
||||
|
||||
Next
|
||||
|
||||
Logger.Debug("Emails fetched!")
|
||||
oClient.Close()
|
||||
End Using
|
||||
|
||||
Return oMails
|
||||
|
||||
Catch ex As Exception
|
||||
Logger.Warn("Login failed for server [{0}:{1}] with user [{2}]!", pServer, pPort, pUsername)
|
||||
Logger.Error(ex)
|
||||
Return New List(Of IMail)
|
||||
|
||||
End Try
|
||||
End Function
|
||||
|
||||
Public Function Get_Message(pServer As String, pUsername As String, pPassword As String, pSecurity As EmailSecurity, pMessageId As String, Optional pFolder As String = "Inbox", Optional pPort As Integer = 0) As IMail
|
||||
Logger.Debug("Fetching Message [{0}] from Server [{1}:{2}] with user [{3}]", pMessageId, pServer, pPort, pUsername)
|
||||
|
||||
Dim oMail As IMail = Nothing
|
||||
|
||||
Try
|
||||
Using oClient As New Imap()
|
||||
Logger.Debug("Connecting to IMAP server [{0}]", pServer)
|
||||
|
||||
Dim oPort As Integer = pPort
|
||||
If oPort = 0 Then
|
||||
oPort = Get_PortForSecurityOption(pSecurity)
|
||||
|
||||
End If
|
||||
|
||||
If pSecurity = EmailSecurity.SSL Then
|
||||
oClient.ConnectSSL(pServer, oPort)
|
||||
|
||||
ElseIf pSecurity = EmailSecurity.STARTTLS Then
|
||||
oClient.Connect(pServer, oPort)
|
||||
oClient.StartTLS()
|
||||
|
||||
Else
|
||||
Throw New ArgumentOutOfRangeException("Security")
|
||||
|
||||
End If
|
||||
|
||||
Logger.Debug("Logging in with user [{0}]", pUsername)
|
||||
oClient.UseBestLogin(pUsername, pPassword)
|
||||
|
||||
Logger.Debug("Fetching Inbox")
|
||||
Dim oStatus As FolderStatus = oClient.Select(pFolder)
|
||||
|
||||
Logger.Debug("Fetching UUIDs")
|
||||
Dim oUUIDs As List(Of Long) = oClient.Search(Flag.All)
|
||||
Dim oMailBuilder As New MailBuilder()
|
||||
|
||||
Dim oInfos As List(Of MessageInfo) = oClient.GetMessageInfoByUID(oUUIDs)
|
||||
|
||||
Logger.Debug("Fetching Unseen Mails")
|
||||
For Each oInfo As MessageInfo In oInfos
|
||||
If oInfo.Envelope.MessageID = pMessageId Then
|
||||
Dim oMailData As Byte() = oClient.GetMessageByUID(oInfo.UID)
|
||||
oMail = oMailBuilder.CreateFromEml(oMailData)
|
||||
|
||||
Exit For
|
||||
End If
|
||||
Next
|
||||
|
||||
Logger.Debug("Emails fetched!")
|
||||
oClient.Close()
|
||||
End Using
|
||||
|
||||
Return oMail
|
||||
|
||||
Catch ex As Exception
|
||||
Logger.Warn("Login failed for server [{0}:{1}] with user [{2}]!", pServer, pPort, pUsername)
|
||||
Logger.Error(ex)
|
||||
Return New List(Of IMail)
|
||||
|
||||
End Try
|
||||
End Function
|
||||
|
||||
Public Function Remove_AttachmentsFromEmail(pFileName As String) As String
|
||||
Try
|
||||
Dim oTempFileName As String = IO.Path.GetTempFileName()
|
||||
Dim oMailBuilder As New MailBuilder()
|
||||
Dim oMail = oMailBuilder.CreateFromEmlFile(pFileName)
|
||||
|
||||
oMail.RemoveAttachments()
|
||||
oMail.Save(oTempFileName)
|
||||
|
||||
Return oTempFileName
|
||||
Catch ex As Exception
|
||||
Logger.Error(ex)
|
||||
|
||||
Return Nothing
|
||||
End Try
|
||||
End Function
|
||||
|
||||
Public Function Save_AttachmentsToDisk(pFileName As String) As List(Of String)
|
||||
Try
|
||||
Dim oAttachmentPaths As New List(Of String)
|
||||
Dim oMailBuilder As New MailBuilder()
|
||||
Dim oMail = oMailBuilder.CreateFromEmlFile(pFileName)
|
||||
Dim oTempPath As String = IO.Path.GetTempPath()
|
||||
|
||||
If oMail.Attachments.Count = 0 Then
|
||||
Return New List(Of String)
|
||||
End If
|
||||
|
||||
For Each oAttachment As MimeData In oMail.Attachments
|
||||
Dim oPath As String = IO.Path.Combine(oTempPath, oAttachment.SafeFileName)
|
||||
Dim oVersionedPath As String = FileEx.GetVersionedFilename(oPath)
|
||||
|
||||
oAttachment.Save(oVersionedPath)
|
||||
oAttachmentPaths.Add(oVersionedPath)
|
||||
Next
|
||||
|
||||
Return oAttachmentPaths
|
||||
Catch ex As Exception
|
||||
Logger.Error(ex)
|
||||
|
||||
Return New List(Of String)
|
||||
End Try
|
||||
End Function
|
||||
End Class
|
||||
@@ -1,3 +0,0 @@
|
||||
Public Class Mail
|
||||
|
||||
End Class
|
||||
@@ -84,7 +84,7 @@
|
||||
<ItemGroup>
|
||||
<Compile Include="Email.vb" />
|
||||
<Compile Include="EventBus.vb" />
|
||||
<Compile Include="Mail.vb" />
|
||||
<Compile Include="Email2.vb" />
|
||||
<Compile Include="My Project\AssemblyInfo.vb" />
|
||||
<Compile Include="My Project\Application.Designer.vb">
|
||||
<AutoGen>True</AutoGen>
|
||||
@@ -123,6 +123,10 @@
|
||||
<None Include="packages.config" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\Modules.Filesystem\Filesystem.vbproj">
|
||||
<Project>{991d0231-4623-496d-8bd0-9ca906029cbc}</Project>
|
||||
<Name>Filesystem</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\Modules.Logging\Logging.vbproj">
|
||||
<Project>{903b2d7d-3b80-4be9-8713-7447b704e1b0}</Project>
|
||||
<Name>Logging</Name>
|
||||
|
||||
Reference in New Issue
Block a user