Messaging: Add MailSender class
This commit is contained in:
parent
6be8dc54f5
commit
dbb155a849
@ -5,7 +5,6 @@ Imports Limilabs.Mail
|
|||||||
Imports Limilabs.Mail.MIME
|
Imports Limilabs.Mail.MIME
|
||||||
Imports Limilabs.Mail.MSG
|
Imports Limilabs.Mail.MSG
|
||||||
Imports Limilabs.Client.IMAP
|
Imports Limilabs.Client.IMAP
|
||||||
Imports Limilabs.Client.SMTP
|
|
||||||
Imports Limilabs.Client
|
Imports Limilabs.Client
|
||||||
|
|
||||||
Public Class Email2
|
Public Class Email2
|
||||||
@ -41,17 +40,17 @@ Public Class Email2
|
|||||||
End If
|
End If
|
||||||
End Sub
|
End Sub
|
||||||
|
|
||||||
Public Function New_SMTPConnection(pSMTP As Smtp, pServer As String, pUsername As String, pPassword As String, pSecurity As EmailSecurity, Optional pPort As Integer = 0) As Smtp
|
Public Function New_SMTPConnection(pSMTP As Limilabs.Client.SMTP.Smtp, pServer As String, pUsername As String, pPassword As String, pSecurity As EmailSecurity, Optional pPort As Integer = 0) As Limilabs.Client.SMTP.Smtp
|
||||||
Try
|
Try
|
||||||
Logger.Info("Connecting to SMTP server [{0}:{1}] with user [{2}]", pServer, pPort, pUsername)
|
Logger.Info("Connecting to SMTP server [{0}:{1}] with user [{2}]", pServer, pPort, pUsername)
|
||||||
|
|
||||||
Dim oPort As Integer
|
Dim oPort As Integer
|
||||||
If pPort = 0 Then
|
If pPort = 0 Then
|
||||||
If pSecurity = EmailSecurity.SSL Then
|
If pSecurity = EmailSecurity.SSL Then
|
||||||
oPort = Smtp.DefaultSSLPort
|
oPort = Limilabs.Client.SMTP.Smtp.DefaultSSLPort
|
||||||
|
|
||||||
Else
|
Else
|
||||||
oPort = Smtp.DefaultPort
|
oPort = Limilabs.Client.SMTP.Smtp.DefaultPort
|
||||||
|
|
||||||
End If
|
End If
|
||||||
|
|
||||||
@ -146,7 +145,7 @@ Public Class Email2
|
|||||||
End Try
|
End Try
|
||||||
End Function
|
End Function
|
||||||
|
|
||||||
Public Function Test_SMTPLogin(pClient As Smtp) As Boolean
|
Public Function Test_SMTPLogin(pClient As Limilabs.Client.SMTP.Smtp) As Boolean
|
||||||
Logger.Info("Testing Login to IMAP Server")
|
Logger.Info("Testing Login to IMAP Server")
|
||||||
|
|
||||||
Try
|
Try
|
||||||
@ -241,7 +240,7 @@ Public Class Email2
|
|||||||
End Try
|
End Try
|
||||||
End Function
|
End Function
|
||||||
|
|
||||||
Public Function Send_SMTPMessage(pClient As Smtp, pSender As String, pReceiver As String, pSubject As String, pBody As String) As Boolean
|
Public Function Send_SMTPMessage(pClient As Limilabs.Client.SMTP.Smtp, pSender As String, pReceiver As String, pSubject As String, pBody As String) As Boolean
|
||||||
Logger.Info("Sending Message with Subject [{0}]", pSubject)
|
Logger.Info("Sending Message with Subject [{0}]", pSubject)
|
||||||
|
|
||||||
Try
|
Try
|
||||||
@ -252,9 +251,9 @@ Public Class Email2
|
|||||||
oBuilder.Text = pBody
|
oBuilder.Text = pBody
|
||||||
|
|
||||||
Dim oMail As IMail = oBuilder.Create()
|
Dim oMail As IMail = oBuilder.Create()
|
||||||
Dim oResult As ISendMessageResult = pClient.SendMessage(oMail)
|
Dim oResult As Limilabs.Client.SMTP.ISendMessageResult = pClient.SendMessage(oMail)
|
||||||
|
|
||||||
If oResult.Status = SendMessageStatus.Success Then
|
If oResult.Status = Limilabs.Client.SMTP.SendMessageStatus.Success Then
|
||||||
Logger.Debug("Message sent successful!")
|
Logger.Debug("Message sent successful!")
|
||||||
Return True
|
Return True
|
||||||
|
|
||||||
|
|||||||
@ -283,7 +283,7 @@ Public Class Limilab
|
|||||||
|
|
||||||
Dim email As IMail = oMailBuilder.Create()
|
Dim email As IMail = oMailBuilder.Create()
|
||||||
' Send the message
|
' Send the message
|
||||||
Using oSmtp As New Smtp()
|
Using oSmtp As New Limilabs.Client.SMTP.Smtp()
|
||||||
AddHandler oSmtp.ServerCertificateValidate, AddressOf Validate
|
AddHandler oSmtp.ServerCertificateValidate, AddressOf Validate
|
||||||
Logger.Debug($"AUTH_TYPE [{AUTH_TYPE}]")
|
Logger.Debug($"AUTH_TYPE [{AUTH_TYPE}]")
|
||||||
If AUTH_TYPE = "SSL" Then
|
If AUTH_TYPE = "SSL" Then
|
||||||
|
|||||||
244
Messaging/MailSender.vb
Normal file
244
Messaging/MailSender.vb
Normal file
@ -0,0 +1,244 @@
|
|||||||
|
Imports DigitalData.Modules.Logging
|
||||||
|
Imports DigitalData.Modules.Base
|
||||||
|
Imports System.Net.Security
|
||||||
|
Imports Limilabs.Client.SMTP
|
||||||
|
Imports Limilabs.Client
|
||||||
|
|
||||||
|
Public Class MailSender
|
||||||
|
Inherits BaseClass
|
||||||
|
|
||||||
|
Private Server As String
|
||||||
|
Private Port As Integer
|
||||||
|
Private User As String
|
||||||
|
Private Password As String
|
||||||
|
Private AuthType As String
|
||||||
|
|
||||||
|
Private Session As Smtp = Nothing
|
||||||
|
|
||||||
|
Const SMTP_IGNORED_ERRORS As SslPolicyErrors =
|
||||||
|
SslPolicyErrors.RemoteCertificateChainErrors Or ' self-signed
|
||||||
|
SslPolicyErrors.RemoteCertificateNameMismatch ' name mismatch
|
||||||
|
|
||||||
|
Public Sub New(pLogConfig As LogConfig)
|
||||||
|
MyBase.New(pLogConfig)
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
''' <summary>
|
||||||
|
''' Start a connection with the specified server and return the SMTP client. Throws if there was an error.
|
||||||
|
''' </summary>
|
||||||
|
''' <param name="pServer"></param>
|
||||||
|
''' <param name="pPort"></param>
|
||||||
|
''' <param name="pUser"></param>
|
||||||
|
''' <param name="pPassword"></param>
|
||||||
|
''' <param name="pAuthType"></param>
|
||||||
|
''' <returns></returns>
|
||||||
|
Public Function ConnectToServer(pServer As String, pPort As Integer, pUser As String, pPassword As String, pAuthType As String) As Boolean
|
||||||
|
Server = pServer
|
||||||
|
Port = pPort
|
||||||
|
User = pUser
|
||||||
|
Password = pPassword
|
||||||
|
AuthType = pAuthType
|
||||||
|
|
||||||
|
Logger.Info("Connecting to Server..")
|
||||||
|
Logger.Debug("SMTP Server: [{0}]", Server)
|
||||||
|
Logger.Debug("SMTP Port: [{0}]", Port)
|
||||||
|
Logger.Debug("SMTP User: [{0}]", User)
|
||||||
|
Logger.Debug("SMTP AuthType: [{0}]", AuthType)
|
||||||
|
|
||||||
|
Dim oSession As New Smtp()
|
||||||
|
AddHandler oSession.ServerCertificateValidate, AddressOf Session_ServerCertificateValidate
|
||||||
|
|
||||||
|
Logger.Debug("Initializing Connection with Auth type [{0}].", pAuthType)
|
||||||
|
|
||||||
|
If pAuthType = "SSL" Then
|
||||||
|
Try
|
||||||
|
If pPort = 465 Then
|
||||||
|
Logger.Debug("Connecting with [ConnectSSL] on [{0}/{1}]", pServer, pPort)
|
||||||
|
oSession.ConnectSSL(pServer)
|
||||||
|
Else
|
||||||
|
Logger.Debug("Connecting with [Connect] on [{0}/{1}]", pServer, pPort)
|
||||||
|
oSession.Connect(pServer, pPort)
|
||||||
|
End If
|
||||||
|
Logger.Info("Connection Successful!")
|
||||||
|
|
||||||
|
Catch ex As Exception
|
||||||
|
Logger.Warn("Error while connecting with Auth type SSL!")
|
||||||
|
Logger.Error(ex)
|
||||||
|
|
||||||
|
Return False
|
||||||
|
End Try
|
||||||
|
|
||||||
|
ElseIf AuthType = "SSL/TLS" Or AuthType = "STARTTLS" Then
|
||||||
|
|
||||||
|
Try
|
||||||
|
Logger.Debug("Connecting with [Connect] on [{0}/{1}]", pServer, pPort)
|
||||||
|
oSession.Connect(pServer, pPort)
|
||||||
|
Logger.Info("Connection Successful!")
|
||||||
|
|
||||||
|
Dim oSupportsSTARTTLS As Boolean = oSession.SupportedExtensions.Contains(Limilabs.Client.SMTP.SmtpExtension.StartTLS)
|
||||||
|
Logger.Debug("Server supports STARTTLS: [{0}]", oSupportsSTARTTLS)
|
||||||
|
|
||||||
|
If oSupportsSTARTTLS Then
|
||||||
|
oSession.StartTLS()
|
||||||
|
Logger.Info("STARTTLS Successful!")
|
||||||
|
Else
|
||||||
|
Logger.Debug("Server does not support STARTTLS. Enabling TLS1.2 instead.")
|
||||||
|
oSession.SSLConfiguration.EnabledSslProtocols = Security.Authentication.SslProtocols.Tls12
|
||||||
|
End If
|
||||||
|
|
||||||
|
Catch ex As Exception
|
||||||
|
Logger.Warn("Error while connecting with Auth type STARTTLS!")
|
||||||
|
Logger.Error(ex)
|
||||||
|
|
||||||
|
Return False
|
||||||
|
End Try
|
||||||
|
|
||||||
|
Else
|
||||||
|
Try
|
||||||
|
Logger.Debug("Unknown Auth type. Using PLAINTEXT connection.")
|
||||||
|
oSession.Connect(pServer)
|
||||||
|
Logger.Info("Connection Successful!")
|
||||||
|
Catch ex As Exception
|
||||||
|
Logger.Warn("Error while connecting with Auth type PLAINTEXT!")
|
||||||
|
Logger.Error(ex)
|
||||||
|
|
||||||
|
Return False
|
||||||
|
End Try
|
||||||
|
|
||||||
|
End If
|
||||||
|
|
||||||
|
Try
|
||||||
|
Logger.Info("Logging in with user [{0}]", pUser)
|
||||||
|
oSession.UseBestLogin(pUser, pPassword)
|
||||||
|
|
||||||
|
Catch ex As Exception
|
||||||
|
Logger.Warn("Error while connecting with Auth type PLAINTEXT!")
|
||||||
|
Logger.Error(ex)
|
||||||
|
|
||||||
|
Return False
|
||||||
|
End Try
|
||||||
|
|
||||||
|
Session = oSession
|
||||||
|
|
||||||
|
Return True
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Public Function DisconnectFromServer() As Boolean
|
||||||
|
Try
|
||||||
|
If Session IsNot Nothing Then
|
||||||
|
Logger.Debug("Closing connection to Server [{0}].", Server)
|
||||||
|
Session.Close()
|
||||||
|
Session = Nothing
|
||||||
|
Logger.Info("Connection to Server [{0}] closed.", Server)
|
||||||
|
Else
|
||||||
|
Logger.Debug("No connection currently open. Exiting.")
|
||||||
|
End If
|
||||||
|
|
||||||
|
Return True
|
||||||
|
|
||||||
|
Catch ex As Exception
|
||||||
|
Logger.Error(ex)
|
||||||
|
Return False
|
||||||
|
|
||||||
|
End Try
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Private Sub Session_ServerCertificateValidate(sender As Object, e As ServerCertificateValidateEventArgs)
|
||||||
|
' i dont know why it works but it does
|
||||||
|
If (e.SslPolicyErrors And Not SMTP_IGNORED_ERRORS) = SslPolicyErrors.None Then
|
||||||
|
e.IsValid = True
|
||||||
|
Return
|
||||||
|
End If
|
||||||
|
e.IsValid = False
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Public Function SendMail(pSendTo As List(Of String), pSendFrom As String, pSubject As String, pBody As String, pCreationTime As Date, pAttachments As List(Of String), pTest As Boolean) As Boolean
|
||||||
|
Dim oSuccessfulSends As New List(Of String)
|
||||||
|
Dim oFailedSends As New List(Of String)
|
||||||
|
|
||||||
|
For Each oSendToAddress In pSendTo
|
||||||
|
Dim oResult = SendMailTo(Session, oSendToAddress, pSendFrom, pSubject, pBody, pCreationTime, pAttachments, pTest)
|
||||||
|
|
||||||
|
If oResult = True Then
|
||||||
|
oSuccessfulSends.Add(oSendToAddress)
|
||||||
|
Else
|
||||||
|
oFailedSends.Add(oSendToAddress)
|
||||||
|
End If
|
||||||
|
Next
|
||||||
|
|
||||||
|
Logger.Debug("Sent [{0}] mails.", pSendTo.Count)
|
||||||
|
Logger.Debug("Successful [{0}]", oSuccessfulSends.Count)
|
||||||
|
Logger.Debug("Failed [{0}]", oFailedSends.Count)
|
||||||
|
|
||||||
|
Return True
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Private Function SendMailTo(pSession As Smtp, pSendTo As String, pSendFrom As String, pSubject As String, pBody As String, pCreationTime As Date, pAttachments As List(Of String), pTest As Boolean)
|
||||||
|
Try
|
||||||
|
Logger.Debug("Preparing to send mail to [{0}]", pSendTo)
|
||||||
|
|
||||||
|
Dim oMailBuilder As New Limilabs.Mail.MailBuilder()
|
||||||
|
oMailBuilder.From.Add(New Limilabs.Mail.Headers.MailBox(pSendFrom))
|
||||||
|
oMailBuilder.To.Add(New Limilabs.Mail.Headers.MailBox(pSendTo))
|
||||||
|
oMailBuilder.Subject = pSubject
|
||||||
|
|
||||||
|
Logger.Debug("Setting body for mail")
|
||||||
|
SetBody(oMailBuilder, pBody, pCreationTime, pTest)
|
||||||
|
|
||||||
|
Logger.Debug("Adding [{0}] attachments to mail", pAttachments.Count)
|
||||||
|
oMailBuilder = AddAttachments(oMailBuilder, pAttachments)
|
||||||
|
|
||||||
|
Logger.Debug("Now sending mail..")
|
||||||
|
Dim oMail = oMailBuilder.Create()
|
||||||
|
pSession.SendMessage(oMail)
|
||||||
|
Logger.Info("Mail to [{0}] has been sent.", pSendTo)
|
||||||
|
|
||||||
|
Return True
|
||||||
|
|
||||||
|
Catch ex As Exception
|
||||||
|
Logger.Warn("Error while sending mail to [{0}]", pSendTo)
|
||||||
|
Logger.Error(ex)
|
||||||
|
|
||||||
|
Return False
|
||||||
|
End Try
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Private Function SetBody(pMailBuilder As Limilabs.Mail.MailBuilder, pBody As String, pCreationTime As Date, pTest As Boolean) As Limilabs.Mail.MailBuilder
|
||||||
|
If pCreationTime <> Date.MinValue Then
|
||||||
|
pBody &= $"<p>Creation-time: {pCreationTime}</p>"
|
||||||
|
End If
|
||||||
|
|
||||||
|
If pTest Then
|
||||||
|
pBody = $"<p>This Is a Testmail!<br/>
|
||||||
|
The body-text will be replaced within profile!<br/>
|
||||||
|
Server/Port: {Server}/{Port}<br/>
|
||||||
|
User: {User}<br/>
|
||||||
|
Password: XXXX<br/>
|
||||||
|
Auth Type: {AuthType}</p>"
|
||||||
|
End If
|
||||||
|
|
||||||
|
Logger.Debug("Final Mailbody is: [{0}]", pBody)
|
||||||
|
pMailBuilder.Html = pBody
|
||||||
|
|
||||||
|
Return pMailBuilder
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Private Function AddAttachments(pMailBuilder As Limilabs.Mail.MailBuilder, pAttachments As List(Of String)) As Limilabs.Mail.MailBuilder
|
||||||
|
For Each oAttachment In pAttachments
|
||||||
|
Try
|
||||||
|
' Read attachment from disk, add it to Attachments collection
|
||||||
|
If IO.File.Exists(oAttachment) Then
|
||||||
|
Logger.Debug("Adding attachment [{0}] to mail.", oAttachment)
|
||||||
|
pMailBuilder.AddAttachment(oAttachment)
|
||||||
|
Else
|
||||||
|
Logger.Warn("Attachment [{0}] does not exist. Skipping.", oAttachment)
|
||||||
|
End If
|
||||||
|
Catch ex As Exception
|
||||||
|
Logger.Warn("Could not read or add attachment [{0}]!", oAttachment)
|
||||||
|
Logger.Error(ex)
|
||||||
|
End Try
|
||||||
|
Next
|
||||||
|
|
||||||
|
Return pMailBuilder
|
||||||
|
End Function
|
||||||
|
End Class
|
||||||
@ -95,7 +95,7 @@
|
|||||||
<DependentUpon>Settings.settings</DependentUpon>
|
<DependentUpon>Settings.settings</DependentUpon>
|
||||||
<DesignTimeSharedInput>True</DesignTimeSharedInput>
|
<DesignTimeSharedInput>True</DesignTimeSharedInput>
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="SMS.vb" />
|
<Compile Include="MailSender.vb" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<EmbeddedResource Include="My Project\Resources.resx">
|
<EmbeddedResource Include="My Project\Resources.resx">
|
||||||
@ -118,6 +118,10 @@
|
|||||||
<None Include="packages.config" />
|
<None Include="packages.config" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\Base\Base.vbproj">
|
||||||
|
<Project>{6ea0c51f-c2b1-4462-8198-3de0b32b74f8}</Project>
|
||||||
|
<Name>Base</Name>
|
||||||
|
</ProjectReference>
|
||||||
<ProjectReference Include="..\Filesystem\Filesystem.vbproj">
|
<ProjectReference Include="..\Filesystem\Filesystem.vbproj">
|
||||||
<Project>{991d0231-4623-496d-8bd0-9ca906029cbc}</Project>
|
<Project>{991d0231-4623-496d-8bd0-9ca906029cbc}</Project>
|
||||||
<Name>Filesystem</Name>
|
<Name>Filesystem</Name>
|
||||||
|
|||||||
@ -1,3 +0,0 @@
|
|||||||
Public Class SMS
|
|
||||||
|
|
||||||
End Class
|
|
||||||
Loading…
x
Reference in New Issue
Block a user