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.MSG
|
||||
Imports Limilabs.Client.IMAP
|
||||
Imports Limilabs.Client.SMTP
|
||||
Imports Limilabs.Client
|
||||
|
||||
Public Class Email2
|
||||
@ -41,17 +40,17 @@ Public Class Email2
|
||||
End If
|
||||
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
|
||||
Logger.Info("Connecting to SMTP server [{0}:{1}] with user [{2}]", pServer, pPort, pUsername)
|
||||
|
||||
Dim oPort As Integer
|
||||
If pPort = 0 Then
|
||||
If pSecurity = EmailSecurity.SSL Then
|
||||
oPort = Smtp.DefaultSSLPort
|
||||
oPort = Limilabs.Client.SMTP.Smtp.DefaultSSLPort
|
||||
|
||||
Else
|
||||
oPort = Smtp.DefaultPort
|
||||
oPort = Limilabs.Client.SMTP.Smtp.DefaultPort
|
||||
|
||||
End If
|
||||
|
||||
@ -146,7 +145,7 @@ Public Class Email2
|
||||
End Try
|
||||
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")
|
||||
|
||||
Try
|
||||
@ -241,7 +240,7 @@ Public Class Email2
|
||||
End Try
|
||||
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)
|
||||
|
||||
Try
|
||||
@ -252,9 +251,9 @@ Public Class Email2
|
||||
oBuilder.Text = pBody
|
||||
|
||||
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!")
|
||||
Return True
|
||||
|
||||
|
||||
@ -283,7 +283,7 @@ Public Class Limilab
|
||||
|
||||
Dim email As IMail = oMailBuilder.Create()
|
||||
' Send the message
|
||||
Using oSmtp As New Smtp()
|
||||
Using oSmtp As New Limilabs.Client.SMTP.Smtp()
|
||||
AddHandler oSmtp.ServerCertificateValidate, AddressOf Validate
|
||||
Logger.Debug($"AUTH_TYPE [{AUTH_TYPE}]")
|
||||
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>
|
||||
<DesignTimeSharedInput>True</DesignTimeSharedInput>
|
||||
</Compile>
|
||||
<Compile Include="SMS.vb" />
|
||||
<Compile Include="MailSender.vb" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<EmbeddedResource Include="My Project\Resources.resx">
|
||||
@ -118,6 +118,10 @@
|
||||
<None Include="packages.config" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\Base\Base.vbproj">
|
||||
<Project>{6ea0c51f-c2b1-4462-8198-3de0b32b74f8}</Project>
|
||||
<Name>Base</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\Filesystem\Filesystem.vbproj">
|
||||
<Project>{991d0231-4623-496d-8bd0-9ca906029cbc}</Project>
|
||||
<Name>Filesystem</Name>
|
||||
|
||||
@ -1,3 +0,0 @@
|
||||
Public Class SMS
|
||||
|
||||
End Class
|
||||
Loading…
x
Reference in New Issue
Block a user