560 lines
26 KiB
VB.net

Imports Independentsoft.Email
Imports Independentsoft.Email.Pop3
Imports Independentsoft.Email.Mime
Imports Independentsoft.Email.Imap
Imports System.Net.Mail
Imports System.Net
Imports System.Reflection
Imports System.IO
Public Class Email
Private ReadOnly _logger As Logging.Logger
Private ReadOnly _logConfig As Logging.LogConfig
Public Err_Message As String
Public _msg_Send As Boolean
Public Sub New(LogConfig As Logging.LogConfig)
_logger = LogConfig.GetLogger()
_logConfig = LogConfig
End Sub
'''' <summary>
'''' Tests connection to a given IMAP Server by connecting and doing a simple message query.
'''' </summary>
'''' <param name="Server">IP-Address or Domainname of Server</param>
'''' <param name="Port">IMAP-Port</param>
'''' <param name="Username">IMAP-Username</param>
'''' <param name="Password">IMAP-Password</param>
'''' <param name="Folder">The folder to fetch messages from. Defaults to `Inbox`</param>
'''' <returns>True if connection and query were successful. False otherwise.</returns>
'Public Function TestIMAPLogin(Server As String, Port As Integer, Username As String, Password As String, Optional Folder As String = "Inbox") As Boolean
' _logger.Debug("Testing Login to Server {0}:{1} with user {2}", Server, Port, Username)
' Try
' _logger.Debug("Connecting...")
' Using oClient As New S22.Imap.ImapClient(Server, Port, Username, Password, S22.Imap.AuthMethod.Login, True)
' If Not oClient.Authed Then
' _logger.Warn("Connected to server but authentication failed.")
' Return False
' End If
' _logger.Debug("Connection successful")
' _logger.Debug("Fetching MessageIds..")
' Dim oMessageIds As IEnumerable(Of UInteger) = oClient.Search(S22.Imap.SearchCondition.Unseen, Folder)
' _logger.Debug("Found {0} messages", oMessageIds.Count)
' _logger.Debug("Fetching messages...")
' Dim oMessages As IEnumerable(Of MailMessage) = oClient.GetMessages(oMessageIds, False, Folder)
' _logger.Debug("Messages fetched")
' oClient.Dispose()
' Return True
' End Using
' Catch ex As Exception
' _logger.Error(ex)
' Return False
' End Try
'End Function
'''' <summary>
'''' Connects to an IMAP Server with the given credentials and
'''' fetches emails from the given folder.
'''' Results can be filtered with `SearchCondition`
'''' </summary>
'''' <param name="Server">IP-Address or Domainname of Server</param>
'''' <param name="Port">IMAP-Port</param>
'''' <param name="Username">IMAP-Username</param>
'''' <param name="Password">IMAP-Password</param>
'''' <param name="Folder">The folder to fetch messages from</param>
'''' <param name="SearchCondition">Filter the search command. Defaults to `All`</param>
'''' <returns>A list of Independentsoft.Email.Mime.Message objects</returns>
'Public Function FetchIMAPMessages(Server As String, Port As Integer, Username As String, Password As String, Folder As String) As List(Of Message) ', Optional SearchCondition As S22.Imap.SearchCondition = S22.Imap.SearchCondition.All
' Dim oMessages As New List(Of Message)
' _logger.Debug("Connecting to Server {0}:{1} with user {2}", Server, Port, Username)
' Try
' _logger.Debug("Connecting...")
' Using oClient As New S22.Imap.ImapClient(Server, Port, Username, Password, S22.Imap.AuthMethod.Login, True)
' If Not oClient.Authed Then
' _logger.Warn("Connected to server but authentication failed.")
' Return Nothing
' End If
' _logger.Debug("Connection successful")
' _logger.Debug("Fetching MessageIds..")
' Dim oMessageIds As IEnumerable(Of UInteger) = oClient.Search(S22.Imap.SearchCondition.Unseen, Folder)
' _logger.Debug("Found {0} messages", oMessageIds.Count)
' _logger.Debug("Fetching messages...")
' ' Since this needs to return a list of IndependentSoft Message objects,
' ' we 'convert' the .NET MailMessage objects that are fetched from the server
' ' by writing them temporarily to disk as an eml file and then reading them back into a Message object.
' ' This approach uses an unintended use of internal .NET APIs and may break in the future.
' For Each oMessageId As UInteger In oMessageIds
' Dim oMessage = oClient.GetMessage(oMessageId, False, Folder)
' Dim oTempPath = Path.GetTempFileName()
' Dim oResult = WriteMessageToFile(oMessage, oTempPath)
' Dim oMsg As New Message(oTempPath)
' oMessages.Add(oMsg)
' Try
' File.Delete(oTempPath)
' Catch ex As Exception
' _logger.Error(ex)
' _logger.Warn("Temp file could not be deleted")
' End Try
' Next
' _logger.Debug("{0} Messages fetched", oMessages.Count)
' End Using
' Return oMessages
' Catch ex As Exception
' _logger.Error(ex)
' Return Nothing
' End Try
'End Function
''' <summary>
''' Uses a private API from MailWriter to write a MailMessage to disk.
''' May break in future versions of .NET
''' </summary>
Public Function WriteMessageToFile(Message As MailMessage, Filename As String) As Boolean
Dim oAssembly As Assembly = GetType(System.Net.Mail.SmtpClient).Assembly
Dim oMailWriterType As Type = oAssembly.[GetType]("System.Net.Mail.MailWriter")
Try
Using oStream As New FileStream(Filename, FileMode.Create)
Dim oMailWriterConstructor As ConstructorInfo = oMailWriterType.GetConstructor(
BindingFlags.Instance Or BindingFlags.NonPublic, Nothing, New Type() {GetType(Stream)}, Nothing
)
Dim oMailWriter As Object = oMailWriterConstructor.Invoke(New Object() {oStream})
Dim sendMethod As MethodInfo = GetType(MailMessage).GetMethod("Send", BindingFlags.Instance Or BindingFlags.NonPublic)
sendMethod.Invoke(Message, BindingFlags.Instance Or BindingFlags.NonPublic, Nothing, {oMailWriter, True, True}, Nothing)
End Using
Return True
Catch ex As Exception
Return Nothing
End Try
End Function
'Public Function IMAP_COLLECT(INBOXNAME As String, MYMAIL_SERVER As String, MYMAIL_PORT As Integer, MYMAIL_USER As String, MYMAIL_USER_PW As String)
' Try
' Dim oMAIL_LIST As New ArrayList()
' _logger.Info(String.Format("Working on IMAP_COLLECT..."))
' Dim oClient As New ImapClient(MYMAIL_SERVER, MYMAIL_PORT)
' oClient.Connect()
' oClient.Login(MYMAIL_USER, MYMAIL_USER_PW)
' oClient.SelectFolder("Inbox")
' Dim oEnvelopes As Envelope() = oClient.ListMessages()
' For i As Integer = 0 To oEnvelopes.Length - 1
' If Not IsNothing(oEnvelopes(i).Subject) Then
' 'If envelopes(i).Subject.ToString.ToUpper.Contains("[PROCESSMANAGER]") Or envelopes(i).Subject.ToString.ToUpper.Contains("[ADDI]") Then
' _logger.Info($"Working on email: UniqueID: {oEnvelopes(i).UniqueID} - Subject:{oEnvelopes(i).Subject} - Date {oEnvelopes(i).Date.ToString}")
' Dim message As Mime.Message = oClient.GetMessage(oEnvelopes(i).UniqueID)
' If Not IsNothing(message) Then
' oMAIL_LIST.Add(message)
' End If
' 'End If
' End If
' Next
' oClient.Disconnect()
' _logger.Debug("IMAP_COLLECT finished!")
' Return oMAIL_LIST
' Catch ex As Exception
' _logger.Error(ex, "Unexpected Error in IMAP COLLECT:")
' Return Nothing
' End Try
'End Function
'Public Function TEST_IMAP_COLLECT(INBOXNAME As String, MYMAIL_SERVER As String, MYMAIL_PORT As Integer, MYMAIL_USER As String, MYMAIL_USER_PW As String)
' Try
' _logger.Info(String.Format("Working on TEST_IMAP_COLLECT....."))
' Dim oClient As New ImapClient(MYMAIL_SERVER, MYMAIL_PORT)
' oClient.Connect()
' oClient.Login(MYMAIL_USER, MYMAIL_USER_PW)
' oClient.SelectFolder(INBOXNAME)
' Dim oEnvelopes As Envelope() = oClient.ListMessages()
' For i As Integer = 0 To oEnvelopes.Length - 1
' If Not IsNothing(oEnvelopes(i).Subject) Then
' 'If envelopes(i).Subject.ToString.ToUpper.Contains("[PROCESSMANAGER]") Or envelopes(i).Subject.ToString.ToUpper.Contains("[ADDI]") Then
' MsgBox($"Working on email: UniqueID: {oEnvelopes(i).UniqueID} - Subject:{oEnvelopes(i).Subject} - Date {oEnvelopes(i).Date.ToString}")
' Dim message As Mime.Message = oClient.GetMessage(oEnvelopes(i).UniqueID)
' End If
' Next
' oClient.Disconnect()
' _logger.Info("TEST_IMAP_COLLECT finished!")
' Return True
' Catch ex As Exception
' _logger.Error(ex, "Unexpected Error in TEST_IMAP_COLLECT:")
' Return False
' End Try
'End Function
'Public Function POP3_COLLECT(MYMAIL_SERVER As String, MYMAIL_PORT As Integer, MYMAIL_USER As String, MYMAIL_USER_PW As String)
' Try
' Dim oMAIL_LIST As New ArrayList()
' _logger.Debug(String.Format("Working on POP3_COLLECT....."))
' Dim oClient As New Pop3Client(MYMAIL_SERVER, MYMAIL_PORT)
' oClient.ValidateRemoteCertificate = False
' oClient.Connect()
' _logger.Debug(String.Format("..connected!"))
' oClient.Login(MYMAIL_USER, MYMAIL_USER_PW)
' Dim oMessageInfo As MessageInfo() = oClient.List()
' For i As Integer = 0 To oMessageInfo.Length - 1
' Dim message As Message = oClient.GetMessage(oMessageInfo(i).Index)
' oMAIL_LIST.Add(message)
' Try
' _logger.Debug(String.Format("Message [{0}] added", message.Subject))
' Catch ex As Exception
' End Try
' Next
' oClient.Disconnect()
' _logger.Debug(String.Format(" POP3_COLLECT finished!"))
' Return oMAIL_LIST
' Catch ex As Exception
' _logger.Error(ex)
' Return Nothing
' End Try
'End Function
'Public Function TEST_POP3_COLLECT(MYMAIL_SERVER As String, MYMAIL_PORT As Integer, MYMAIL_USER As String, MYMAIL_USER_PW As String) As Boolean
' Try
' _logger.Debug(String.Format("Working on TEST_POP3_COLLECT..."))
' Dim oClient As New Pop3Client(MYMAIL_SERVER, MYMAIL_PORT)
' oClient.ValidateRemoteCertificate = False
' oClient.Connect()
' _logger.Debug(String.Format("..connected!"))
' oClient.Login(MYMAIL_USER, MYMAIL_USER_PW)
' Dim messageInfo As MessageInfo() = oClient.List()
' For i As Integer = 0 To messageInfo.Length - 1
' Dim message As Message = oClient.GetMessage(messageInfo(i).Index)
' MsgBox(String.Format("Message [{0}] added", message.Subject))
' Next
' oClient.Disconnect()
' MsgBox(String.Format("TEST_POP3_COLLECT finished!"))
' Return True
' Catch ex As Exception
' _logger.Error(ex)
' Return False
' End Try
'End Function
Public Function NewEmail(mailto As String, mailSubject As String, mailBody As String,
mailfrom As String, mailsmtp As String, mailport As Integer, mailUser As String, mailPW As String,
AUTH_TYPE As String, SENDER_INSTANCE As String, Optional attachmentString As String = "", Optional Test As Boolean = False)
Dim myClient As Net.Mail.SmtpClient
Dim myMesssage As New MailMessage
Try
Dim oError As Boolean = False
Dim oReceipiants As String()
If mailto.Contains(";") Then
oReceipiants = mailto.Split(";")
Else
ReDim Preserve oReceipiants(0)
oReceipiants(0) = mailto
End If
For Each oMailReceipiant As String In oReceipiants
_logger.Debug($"oMailReceipiant [{oMailReceipiant}]")
_logger.Debug($"mailsmtp [{mailsmtp}]")
Try
myClient = New Net.Mail.SmtpClient(mailsmtp, mailport)
Catch ex As Exception
_logger.Warn($"Could not create SMTP-Client: [{ex.Message}]")
Return False
End Try
myClient.DeliveryMethod = SmtpDeliveryMethod.Network
myClient.Port = mailport
_logger.Debug($"mailport [{mailport}]")
If AUTH_TYPE = "SSL" Then
_logger.Debug("SSL = true")
myClient.EnableSsl = True
Else
_logger.Debug("SSL = false")
myClient.EnableSsl = False
End If
_logger.Debug($"mailUser [{mailUser}]")
myClient.Credentials = New NetworkCredential(mailUser, mailPW)
myClient.UseDefaultCredentials = False
If Test = True Then
myMesssage.Body = $"This is the body (text will be replaced within profile)! <br> mailsmtp: {mailsmtp} <br> mailport: {mailport} <br> mailUser: {mailUser} <br> mailPW: XXXX <br> AUTH_TYPE: {AUTH_TYPE}"
Else
myMesssage.Body = mailBody
End If
_logger.Debug($"mailBody [{mailBody}]")
'mymesssage.IsBodyHtml = True
Dim htmlView As AlternateView = AlternateView.CreateAlternateViewFromString(myMesssage.Body)
htmlView.ContentType = New System.Net.Mime.ContentType("text/html")
myMesssage.AlternateViews.Add(htmlView)
_logger.Debug($"attachmentString [{attachmentString}]")
If attachmentString <> "" Then
_logger.Info($"Attachment Path is: {attachmentString}")
Dim oAttachment As New System.Net.Mail.Attachment(attachmentString)
'If attment.ToLower.EndsWith("pdf") Then
' oAttachment.ContentType = New Independentsoft.Email.Mime.ContentType("application", "pdf")
'ElseIf attment.ToLower.EndsWith("jpg") Then
' oAttachment.ContentType = New Independentsoft.Email.Mime.ContentType("application", "jpg")
'ElseIf attment.ToLower.EndsWith("docx") Then
' oAttachment.ContentType = New Independentsoft.Email.Mime.ContentType("application", "MS-word")
'End If
myMesssage.Attachments.Add(oAttachment)
Else
_logger.Debug("No Attachment.")
End If
_logger.Debug($"mailfrom [{mailfrom}]")
myMesssage.From = New MailAddress(mailfrom)
_logger.Debug($"mailSubject [{mailSubject}]")
myMesssage.Subject = mailSubject
myMesssage.To.Add(New MailAddress(oMailReceipiant))
_logger.Debug($"Now Sending mail...")
myClient.Send(myMesssage)
_logger.Debug($"Mail has been sent!")
_logger.Info("Message to " & oMailReceipiant & " has been send.")
Next
If oError = False Then
Return True
Else
Return False
End If
Catch ex As Exception
_logger.Error(ex)
Try
_logger.Info("Unexpected error in Sending smtp-Mail: ")
If Not IsNothing(myClient) Then
_logger.Info($"myClient.Host: {myClient.Host.ToString}")
_logger.Info($"myClient.Port: {myClient.Port.ToString}")
_logger.Info($"myClient.EnableSsl: {myClient.EnableSsl.ToString}")
End If
If Not IsNothing(myMesssage) Then
_logger.Info($"myMesssage.Subject: {myMesssage.Subject.ToString}")
_logger.Info($"myMesssage.Body: {myMesssage.Body.ToString}")
_logger.Info($"myMesssage.From: {myMesssage.From.ToString}")
End If
Catch e1x As Exception
End Try
Return False
End Try
End Function
'Public Function New_EmailISoft(ByVal mailSubject As String, ByVal mailBody As String, mailto As String,
' from_mailaddress As String, from_name As String, mailsmtp As String, mailport As Integer, mailUser As String, mailPW As String,
' AUTH_TYPE As String, SENDER_INSTANCE As String, Optional attment As String = "")
' Try
' Err_Message = ""
' _msg_Send = False
' ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12
' _logger.Debug($"in Email_Send_Independentsoft..")
' Dim empfaenger As String()
' If mailto.Contains(";") Then
' empfaenger = mailto.Split(";")
' Else
' ReDim Preserve empfaenger(0)
' empfaenger(0) = mailto
' End If
' Dim _error As Boolean = False
' 'Für jeden Empfänger eine Neue Mail erzeugen
' For Each _mailempfaenger As String In empfaenger
' _logger.Debug($"Working on email for {_mailempfaenger}..")
' Try
' Dim oMessage As New Message()
' oMessage.From = New Mailbox(from_mailaddress, from_name)
' oMessage.[To].Add(New Mailbox(_mailempfaenger))
' oMessage.Subject = mailSubject
' _logger.Debug($"Message created..")
' Dim textBodyPart As New BodyPart()
' textBodyPart.ContentType = New ContentType("text", "html", "utf-8")
' textBodyPart.ContentTransferEncoding = ContentTransferEncoding.QuotedPrintable
' textBodyPart.Body = mailBody
' oMessage.BodyParts.Add(textBodyPart)
' If attment <> String.Empty Then
' If System.IO.File.Exists(attment) Then
' Dim attachment1 As New Independentsoft.Email.Mime.Attachment(attment)
' If attment.ToLower.EndsWith("pdf") Then
' attachment1.ContentType = New ContentType("application", "pdf")
' ElseIf attment.ToLower.EndsWith("jpg") Then
' attachment1.ContentType = New ContentType("application", "jpg")
' ElseIf attment.ToLower.EndsWith("docx") Then
' attachment1.ContentType = New ContentType("application", "MS-word")
' End If
' oMessage.BodyParts.Add(attachment1)
' Else
' _logger.Warn($"Attachment {attment.ToString} is not existing!")
' End If
' End If
' Dim client As Independentsoft.Email.Smtp.SmtpClient
' Try
' client = New Independentsoft.Email.Smtp.SmtpClient(mailsmtp, mailport)
' Catch ex As Exception
' _logger.Warn("clsEmail.Create Client: " & ex.Message)
' _error = True
' Continue For
' End Try
' Try
' client.Connect()
' Catch ex As Exception
' _logger.Warn("clsEmail.Client.Connect1: " & ex.Message)
' _logger.Debug("Error in ClientConnect - but still trying to send")
' _error = True
' ' Continue For
' End Try
' _logger.Debug("Connected to Client!")
' If AUTH_TYPE = "SSL" Then
' client.EnableSsl = True
' 'client.ValidateRemoteCertificate = True
' _logger.Debug("Authentification via SSL.")
' ElseIf AUTH_TYPE = "TLS" Then
' ' client.ValidateRemoteCertificate = False
' client.StartTls()
' client.EnableSsl = False
' _logger.Debug("Authentification via TLS. SSL disabled")
' Else
' client.EnableSsl = False
' _logger.Debug("Authentification NONE. SSL disabled")
' End If
' Try
' client.Connect()
' Catch ex As Exception
' _logger.Warn("clsEmail.Client.Connect: " & ex.Message)
' Err_Message = "clsEmail.Client.Connect: " & ex.Message
' _error = True
' ' Continue For
' End Try
' Try
' If mailsmtp.Contains("office365.com") Then
' client.Login(mailUser, mailPW, AuthenticationType.None)
' Else
' client.Login(mailUser, mailPW)
' End If
' _logger.Debug("Logged in!")
' Catch ex As Exception
' Try
' If mailsmtp.Contains("office365.com") Then
' client.Login(mailUser, mailPW, AuthenticationType.Login)
' Else
' client.Login(mailUser, mailPW, AuthenticationType.Anonymous)
' End If
' Catch ex1 As Exception
' Try
' client.Login(mailUser, mailPW, AuthenticationType.Login)
' Catch ex2 As Exception
' _logger.Warn("clsEmail.Client.Login: " & ex.Message)
' _error = True
' client.Disconnect()
' Continue For
' End Try
' End Try
' End Try
' Try
' client.Send(oMessage)
' _logger.Info("Message to " & _mailempfaenger & " has been send.")
' _msg_Send = True
' _error = False
' Catch ex As Exception
' _logger.Warn("clsEmail.Client.Send: " & ex.Message)
' Err_Message = ex.Message
' _error = True
' client.Disconnect()
' Continue For
' End Try
' client.Disconnect()
' Catch ex As Exception
' Err_Message = ex.Message
' If _msg_Send = True Then
' _logger.Info($"Error Closing Connection [{ex.Message}]")
' Else
' _logger.Error(ex)
' End If
' _error = True
' End Try
' Next
' If _error = True Then
' Return False
' Else
' Return True
' End If
' Catch ex As Exception
' _logger.Error(ex)
' Err_Message = ex.Message
' Return False
' End Try
'End Function
'Public Function DELETE_EMAIL(POLLTYPE As String, msgid As String, MYMAIL_SERVER As String, MYMAIL_PORT As Integer, MYMAIL_USER As String, MYMAIL_USER_PW As String)
' Try
' If POLLTYPE = "POP" Then
' Dim oClient As New Pop3Client(MYMAIL_SERVER, MYMAIL_PORT)
' oClient.ValidateRemoteCertificate = False
' oClient.Connect()
' oClient.Login(MYMAIL_USER, MYMAIL_USER_PW)
' Dim oMessageInfo As MessageInfo() = oClient.List()
' For i As Integer = 0 To oMessageInfo.Length - 1
' Dim message As Message = oClient.GetMessage(oMessageInfo(i).Index)
' If message.MessageID = msgid Then
' oClient.Delete(oMessageInfo(i).Index)
' _logger.Info(String.Format("Message [{0}] was deleted!", message.Subject))
' Exit For
' End If
' Next
' oClient.Disconnect()
' Return True
' ElseIf POLLTYPE = "IMAP" Then
' Dim oIMAPClient As New ImapClient(MYMAIL_SERVER, MYMAIL_PORT)
' oIMAPClient.ValidateRemoteCertificate = False
' oIMAPClient.Connect()
' oIMAPClient.Login(MYMAIL_USER, MYMAIL_USER_PW)
' oIMAPClient.SelectFolder("Inbox")
' Dim envelopes As Envelope() = oIMAPClient.ListMessages()
' For i As Integer = 0 To envelopes.Length - 1
' If envelopes(i).MessageID = msgid Then
' oIMAPClient.Delete(envelopes(i).UniqueID) 'mark as deleted
' End If
' Next
' oIMAPClient.Expunge() 'delete messages marked as deleted
' oIMAPClient.Disconnect()
' Return True
' End If
' Catch ex As Exception
' _logger.Error(ex)
' 'clsLogger.Add("Unexpected Error in DELETE_EMAIL: " & ex.Message)
' Return False
' End Try
'End Function
End Class