websitepanel/WebsitePanel/Sources/WebsitePanel.Providers.Mail.MailEnable/MailEnable.vb

2045 lines
78 KiB
VB.net

' Copyright (c) 2012, Outercurve Foundation.
' All rights reserved.
'
' Redistribution and use in source and binary forms, with or without modification,
' are permitted provided that the following conditions are met:
'
' - Redistributions of source code must retain the above copyright notice, this
' list of conditions and the following disclaimer.
'
' - Redistributions in binary form must reproduce the above copyright notice,
' this list of conditions and the following disclaimer in the documentation
' and/or other materials provided with the distribution.
'
' - Neither the name of the Outercurve Foundation nor the names of its
' contributors may be used to endorse or promote products derived from this
' software without specific prior written permission.
'
' THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
' ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
' WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
' DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
' ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
' (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
' LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
' ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
' (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
' SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Imports System
Imports System.Collections
Imports System.Collections.Specialized
Imports System.IO
Imports System.Text
Imports System.Diagnostics
Imports Microsoft.Win32
Imports WebsitePanel.Providers.Utils
Imports WebsitePanel.Providers.Utils.LogParser
Imports WebsitePanel.Server.Utils
Public Class MailEnable
Inherits HostingServiceProviderBase
Implements IMailServer
#Region "Domains"
Public Overridable Function GetDomains() As String() Implements IMailServer.GetDomains
Dim domainList As List(Of String) = New List(Of String)
Dim po As New WebsitePanel.Providers.Mail.MailEnablePostoffice
po.Account = ""
po.Name = ""
po.Status = -1
If po.FindFirstPostoffice() = 1 Then
Do
domainList.Add(po.Name)
po.Account = ""
po.Name = ""
po.Status = -1
Loop While po.FindNextPostoffice() = 1
End If
Return domainList.ToArray()
End Function
Public Overridable Function DomainExists(ByVal domainName As String) As Boolean Implements IMailServer.DomainExists
Dim domain As New WebsitePanel.Providers.Mail.MailEnableDomain
ResetDomain(domain)
domain.AccountName = domainName
domain.DomainName = domainName
Return (domain.GetDomain() = 1)
End Function
Public Overridable Function GetDomain(ByVal domainName As String) As MailDomain Implements IMailServer.GetDomain
Dim info As MailDomain = Nothing
Dim domain As New WebsitePanel.Providers.Mail.MailEnableDomain
ResetDomain(domain)
domain.AccountName = domainName
domain.DomainName = domainName
If (domain.GetDomain() = 1) Then
info = GetMailDomainInfo(domain)
Else
Return Nothing
End If
Return info
End Function
Public Overridable Sub CreateDomain(ByVal domainInfo As MailDomain) Implements IMailServer.CreateDomain
'create a new postoffice for each account
Dim postoffice As New WebsitePanel.Providers.Mail.MailEnablePostoffice
postoffice.Account = domainInfo.Name
postoffice.Name = domainInfo.Name
postoffice.Status = IIf((domainInfo.Enabled), 1, 0)
If (postoffice.AddPostoffice() <> 1) Then
Throw New Exception("Postoffice creation failedNot ")
End If
Dim domain As New WebsitePanel.Providers.Mail.MailEnableDomain
domain.AccountName = domainInfo.Name
domain.DomainName = domainInfo.Name
domain.DomainRedirectionHosts = domainInfo.RedirectionHosts
domain.DomainRedirectionStatus = IIf((domainInfo.RedirectionActive), 1, 0)
domain.Status = IIf((domainInfo.Enabled), 1, 0)
If (domain.AddDomain() <> 1) Then
Throw New Exception("Domain creation failedNot ")
End If
Dim blackListedDomain As String
For Each blackListedDomain In domainInfo.BlackList
Dim blacklist As New WebsitePanel.Providers.Mail.MailEnableDomainBlacklist
blacklist.Account = domainInfo.Name
blacklist.Status = 1
blacklist.TargetDomainName = domainInfo.Name
blacklist.BannedDomainName = blackListedDomain
If (blacklist.AddBlacklist() <> 1) Then
Throw New Exception("Although the domain was created, blacklist creation failed")
End If
Next
End Sub
Public Overridable Sub UpdateDomain(ByVal info As MailDomain) Implements IMailServer.UpdateDomain
Dim domain As New WebsitePanel.Providers.Mail.MailEnableDomain
domain.AccountName = info.Name
domain.DomainName = info.Name
domain.DomainRedirectionHosts = String.Empty
domain.DomainRedirectionStatus = -1
domain.Host = String.Empty
domain.Status = -1
If (domain.GetDomain() = 1) Then
Dim newStatus As Integer = IIf(info.Enabled, 1, 0)
Dim newRedirectionStatus As Integer = IIf(info.RedirectionActive, 1, 0)
'redirection status has 3 states, so we don't use redirectionaction
'0=off, 1=on, 2=on for authenticated only
If info("MailEnable_SmartHostEnabled") Then
If info("MailEnable_SmartHostAuth") Then
newRedirectionStatus = 2
Else
newRedirectionStatus = 1
End If
Else
newRedirectionStatus = 0
End If
domain.EditDomain( _
info.Name, _
newStatus, _
newRedirectionStatus, _
info.RedirectionHosts, _
info.Name)
'
' Update the Catch All Account
'
Dim oAddressMap As New WebsitePanel.Providers.Mail.MailEnableAddressMap
oAddressMap.Account = info.Name ' account
oAddressMap.DestinationAddress = ""
oAddressMap.SourceAddress = "[SMTP:*@" & info.Name & "]"
oAddressMap.Scope = ""
If info.CatchAllAccount = "" Then
' things are tricky here because we want to change it so we know what we are deleting
oAddressMap.SourceAddress = "[SMTP:*@" & info.Name & "]"
oAddressMap.DestinationAddress = ""
oAddressMap.Scope = ""
'
' Change its value if it exists
'
If oAddressMap.EditAddressMap(info.Name, "[DELETE:ME]", "[DELETE:ME]", "0", oAddressMap.Status) Then
oAddressMap.Account = info.Name
oAddressMap.DestinationAddress = "[DELETE:ME]"
oAddressMap.SourceAddress = "[DELETE:ME]"
oAddressMap.Scope = "0"
Dim Result As Integer = oAddressMap.RemoveAddressMap
End If
Else
Dim NewAccount As String = info.Name
Dim NewSourceAddress As String = "[SMTP:*@" & info.Name & "]"
Dim NewDestinationAddress As String = "[SF:" & info.Name & "/" & GetMailboxName(info.CatchAllAccount) & "]"
Dim NewScope As String = "0"
If oAddressMap.EditAddressMap(NewAccount, NewSourceAddress, NewDestinationAddress, NewScope, 0) <> 1 Then
'
' We need to add it because there was not one defined
'
oAddressMap.SourceAddress = "[SMTP:*@" & info.Name & "]"
oAddressMap.DestinationAddress = "[SF:" & info.Name & "/" & GetMailboxName(info.CatchAllAccount) & "]"
oAddressMap.Scope = "0"
oAddressMap.Account = info.Name
oAddressMap.AddAddressMap()
End If
End If
'
' Update the Postmaster Account
'
oAddressMap.Account = info.Name
oAddressMap.DestinationAddress = ""
oAddressMap.SourceAddress = "[SMTP:Postmaster@" & info.Name & "]"
oAddressMap.Scope = ""
If (info.PostmasterAccount = "") Then
oAddressMap.SourceAddress = "[SMTP:Postmaster@" & info.Name & "]"
oAddressMap.DestinationAddress = ""
oAddressMap.Scope = ""
Dim Result As Integer = oAddressMap.RemoveAddressMap
Else
Dim NewAccount = info.Name
Dim NewSourceAddress = "[SMTP:postmaster@" & info.Name & "]"
Dim NewDestinationAddress = "[SF:" & info.Name & "/" & GetMailboxName(info.PostmasterAccount) & "]"
Dim NewScope = "0"
If oAddressMap.EditAddressMap(NewAccount, NewSourceAddress, NewDestinationAddress, NewScope, 0) <> 1 Then
'
' We need to add it because there was not one defined
'
oAddressMap.SourceAddress = "[SMTP:Postmaster@" & info.Name & "]"
oAddressMap.DestinationAddress = "[SF:" & info.Name & "/" & GetMailboxName(info.PostmasterAccount) & "]"
oAddressMap.Scope = "0"
oAddressMap.Account = info.Name
oAddressMap.AddAddressMap()
End If
End If
'
' Update the Abuse Account
'
oAddressMap.Account = info.Name
oAddressMap.DestinationAddress = ""
oAddressMap.SourceAddress = "[SMTP:abuse@" & info.Name & "]"
oAddressMap.Scope = ""
If (info.AbuseAccount = "") Then
oAddressMap.SourceAddress = "[SMTP:abuse@" & info.Name & "]"
oAddressMap.DestinationAddress = ""
oAddressMap.Scope = ""
Dim Result = oAddressMap.RemoveAddressMap
Else
Dim NewAccount = info.Name
Dim NewSourceAddress = "[SMTP:Abuse@" & info.Name & "]"
Dim NewDestinationAddress = "[SF:" & info.Name & "/" & GetMailboxName(info.AbuseAccount) & "]"
Dim NewScope = "0"
If oAddressMap.EditAddressMap(NewAccount, NewSourceAddress, NewDestinationAddress, NewScope, 0) <> 1 Then
'
' We need to add it because there was not one defined
'
oAddressMap.SourceAddress = "[SMTP:abuse@" & info.Name & "]"
oAddressMap.DestinationAddress = "[SF:" & info.Name & "/" & GetMailboxName(info.AbuseAccount) & "]"
oAddressMap.Scope = "0"
oAddressMap.Account = info.Name
oAddressMap.AddAddressMap()
End If
End If
'edit blacklists
'delete all the blacklists
Dim blacklist As New WebsitePanel.Providers.Mail.MailEnableDomainBlacklist
ResetBlacklist(blacklist)
blacklist.Account = info.Name
blacklist.TargetDomainName = info.Name
While blacklist.FindFirstBlacklist() = 1
' remove blacklist
blacklist.RemoveBlacklist()
' initialize blacklist again
blacklist = New WebsitePanel.Providers.Mail.MailEnableDomainBlacklist
ResetBlacklist(blacklist)
blacklist.Account = info.Name
blacklist.TargetDomainName = info.Name
End While
'add new blacklists
Dim blacklistedDomainName As String
For Each blacklistedDomainName In info.BlackList
blacklist = New WebsitePanel.Providers.Mail.MailEnableDomainBlacklist
blacklist.Account = info.Name
blacklist.TargetDomainName = info.Name
blacklist.BannedDomainName = blacklistedDomainName
blacklist.Status = IIf((info.Enabled), 1, 0)
' add blacklist
blacklist.AddBlacklist()
Next
End If
End Sub
Public Overridable Sub DeleteDomain(ByVal domainName As String) Implements IMailServer.DeleteDomain
'delete all postoffice logins
Dim login As New WebsitePanel.Providers.Mail.MailEnableLogin
ResetLogin(login)
login.Account = domainName
login.RemoveLogin()
'delete all the mailboxes
Dim mailbox As New WebsitePanel.Providers.Mail.MailEnableMailbox
ResetMailbox(mailbox)
mailbox.Postoffice = domainName
mailbox.RemoveMailbox()
' delete mailling lists
Dim lists() As MailList = GetLists(domainName)
Dim list As MailList
For Each list In lists
' remove list members
Dim listMember As New WebsitePanel.Providers.Mail.MailEnableListMember
listMember.AccountName = domainName
listMember.ListName = GetMailboxName(list.Name)
listMember.Address = ""
listMember.ListMemberType = -1
listMember.Status = -1
listMember.RemoveListMember()
' delete maillist
Dim mailList As New WebsitePanel.Providers.Mail.MailEnableList
ResetMaillist(mailList)
mailList.AccountName = domainName
mailList.ListName = GetMailboxName(list.Name)
mailList.RemoveList()
Next
' delete groups
Dim groups() As MailGroup = GetGroups(domainName)
Dim group As MailGroup
For Each group In groups
' remove group members
Dim groupMember As New WebsitePanel.Providers.Mail.MailEnableGroupMember
groupMember.Postoffice = domainName
groupMember.Mailbox = GetMailboxName(group.Name)
groupMember.Address = ""
groupMember.RemoveGroupMember()
' delete group
Dim objGroup As New WebsitePanel.Providers.Mail.MailEnableGroup
ResetGroup(objGroup)
objGroup.Postoffice = domainName
objGroup.GroupName = GetMailboxName(group.Name)
objGroup.RemoveGroup()
Next
'delete all address mappings
Dim map As New WebsitePanel.Providers.Mail.MailEnableAddressMap
ResetAddressMap(map)
map.Account = domainName
map.RemoveAddressMap(True)
'delete all the blacklists
Dim blacklist As New WebsitePanel.Providers.Mail.MailEnableDomainBlacklist
ResetBlacklist(blacklist)
blacklist.Account = domainName
blacklist.RemoveBlacklist()
'delete all domains
Dim domain As New WebsitePanel.Providers.Mail.MailEnableDomain
ResetDomain(domain)
domain.AccountName = domainName
domain.RemoveDomain()
'delete postoffice
Dim po As New WebsitePanel.Providers.Mail.MailEnablePostoffice
po.Account = domainName
po.Name = domainName
po.Host = ""
po.Status = -1
If (po.RemovePostoffice() <> 1) Then
Throw New Exception(String.Format("Could not remove postoffice '{0}'", domainName))
End If
' delete postoffice directory
DeletePostofficeDirectory(domainName)
End Sub
Private Function GetMailDomainInfo(ByVal domain As Object) As MailDomain
Dim info As MailDomain = New MailDomain
info.Name = domain.DomainName
info.RedirectionHosts = domain.DomainRedirectionHosts
info.RedirectionActive = (domain.DomainRedirectionStatus = 1)
If domain.DomainRedirectionStatus = 2 Then
info("MailEnable_SmartHostAuth") = True
info("MailEnable_SmartHostEnabled") = True
ElseIf domain.DomainRedirectionStatus = 1 Then
info("MailEnable_SmartHostEnabled") = True
info("MailEnable_SmartHostAuth") = False
Else
info("MailEnable_SmartHostEnabled") = false
info("MailEnable_SmartHostAuth") = False
End If
info.Enabled = (domain.Status = 1)
'
' We need to get the catch all account for the domain
'
Dim oAddressMap As New WebsitePanel.Providers.Mail.MailEnableAddressMap
oAddressMap.Account = info.Name
oAddressMap.DestinationAddress = ""
oAddressMap.SourceAddress = "[SMTP:*@" & info.Name & "]"
oAddressMap.Scope = ""
If oAddressMap.GetAddressMap = 1 Then
Dim FrmCatchAllAccount = Mid(oAddressMap.DestinationAddress, InStr(1, oAddressMap.DestinationAddress, "/") + 1)
info.CatchAllAccount = Left(FrmCatchAllAccount, Len(FrmCatchAllAccount) - 1)
Else
info.CatchAllAccount = ""
End If
'
' Get the Postmaster Address Map
'
oAddressMap.Account = info.Name
oAddressMap.DestinationAddress = ""
oAddressMap.SourceAddress = "[SMTP:postmaster@" & info.Name & "]"
oAddressMap.Scope = ""
If oAddressMap.GetAddressMap = 1 Then
Dim FrmPostmasterAccount = Mid(oAddressMap.DestinationAddress, InStr(1, oAddressMap.DestinationAddress, "/") + 1)
info.PostmasterAccount = Left(FrmPostmasterAccount, Len(FrmPostmasterAccount) - 1)
Else
info.PostmasterAccount = ""
End If
'
' Get the Abuse Address Map
'
oAddressMap.Account = info.Name
oAddressMap.DestinationAddress = ""
oAddressMap.SourceAddress = "[SMTP:abuse@" & info.Name & "]"
oAddressMap.Scope = ""
If oAddressMap.GetAddressMap = 1 Then
Dim FrmAbuseAccount = Mid(oAddressMap.DestinationAddress, InStr(1, oAddressMap.DestinationAddress, "/") + 1)
info.AbuseAccount = Left(FrmAbuseAccount, Len(FrmAbuseAccount) - 1)
Else
info.AbuseAccount = "(None)"
End If
oAddressMap = Nothing
'getting black mail list
Dim blacklists As ArrayList = New ArrayList
Dim blacklist As New WebsitePanel.Providers.Mail.MailEnableDomainBlacklist
blacklist.Account = domain.AccountName
blacklist.Host = domain.Host
blacklist.TargetDomainName = domain.DomainName
blacklist.Status = -1
blacklist.BannedDomainName = ""
If blacklist.FindFirstBlacklist() = 1 Then
blacklists.Add(blacklist.BannedDomainName)
End If
blacklist.Status = -1
blacklist.BannedDomainName = ""
While blacklist.FindNextBlacklist() = 1
blacklists.Add(blacklist.BannedDomainName)
blacklist.Status = -1
blacklist.BannedDomainName = ""
End While
info.BlackList = CType(blacklists.ToArray(GetType(String)), String())
Return info
End Function
#End Region
#Region "Domain Aliases"
Public Overridable Function DomainAliasExists(ByVal domainName As String, ByVal aliasName As String) As Boolean Implements IMailServer.DomainAliasExists
Dim domain As New WebsitePanel.Providers.Mail.MailEnableDomain
ResetDomain(domain)
domain.AccountName = domainName
domain.DomainName = aliasName
Return (domain.GetDomain() = 1)
End Function
Public Overridable Function GetDomainAliases(ByVal domainName As String) As String() Implements IMailServer.GetDomainAliases
Dim aliases As List(Of String) = New List(Of String)
Dim domain As New WebsitePanel.Providers.Mail.MailEnableDomain
ResetDomain(domain)
domain.AccountName = domainName
If (domain.FindFirstDomain() = 1) Then
If domain.DomainName.ToLower() <> domainName.ToLower() Then
aliases.Add(domain.DomainName)
End If
ResetDomain(domain)
domain.AccountName = domainName
End If
While domain.FindNextDomain() = 1
If domain.DomainName.ToLower() <> domainName.ToLower() Then
aliases.Add(domain.DomainName)
End If
ResetDomain(domain)
domain.AccountName = domainName
End While
Return aliases.ToArray()
End Function
Public Overridable Sub AddDomainAlias(ByVal domainName As String, ByVal aliasName As String) Implements IMailServer.AddDomainAlias
' add new domain
Dim domain As New WebsitePanel.Providers.Mail.MailEnableDomain
domain.AccountName = domainName
domain.DomainName = aliasName
domain.DomainRedirectionHosts = ""
domain.DomainRedirectionStatus = 0 ' disabled
domain.Status = 1 ' enabled
If (domain.AddDomain() <> 1) Then
Throw New Exception("Can't create domain alias")
End If
' add address maps
' get current "main domain" address mappings
Dim srcAddr As String = "@" + domainName + "]"
Dim maps As ArrayList = New ArrayList
Dim map As New WebsitePanel.Providers.Mail.MailEnableAddressMap
ResetAddressMap(map)
map.Account = domainName
If (map.FindFirstAddressMap() = 1) Then
Do
If map.SourceAddress.ToLower().IndexOf(srcAddr) > -1 Then
maps.Add(New String() {map.DestinationAddress, map.SourceAddress})
End If
ResetAddressMap(map)
map.Account = domainName
Loop While (map.FindNextAddressMap() = 1)
End If
Dim mapInfo() As String
For Each mapInfo In maps
Dim userName As String = mapInfo(1).Substring(6, mapInfo(1).IndexOf("@") - 6)
ResetAddressMap(map)
map.Account = domainName
map.DestinationAddress = mapInfo(0)
map.SourceAddress = String.Format("[SMTP:{0}]", userName + "@" + aliasName)
map.AddAddressMap()
Next
End Sub
Public Overridable Sub DeleteDomainAlias(ByVal domainName As String, ByVal aliasName As String) Implements IMailServer.DeleteDomainAlias
'delete all address mappings
Dim addr As String = "@" + aliasName.ToLower() + "]"
Dim maps As ArrayList = New ArrayList
Dim map As New WebsitePanel.Providers.Mail.MailEnableAddressMap
ResetAddressMap(map)
map.Account = domainName
map.SourceAddress = "[SMTP:*@" + aliasName + "]"
map.RemoveAddressMap(True)
'delete all the blacklists
Dim blacklist As New WebsitePanel.Providers.Mail.MailEnableDomainBlacklist
ResetBlacklist(blacklist)
blacklist.Account = domainName
blacklist.TargetDomainName = aliasName
blacklist.RemoveBlacklist()
'delete all domains
Dim domain As New WebsitePanel.Providers.Mail.MailEnableDomain
ResetDomain(domain)
domain.AccountName = domainName
domain.DomainName = aliasName
domain.RemoveDomain()
End Sub
#End Region
#Region "Accounts"
Public Overridable Function GetAccounts(ByVal domainName As String) As MailAccount() Implements IMailServer.GetAccounts
Dim mailboxes As List(Of MailAccount) = New List(Of MailAccount)
Dim mailbox As New WebsitePanel.Providers.Mail.MailEnableMailbox
ResetMailbox(mailbox)
mailbox.Postoffice = domainName
mailbox.Size = -4 'we use -4 since this prevents the function from calculating quotas, which is slow
If mailbox.FindFirstMailbox() = 1 Then
Do
' add mailbox
Dim account As MailAccount = GetMailboxInfo(mailbox)
If (Not account.DeleteOnForward) Then
mailboxes.Add(account)
End If
ResetMailbox(mailbox)
mailbox.Postoffice = domainName
mailbox.Size = -4
Loop While mailbox.FindNextMailbox() = 1
End If
Return mailboxes.ToArray()
End Function
Public Overridable Function GetAccount(ByVal mailboxName As String) As MailAccount Implements IMailServer.GetAccount
Dim info As MailAccount = Nothing
Dim mailbox As New WebsitePanel.Providers.Mail.MailEnableMailbox
ResetMailbox(mailbox)
mailbox.Postoffice = GetDomainName(mailboxName)
mailbox.MailboxName = GetMailboxName(mailboxName)
If (mailbox.GetMailbox() <> 1) Then
Throw New Exception("Could not find the mailbox")
End If
info = GetMailboxInfo(mailbox)
' read autoresponder info
ReadMailboxAutoresponderFile(info)
Return info
End Function
Private Function GetMailboxInfo(ByVal mailbox As WebsitePanel.Providers.Mail.MailEnableMailbox) As MailAccount
Dim info As MailAccount = New MailAccount
info.MaxMailboxSize = IIf(mailbox.Limit = -1, 0, mailbox.Limit / 1024)
info.Name = mailbox.MailboxName + "@" + mailbox.Postoffice
Dim redirectAddrs As ArrayList = New ArrayList
Dim smtpAddress As String
For Each smtpAddress In mailbox.RedirectAddress.Split(";"c)
If (smtpAddress.Trim() <> String.Empty) Then
redirectAddrs.Add(GetEmailString(smtpAddress))
End If
Next
info.ForwardingAddresses = CType(redirectAddrs.ToArray(GetType(String)), String())
Dim st As Integer = mailbox.RedirectStatus
Dim ra As String = mailbox.RedirectAddress
'info.RedirectionActive = (mailbox.RedirectStatus > 0)
info.DeleteOnForward = (mailbox.RedirectStatus.Equals(1))
info.Enabled = (mailbox.Status = 1)
info.ResponderEnabled = mailbox.GetAutoResponderStatus()
info.ResponderMessage = mailbox.GetAutoResponderContents()
info.ReplyTo = GetMailBoxReplyToAddress(info.Name)
Dim map As New WebsitePanel.Providers.Mail.MailEnableAddressMap
map.Account = info.Name
map.DestinationAddress = String.Format("[SF:{0}/{1}]", info.Name, info.Name)
map.SourceAddress = ""
Dim login As New WebsitePanel.Providers.Mail.MailEnableLogin
ResetLogin(login)
login.Account = mailbox.Postoffice
login.UserName = info.Name
If (login.GetLogin() = 1) Then
info.Password = login.Password
'info.MailboxRights = CType([Enum].Parse(GetType(MailboxRights), login.Rights, True), MailboxRights)
End If
Return info
End Function
Private Function GetMailAliasInfo(ByVal mailbox As WebsitePanel.Providers.Mail.MailEnableMailbox) As MailAlias
Dim info As MailAlias = New MailAlias
info.Name = mailbox.MailboxName + "@" + mailbox.Postoffice
Dim redirectAddrs As ArrayList = New ArrayList
Dim smtpAddress As String
For Each smtpAddress In mailbox.RedirectAddress.Split(";"c)
If (smtpAddress.Trim() <> String.Empty) Then
redirectAddrs.Add(GetEmailString(smtpAddress))
End If
Next
info.ForwardingAddresses = CType(redirectAddrs.ToArray(GetType(String)), String())
If (Not (info.ForwardingAddresses Is Nothing) And info.ForwardingAddresses.Length > 0) Then
info.ForwardTo = info.ForwardingAddresses(0)
End If
Dim st As Integer = mailbox.RedirectStatus
Dim ra As String = mailbox.RedirectAddress
'info.RedirectionActive = (mailbox.RedirectStatus > 0)
info.DeleteOnForward = (mailbox.RedirectStatus.Equals(1))
info.Enabled = (mailbox.Status = 1)
Dim map As New WebsitePanel.Providers.Mail.MailEnableAddressMap
map.Account = info.Name
map.DestinationAddress = String.Format("[SF:{0}/{1}]", info.Name, info.Name)
map.SourceAddress = ""
Dim login As New WebsitePanel.Providers.Mail.MailEnableLogin
ResetLogin(login)
login.Account = mailbox.Postoffice
login.UserName = info.Name
If (login.GetLogin() = 1) Then
info.Password = login.Password
'info.MailboxRights = CType([Enum].Parse(GetType(MailboxRights), login.Rights, True), MailboxRights)
End If
Return info
End Function
Public Overridable Function AccountExists(ByVal mailboxName As String) As Boolean Implements IMailServer.AccountExists
Dim mailbox As New WebsitePanel.Providers.Mail.MailEnableMailbox
ResetMailbox(mailbox)
mailbox.Postoffice = GetDomainName(mailboxName)
mailbox.MailboxName = GetMailboxName(mailboxName)
Return (mailbox.GetMailbox() = 1)
End Function
Public Overridable Sub CreateAccount(ByVal info As MailAccount) Implements IMailServer.CreateAccount
Dim mailbox As New WebsitePanel.Providers.Mail.MailEnableMailbox
Dim domainName As String = GetDomainName(info.Name)
Dim mailboxName As String = GetMailboxName(info.Name)
mailbox.Postoffice = domainName
mailbox.Limit = IIf(info.MaxMailboxSize = 0, -1, info.MaxMailboxSize * 1024) ' convert to kilobytes
mailbox.MailboxName = GetMailboxName(info.Name)
If info.ForwardingAddresses Is Nothing Then
info.ForwardingAddresses = New String() {}
End If
Dim sbAddresses As StringBuilder = New StringBuilder
Dim address As String
For Each address In info.ForwardingAddresses
sbAddresses.AppendFormat("[SMTP:{0}];", address)
Next
Dim redirectAddrs As String = sbAddresses.ToString()
If redirectAddrs.Length > 0 Then
redirectAddrs = redirectAddrs.Substring(0, redirectAddrs.Length - 1)
End If
mailbox.RedirectAddress = redirectAddrs
Dim redirectStatus As Integer = 0
If (Not (info.ForwardingAddresses Is Nothing) And info.ForwardingAddresses.Length > 0) Then
redirectStatus = 1
If (Not info.DeleteOnForward) Then
redirectStatus = redirectStatus + 1
End If
End If
mailbox.RedirectStatus = redirectStatus
mailbox.Status = IIf(info.Enabled, 1, 0)
If (mailbox.AddMailbox() <> 1) Then
Throw New Exception(" ' AddMailbox ' method Returned 0 ")
End If
mailbox.SetAutoResponderStatus(info.ResponderEnabled)
mailbox.SetAutoResponderContents("", info.ResponderMessage)
mailbox = Nothing
' create address maps for all domains
Dim destinationAddress As String = String.Format("[SF:{0}/{1}]", domainName, mailboxName)
CreateAddressMapsForAllDomains(domainName, mailboxName, destinationAddress)
' create login
Dim login As New WebsitePanel.Providers.Mail.MailEnableLogin
login.Account = domainName
login.Password = info.Password
login.Status = IIf(info.Enabled, 1, 0)
login.UserName = info.Name
login.Rights = "USER" ' info.MailboxRights.ToString()
If (login.AddLogin() <> 1) Then
Throw New Exception("AddLogin method Returned 0 ")
End If
' change mailbox in order to set autoresponder
UpdateAccount(info)
End Sub
Public Overridable Sub UpdateAccount(ByVal info As MailAccount) Implements IMailServer.UpdateAccount
' change mailbox
Dim domainName As String = GetDomainName(info.Name)
Dim mailboxName As String = GetMailboxName(info.Name)
Dim mailbox As New WebsitePanel.Providers.Mail.MailEnableMailbox
mailbox.Postoffice = domainName
mailbox.MailboxName = mailboxName
If info.ForwardingAddresses Is Nothing Then
info.ForwardingAddresses = New String() {}
End If
If (mailbox.GetMailbox() <> 1) Then
Throw New Exception("Can't find specified mailboxNot ")
End If
Dim sbAddresses As StringBuilder = New StringBuilder
Dim address As String
For Each address In info.ForwardingAddresses
sbAddresses.AppendFormat("[SMTP:{0}];", address)
Next
Dim redirectAddrs As String = sbAddresses.ToString()
If redirectAddrs.Length > 0 Then
redirectAddrs = redirectAddrs.Substring(0, redirectAddrs.Length - 1)
End If
Dim redirectStatus As Integer = 0
If (Not (info.ForwardingAddresses Is Nothing) And info.ForwardingAddresses.Length > 0) Then
redirectStatus = 1
If (Not info.DeleteOnForward) Then
redirectStatus = redirectStatus + 1
End If
End If
mailbox.EditMailbox(domainName, _
mailboxName, _
redirectAddrs, _
redirectStatus, _
IIf(info.Enabled, 1, 0), _
IIf(info.MaxMailboxSize = 0, -1, info.MaxMailboxSize * 1024), _
0)
If (String.IsNullOrEmpty(info.ReplyTo) = False) Then
SetMailBoxReplyToAddress(info.Name, info.ReplyTo)
Else
SetMailBoxReplyToAddress(info.Name, "")
End If
mailbox.SetAutoResponderStatus(info.ResponderEnabled)
mailbox.SetAutoResponderContents("", info.ResponderMessage)
mailbox = Nothing
'mail Alias random password
If (String.IsNullOrEmpty(info.Password)) Then
info.Password = Guid.NewGuid().ToString("N").Substring(0, 12)
End If
' change login password
If (info.Password.Length > 0) Then
Dim login As New WebsitePanel.Providers.Mail.MailEnableLogin
ResetLogin(login)
login.Account = domainName
login.UserName = info.Name
If (login.GetLogin() <> 1) Then
Throw New Exception("Can't find specified loginNot ")
End If
login.EditLogin(login.UserName, _
IIf(info.Enabled, 1, 0), _
info.Password, _
domainName, _
"", _
0, 0, 0, "USER") ' USER | ADMIN | SYSADMIN
End If
' build autoresponder file
WriteMailboxAutoresponderFile(info)
End Sub
Public Overridable Sub DeleteAccount(ByVal name As String) Implements IMailServer.DeleteAccount
Dim domainName As String = GetDomainName(name)
Dim mailboxName As String = GetMailboxName(name)
Dim mailbox As New WebsitePanel.Providers.Mail.MailEnableMailbox
ResetMailbox(mailbox)
mailbox.Postoffice = domainName
mailbox.MailboxName = mailboxName
If (mailbox.RemoveMailbox() <> 1) Then
Throw New Exception(String.Format("Could not delete mailbox '{0}'", mailboxName))
End If
'delete the login for this mailbox
Dim login As New WebsitePanel.Providers.Mail.MailEnableLogin
ResetLogin(login)
login.Account = domainName
login.UserName = name
If (login.RemoveLogin() <> 1) Then
Throw New Exception(String.Format("Could not delete login '{0}'", name))
End If
'delete the address map for this mailbox
Dim map As New WebsitePanel.Providers.Mail.MailEnableAddressMap
ResetAddressMap(map)
map.Account = domainName
map.DestinationAddress = String.Format("[SF:{0}/{1}]", domainName, mailboxName)
map.RemoveAddressMap()
' delete account folder
DeleteMailBoxDirectory(name)
End Sub
Public Function MailAliasExists(ByVal mailAliasName As String) As Boolean Implements IMailServer.MailAliasExists
Return AccountExists(mailAliasName)
End Function
Public Function GetMailAliases(ByVal domainName As String) As MailAlias() Implements IMailServer.GetMailAliases
Dim mailAliases As List(Of MailAlias) = New List(Of MailAlias)
Dim mailbox As New WebsitePanel.Providers.Mail.MailEnableMailbox
ResetMailbox(mailbox)
mailbox.Postoffice = domainName
mailbox.Size = -4
If mailbox.FindFirstMailbox() = 1 Then
Do
Dim mailAlias As MailAlias = GetMailAliasInfo(mailbox)
If (mailAlias.DeleteOnForward) Then
mailAliases.Add(mailAlias)
End If
ResetMailbox(mailbox)
mailbox.Postoffice = domainName
mailbox.Size = -4
Loop While mailbox.FindNextMailbox() = 1
End If
Return mailAliases.ToArray()
End Function
Public Function GetMailAlias(ByVal mailAliasName As String) As MailAlias Implements IMailServer.GetMailAlias
Dim info As MailAlias = Nothing
Dim mailAlias As New WebsitePanel.Providers.Mail.MailEnableMailbox
ResetMailbox(mailAlias)
mailAlias.Postoffice = GetDomainName(mailAliasName)
mailAlias.MailboxName = GetMailboxName(mailAliasName)
If (mailAlias.GetMailbox() <> 1) Then
Throw New Exception("Could not find the mailbox")
End If
info = GetMailAliasInfo(mailAlias)
' read autoresponder info
'ReadMailboxAutoresponderFile(info)
Return info
End Function
Public Sub CreateMailAlias(ByVal mailAlias As MailAlias) Implements IMailServer.CreateMailAlias
CreateAccount(mailAlias)
End Sub
Public Sub UpdateMailAlias(ByVal mailAlias As MailAlias) Implements IMailServer.UpdateMailAlias
UpdateAccount(mailAlias)
End Sub
Public Sub DeleteMailAlias(ByVal mailAliasName As String) Implements IMailServer.DeleteMailAlias
DeleteAccount(mailAliasName)
End Sub
#End Region
#Region "Groups"
' ============================
' GROUPS
' ============================
Public Overridable Function GroupExists(ByVal groupName As String) As Boolean Implements IMailServer.GroupExists
Dim group As New WebsitePanel.Providers.Mail.MailEnableGroup
ResetGroup(group)
group.Postoffice = GetDomainName(groupName)
group.GroupName = GetMailboxName(groupName)
Return (group.GetGroup() = 1)
End Function
Public Overridable Function GetGroup(ByVal groupName As String) As MailGroup Implements IMailServer.GetGroup
Dim objGroup As New WebsitePanel.Providers.Mail.MailEnableGroup
ResetGroup(objGroup)
objGroup.Postoffice = GetDomainName(groupName)
objGroup.GroupName = GetMailboxName(groupName)
If (objGroup.GetGroup() = 1) Then
Return GetGroupInfo(objGroup)
End If
Return Nothing
End Function
Public Overridable Function GetGroups(ByVal domainName As String) As MailGroup() Implements IMailServer.GetGroups
Dim groups As List(Of MailGroup) = New List(Of MailGroup)
Dim objGroup As New WebsitePanel.Providers.Mail.MailEnableGroup
ResetGroup(objGroup)
objGroup.Postoffice = domainName
If objGroup.FindFirstGroup() = 1 Then
Do
' add group
groups.Add(GetGroupInfo(objGroup))
ResetGroup(objGroup)
objGroup.Postoffice = domainName
Loop While objGroup.FindNextGroup() = 1
End If
Return groups.ToArray()
End Function
Public Overridable Sub CreateGroup(ByVal group As MailGroup) Implements IMailServer.CreateGroup
Dim domainName As String = GetDomainName(group.Name)
Dim groupName As String = GetMailboxName(group.Name)
' process parameters
If group.Members Is Nothing Then
group.Members = New String() {}
End If
Dim objGroup As New WebsitePanel.Providers.Mail.MailEnableGroup
ResetGroup(objGroup)
objGroup.Postoffice = domainName
objGroup.GroupName = groupName
objGroup.RecipientAddress = String.Format("[SF:{0}/{1}]", domainName, groupName)
objGroup.GroupStatus = IIf(group.Enabled, 1, 0)
If (objGroup.AddGroup() = 1) Then
' add address maps
CreateAddressMapsForAllDomains(domainName, groupName, objGroup.RecipientAddress)
' add group members
Dim member As String
For Each member In group.Members
Dim groupMember As New WebsitePanel.Providers.Mail.MailEnableGroupMember
groupMember.Postoffice = domainName
groupMember.Address = String.Format("[SMTP:{0}]", member)
groupMember.Mailbox = groupName
If (groupMember.AddGroupMember() <> 1) Then
Throw New Exception("Group member creation failed")
End If
Next
End If
End Sub
Public Overridable Sub UpdateGroup(ByVal group As MailGroup) Implements IMailServer.UpdateGroup
Dim domainName As String = GetDomainName(group.Name)
Dim groupName As String = GetMailboxName(group.Name)
' process parameters
If group.Members Is Nothing Then
group.Members = New String() {}
End If
Dim objGroup As New WebsitePanel.Providers.Mail.MailEnableGroup
ResetGroup(objGroup)
objGroup.Postoffice = domainName
objGroup.GroupName = groupName
If (objGroup.GetGroup() <> 1) Then
Throw New Exception("Can't find specified group")
End If
objGroup.EditGroup( _
String.Format("[SF:{0}/{1}]", domainName, groupName), _
domainName, _
groupName, _
"", _
IIf(group.Enabled, 1, 0))
'delete group members
Dim objMember As New WebsitePanel.Providers.Mail.MailEnableGroupMember
objMember.Postoffice = domainName
objMember.Mailbox = groupName
objMember.Address = ""
objMember.RemoveGroupMember()
' add group members
Dim member As String
For Each member In group.Members
Dim groupMember As New WebsitePanel.Providers.Mail.MailEnableGroupMember
groupMember.Postoffice = domainName
groupMember.Address = String.Format("[SMTP:{0}]", member)
groupMember.Mailbox = groupName
If (groupMember.AddGroupMember() <> 1) Then
Throw New Exception("Group member creation failed")
End If
Next
End Sub
Public Overridable Sub DeleteGroup(ByVal name As String) Implements IMailServer.DeleteGroup
Dim domainName As String = GetDomainName(name)
Dim groupName As String = GetMailboxName(name)
' remove group
Dim objGroup As New WebsitePanel.Providers.Mail.MailEnableGroup
ResetGroup(objGroup)
objGroup.Postoffice = domainName
objGroup.GroupName = groupName
objGroup.RemoveGroup()
'delete group members
Dim objMember As New WebsitePanel.Providers.Mail.MailEnableGroupMember
objMember.Postoffice = domainName
objMember.Mailbox = groupName
objMember.Address = ""
objMember.RemoveGroupMember()
' delete address maps
Dim map As New WebsitePanel.Providers.Mail.MailEnableAddressMap
ResetAddressMap(map)
map.Account = domainName
map.DestinationAddress = String.Format("[SF:{0}/{1}]", domainName, groupName)
map.RemoveAddressMap()
End Sub
#End Region
#Region "Lists"
Public Overridable Function GetList(ByVal maillistName As String) As MailList Implements IMailServer.GetList
Dim mailList As New WebsitePanel.Providers.Mail.MailEnableList
ResetMaillist(mailList)
mailList.AccountName = GetDomainName(maillistName)
mailList.ListName = GetMailboxName(maillistName)
If (mailList.GetList() = 1) Then
Return GetMaillistInfo(mailList)
End If
Return Nothing
End Function
Public Overridable Function GetLists(ByVal domainName As String) As MailList() Implements IMailServer.GetLists
Dim maillists As List(Of MailList) = New List(Of MailList)
Try
Dim mailList As New WebsitePanel.Providers.Mail.MailEnableList
ResetMaillist(mailList)
mailList.AccountName = domainName
If mailList.FindFirstList() = 1 Then
Do
' add mailist
maillists.Add(GetMaillistInfo(mailList))
ResetMaillist(mailList)
mailList.AccountName = domainName
Loop While mailList.FindNextList() = 1
End If
Catch ex As Exception
Throw New Exception("Can't get domain maillists", ex)
End Try
Return maillists.ToArray()
End Function
Private Function GetMaillistInfo(ByVal mailList As Object) As MailList
Dim info As MailList = New MailList
info.Name = mailList.ListName + "@" + mailList.AccountName
info.Description = mailList.Description
info.Enabled = (mailList.ListStatus = 1)
info.Moderated = (mailList.ListType = 1)
info.ModeratorAddress = GetEmailString(mailList.ModeratorAddress)
info.Password = mailList.Password
info.PostingMode = CType(mailList.PostingMode, PostingMode)
info.ReplyToMode = CType(mailList.ReplyToMode, ReplyTo)
info.PrefixOption = CType(mailList.SubjectPrefixStatus, PrefixOption)
info.SubjectPrefix = mailList.SubjectPrefix
info.AttachHeader = mailList.HeaderAnnotationStatus
info.AttachFooter = mailList.FooterAnnotationStatus
info.TextHeader = GetMailListHeaderFooter(mailList.ListName, mailList.AccountName, 1)
info.TextFooter = GetMailListHeaderFooter(mailList.ListName, mailList.AccountName, 2)
info.HtmlHeader = GetMailListHeaderFooter(mailList.ListName, mailList.AccountName, 3)
info.HtmlFooter = GetMailListHeaderFooter(mailList.ListName, mailList.AccountName, 4)
'retrieve maillist members
Dim listMembers As ArrayList = GetMailListMembers(info.Name)
info.Members = CType(listMembers.ToArray(GetType(String)), String())
ResetMaillist(mailList)
Return info
End Function
Private Function GetMailListMembers(ByVal name As String) As ArrayList
Dim members As ArrayList = New ArrayList
Dim domainName As String = GetDomainName(name)
Dim mailListName As String = GetMailboxName(name)
Dim listMember As New WebsitePanel.Providers.Mail.MailEnableListMember
listMember.AccountName = domainName
listMember.ListName = mailListName
listMember.Address = ""
listMember.Host = ""
listMember.ListMemberType = -1
listMember.Status = -1
If listMember.FindFirstListMember() = 1 Then
Do
' add member
members.Add(GetEmailString(listMember.Address))
' reset list member
listMember.AccountName = domainName
listMember.ListName = mailListName
listMember.Address = ""
listMember.Host = ""
listMember.ListMemberType = -1
listMember.Status = -1
Loop While listMember.FindNextListMember() = 1
End If
Return members
End Function
Public Overridable Function ListExists(ByVal maillistName As String) As Boolean Implements IMailServer.ListExists
Dim mailList As New WebsitePanel.Providers.Mail.MailEnableList
ResetMaillist(mailList)
mailList.AccountName = GetDomainName(maillistName)
mailList.ListName = GetMailboxName(maillistName)
Return (mailList.GetList() = 1)
End Function
Public Overridable Sub CreateList(ByVal info As MailList) Implements IMailServer.CreateList
Dim domainName As String = GetDomainName(info.Name)
Dim maillistName As String = GetMailboxName(info.Name)
' process parameters
If info.Members Is Nothing Then
info.Members = New String() {}
End If
Dim mailList As New WebsitePanel.Providers.Mail.MailEnableList
ResetMaillist(mailList)
mailList.AccountName = domainName
mailList.ListName = maillistName
mailList.Description = info.Description
mailList.ListStatus = IIf(info.Enabled, 1, 0)
mailList.ListType = IIf(info.Moderated, 1, 0)
mailList.ListAddress = String.Format("[SMTP:{0}]", info.Name + "@" + domainName)
mailList.ModeratorAddress = String.Format("[SMTP:{0}]", info.ModeratorAddress)
mailList.Password = info.Password
mailList.PostingMode = CType(info.PostingMode, Int32)
mailList.ReplyToMode = CType(info.ReplyToMode, Int32)
mailList.SubjectPrefixStatus = CType(info.PrefixOption, Int32)
mailList.SubjectPrefix = info.SubjectPrefix
If (mailList.AddList() <> 1) Then
Throw New Exception("Mail list creation failed")
End If
' create address maps for all domains
Dim destinationAddress As String = String.Format("[LS:{0}/{1}]", domainName, maillistName)
CreateAddressMapsForAllDomains(domainName, maillistName, destinationAddress)
'create mail list members
Dim member As String
For Each member In info.Members
Dim listMember As New WebsitePanel.Providers.Mail.MailEnableListMember
listMember.AccountName = domainName
listMember.Address = String.Format("[SMTP:{0}]", member)
listMember.ListMemberType = 0
listMember.ListName = maillistName
listMember.Status = 1
If (listMember.AddListMember() <> 1) Then
Throw New Exception("List member creation failed")
End If
Next
'set Header and Footer for mail list
'SetMailListHeaderFooter(maillistName, domainName, info.Header, info.Footer)
End Sub
Public Overridable Sub UpdateList(ByVal info As MailList) Implements IMailServer.UpdateList
Dim domainName As String = GetDomainName(info.Name)
Dim maillistName As String = GetMailboxName(info.Name)
' process parameters
If info.Members Is Nothing Then
info.Members = New String() {}
End If
Dim mailList As New WebsitePanel.Providers.Mail.MailEnableList
ResetMaillist(mailList)
mailList.AccountName = domainName
mailList.ListName = maillistName
If (mailList.GetList() <> 1) Then
Throw New Exception("Can't find specified maillistNot ")
End If
mailList.EditList( _
info.Description, _
domainName, _
maillistName, _
IIf(info.Moderated, 1, 0), _
IIf(info.Enabled, 1, 0), _
info.AttachHeader, _
String.Empty, _
info.AttachFooter, _
String.Empty, _
String.Format("[SMTP:{0}]", info.ModeratorAddress), _
String.Format("[SMTP:{0}]", info.Name), _
0, _
String.Empty, _
0, _
String.Empty, _
0, _
String.Empty, _
CType(info.PrefixOption, Int32), _
info.SubjectPrefix, _
String.Empty, _
0, _
String.Empty, _
0, _
String.Empty, _
CType(info.ReplyToMode, Int32), _
-1, _
CType(info.PostingMode, Int32), _
-1, _
-1, _
info.Password, _
-1, _
String.Empty, _
-1, _
-1, _
-1, _
-1, _
-1, _
-1, _
-1)
'delete list members
Dim listMember As New WebsitePanel.Providers.Mail.MailEnableListMember
listMember.AccountName = domainName
listMember.ListName = maillistName
listMember.Address = ""
listMember.ListMemberType = -1
listMember.Status = -1
listMember.RemoveListMember()
'create mail list members
Dim member As String
For Each member In info.Members
listMember = New WebsitePanel.Providers.Mail.MailEnableListMember
listMember.AccountName = domainName
listMember.ListName = maillistName
listMember.Address = String.Format("[SMTP:{0}]", member)
listMember.ListMemberType = 0
listMember.Status = 1
If (listMember.AddListMember() <> 1) Then
Throw New Exception("List member creation failed")
End If
Next
'update Header and Footer for mail list
SetMailListHeaderFooter(maillistName, domainName, info.TextHeader, info.TextFooter, info.HtmlHeader, info.HtmlFooter)
End Sub
#End Region
#Region "Private Helper methods"
Public Sub DeleteList(ByVal name As String) Implements IMailServer.DeleteList
Dim domainName As String = GetDomainName(name)
Dim maillistName As String = GetMailboxName(name)
' remove mailing list
Dim mailList As New WebsitePanel.Providers.Mail.MailEnableList
ResetMaillist(mailList)
mailList.ListName = maillistName
mailList.AccountName = domainName
mailList.RemoveList()
' delete list members
Dim listMember As New WebsitePanel.Providers.Mail.MailEnableListMember
listMember.AccountName = domainName
listMember.ListName = maillistName
listMember.Address = ""
listMember.Host = ""
listMember.ListMemberType = -1
listMember.Status = -1
listMember.RemoveListMember()
' delete address maps
Dim map As New WebsitePanel.Providers.Mail.MailEnableAddressMap
ResetAddressMap(map)
map.Account = domainName
map.DestinationAddress = String.Format("[LS:{0}/{1}]", domainName, maillistName)
map.RemoveAddressMap()
End Sub
Private Sub ResetDomain(ByVal domain As Object)
domain.AccountName = ""
domain.DomainName = ""
domain.DomainRedirectionHosts = ""
domain.Host = ""
domain.Status = -1
domain.DomainRedirectionStatus = -1
End Sub
Private Sub ResetAddressMap(ByVal map As Object)
map.Account = ""
map.DestinationAddress = ""
map.Host = ""
map.SourceAddress = ""
map.Scope = ""
End Sub
Private Sub ResetBlacklist(ByVal blacklist As Object)
blacklist.Account = ""
blacklist.TargetDomainName = ""
blacklist.BannedDomainName = ""
blacklist.Host = ""
blacklist.Status = -1
End Sub
Private Sub ResetLogin(ByVal login As Object)
login.Account = ""
login.UserName = ""
login.Description = ""
login.Host = ""
login.Password = ""
login.UserName = ""
login.LastAttempt = -1
login.LastSuccessfulLogin = -1
login.LoginAttempts = -1
login.Status = -1
End Sub
Private Sub ResetMailbox(ByVal mailbox As WebsitePanel.Providers.Mail.MailEnableMailbox)
mailbox.Postoffice = ""
mailbox.Host = ""
mailbox.MailboxName = ""
mailbox.RedirectAddress = ""
mailbox.Limit = -1
mailbox.RedirectStatus = -1
mailbox.Size = -1
mailbox.Status = -1
End Sub
Private Sub ResetMaillist(ByVal maillist As Object)
maillist.AccountName = ""
maillist.Description = ""
maillist.DigestMailbox = ""
maillist.FooterAnnotation = ""
maillist.HeaderAnnotation = ""
maillist.HelpMessageFile = ""
maillist.Host = ""
maillist.ListAddress = ""
maillist.ListName = ""
maillist.ModeratorAddress = ""
maillist.Owner = ""
maillist.Password = ""
maillist.RemovalMessageFile = ""
maillist.SubjectPrefix = ""
maillist.SubjectSuffix = ""
maillist.SubscribeMessageFile = ""
maillist.UnsubscribeMessageFile = ""
maillist.AuthenticationMode = -1
maillist.DigestAnnotationMode = -1
maillist.DigestAttachmentMode = -1
maillist.DigestMessageSeparationMode = -1
maillist.DigestMode = -1
maillist.DigestSchedulingInterval = -1
maillist.DigestSchedulingMode = -1
maillist.DigestSchedulingStatus = -1
maillist.FooterAnnotationStatus = -1
maillist.FromAddressMode = -1
maillist.HeaderAnnotationStatus = -1
maillist.HelpMessageFileStatus = -1
maillist.ListStatus = -1
maillist.ListType = -1
maillist.MaxMessageSize = -1
maillist.PostingMode = -1
maillist.RemovalMessageFileStatus = -1
maillist.ReplyToMode = -1
maillist.SubjectPrefixStatus = -1
maillist.SubjectSuffixStatus = -1
maillist.SubscribeMessageFileStatus = -1
maillist.SubScriptionMode = -1
maillist.UnsubscribeMessageFileStatus = -1
End Sub
Private Sub ResetGroup(ByVal group As Object)
group.Postoffice = ""
group.RecipientAddress = ""
group.GroupName = ""
group.GroupStatus = -1
End Sub
Private Function GetGroupInfo(ByVal objGroup As Object) As MailGroup
Dim group As MailGroup = New MailGroup
group.Name = objGroup.GroupName + "@" + objGroup.Postoffice
group.Enabled = (objGroup.GroupStatus = 1)
' retrieve group members
Dim members As ArrayList = GetGroupMembers(group.Name)
group.Members = CType(members.ToArray(GetType(String)), String())
Return group
End Function
Private Function GetGroupMembers(ByVal name As String) As ArrayList
Dim members As ArrayList = New ArrayList
Dim domainName As String = GetDomainName(name)
Dim groupName As String = GetMailboxName(name)
Dim groupMember As New WebsitePanel.Providers.Mail.MailEnableGroupMember
groupMember.Postoffice = domainName
groupMember.Mailbox = groupName
groupMember.Address = ""
If groupMember.FindFirstGroupMember() = 1 Then
Do
' add member
members.Add(GetEmailString(groupMember.Address))
' reset group member
groupMember.Postoffice = domainName
groupMember.Mailbox = groupName
groupMember.Address = ""
Loop While groupMember.FindNextGroupMember() = 1
End If
Return members
End Function
Private Sub CreateAddressMapsForAllDomains(ByVal domainName As String, ByVal aliasName As String, ByVal targetAddress As String)
Dim oDomain As New WebsitePanel.Providers.Mail.MailEnableDomain
Dim oAddressMap As New WebsitePanel.Providers.Mail.MailEnableAddressMap
oDomain.AccountName = domainName
oDomain.DomainName = ""
oDomain.Status = -1
oDomain.DomainRedirectionHosts = ""
oDomain.DomainRedirectionStatus = -1
If oDomain.FindFirstDomain = 1 Then
Do
Dim MappedAddress As String = "[SMTP:" & aliasName & "@" & oDomain.DomainName & "]"
oAddressMap.Account = domainName
oAddressMap.DestinationAddress = targetAddress
oAddressMap.SourceAddress = MappedAddress
oAddressMap.Scope = 0
If oAddressMap.AddAddressMap = 1 Then
'
' Address Map was added too
'
End If
oDomain.AccountName = domainName
oDomain.DomainName = ""
oDomain.Status = -1
oDomain.DomainRedirectionHosts = ""
oDomain.DomainRedirectionStatus = -1
Loop While (oDomain.FindNextDomain = 1)
End If
oDomain = Nothing
oAddressMap = Nothing
End Sub
Private Function GetEmailString(ByVal smtpEmailString As String) As String
If (smtpEmailString = "") Then
Return ""
End If
Dim ret As String = smtpEmailString.Remove(0, "[SMTP:".Length)
ret = ret.Remove(ret.Length - 1, 1)
Return ret
End Function
Private Function GetMailboxName(ByVal email As String) As String
If (email.IndexOf("@") = -1) Then
Return email
End If
Return email.Substring(0, email.IndexOf("@"))
End Function
Private Function GetDomainName(ByVal email As String) As String
Return email.Substring(email.IndexOf("@") + 1)
End Function
#End Region
#Region "HostingServiceProvider methods"
Public Overrides Sub ChangeServiceItemsState(ByVal items() As ServiceProviderItem, ByVal enabled As Boolean)
Dim item As ServiceProviderItem
For Each item In items
If TypeOf item Is MailDomain Then
Try
Dim domain As MailDomain = GetDomain(item.Name)
domain.Enabled = enabled
UpdateDomain(domain)
Catch ex As Exception
Log.WriteError(String.Format("Error switching '{0}' mail domain", item.Name), ex)
End Try
End If
Next
End Sub
Public Overrides Sub DeleteServiceItems(ByVal items() As ServiceProviderItem)
For Each item As ServiceProviderItem In items
If TypeOf item Is MailDomain Then
Try
DeleteDomain(item.Name)
Catch ex As Exception
Log.WriteError(String.Format("Error deleting '{0}' mail domain", item.Name), ex)
End Try
End If
Next
End Sub
Public Overrides Function GetServiceItemsDiskSpace(ByVal items() As ServiceProviderItem) As ServiceProviderItemDiskSpace()
Dim itemsDiskspace As List(Of ServiceProviderItemDiskSpace) = New List(Of ServiceProviderItemDiskSpace)
' update items with diskspace
Dim item As ServiceProviderItem
For Each item In items
If TypeOf item Is MailAccount Then
Try
' get mailbox size
Dim name As String = item.Name
' try to get MailEnable postoffices path
Dim poPath As String = GetPostofficesPath()
If poPath Is Nothing Then
Continue For
End If
Dim mailboxName As String = name.Substring(0, name.IndexOf("@"))
Dim domainName As String = name.Substring((name.IndexOf("@") + 1))
Dim mailboxPath As String = [String].Format("{0}\{1}\Mailroot\{2}", poPath, domainName, mailboxName)
' calculate disk space
Dim diskspace As New ServiceProviderItemDiskSpace()
diskspace.ItemId = item.Id
diskspace.DiskSpace = FileUtils.CalculateFolderSize(mailboxPath)
itemsDiskspace.Add(diskspace)
Catch ex As Exception
Log.WriteError("Error calculating disk space for mail account: " + item.Name, ex)
End Try
End If
Next item
Return itemsDiskspace.ToArray()
End Function
Public Overrides Function GetServiceItemsBandwidth(ByVal items() As ServiceProviderItem, ByVal since As Date) As ServiceProviderItemBandwidth()
Dim itemsBandwidth(items.Length) As ServiceProviderItemBandwidth
Dim logsPath As String = GetLoggingPath()
If logsPath Is Nothing Then
Return Nothing
End If
' calculate bandwidth for mail enable
' parse mail logs
Dim parser As New LogParser("Mail", "mailenable_pop", Path.Combine(logsPath, "pop"), "account")
parser.ParseLogs(Of LogReader)()
parser = New LogParser("Mail", "mailenable_smtp", Path.Combine(logsPath, "smtp"), "account")
parser.ParseLogs(Of MELogReader)()
' update items with diskspace
Dim i As Integer
For i = 0 To items.Length - 1
Dim item As ServiceProviderItem = items(i)
' create new bandwidth object
itemsBandwidth(i) = New ServiceProviderItemBandwidth()
itemsBandwidth(i).ItemId = item.Id
itemsBandwidth(i).Days = New DailyStatistics(0) {}
If TypeOf item Is MailDomain Then
Try
' get daily statistics
itemsBandwidth(i).Days = parser.GetDailyStatistics(since, New String() {item.Name})
Catch ex As Exception
Log.WriteError("Error calculating bandwidth for mail domain: " + item.Name, ex)
End Try
End If
Next i
Return itemsBandwidth
End Function
Private Sub DeleteMailBoxDirectory(ByVal name As String)
' try to get MailEnable postoffices path
Dim poPath As String = GetPostofficesPath()
If poPath Is Nothing Then
Return
End If
Dim mailboxName As String = name.Substring(0, name.IndexOf("@"))
Dim domainName As String = name.Substring((name.IndexOf("@") + 1))
Dim mailboxPath As String = [String].Format("{0}\{1}\Mailroot\{2}", poPath, domainName, mailboxName)
Try
FileUtils.DeleteFile(mailboxPath)
Catch
End Try
End Sub
Private Sub DeletePostofficeDirectory(ByVal domainName As String)
' try to get MailEnable postoffices path
Dim poPath As String = GetPostofficesPath()
If poPath Is Nothing Then
Return
End If
Dim postofficePath As String = [String].Format("{0}\{1}", poPath, domainName)
Try
FileUtils.DeleteFile(postofficePath)
Catch
End Try
End Sub
Private Sub ReadMailboxAutoresponderFile(ByVal mailbox As MailAccount)
' try to get MailEnable postoffices path
Dim poPath As String = GetPostofficesPath()
If poPath Is Nothing Then
Return
End If
Dim mailboxName As String = mailbox.Name.Substring(0, mailbox.Name.IndexOf("@"))
Dim domainName As String = mailbox.Name.Substring((mailbox.Name.IndexOf("@") + 1))
' build autoresponder path
Dim responderPath As String = [String].Format("{0}\{1}\Mailroot\{2}\AUTORESPOND", poPath, domainName, mailboxName)
' read responder configuration file
Dim respFile As String = responderPath + ".CF_"
If Not File.Exists(respFile) Then
Return
End If
Dim reader As New StreamReader(respFile)
Dim content As String = reader.ReadToEnd()
reader.Close()
' parse configuration file
Dim subjectToken As String = "Subject: "
Dim replyToken As String = "Reply-To: "
Dim idx As Integer = content.IndexOf(subjectToken, 0)
If idx <> -1 Then
' extract subject line
mailbox.ResponderSubject = content.Substring(idx + subjectToken.Length, content.IndexOf(ControlChars.Lf, idx) - (idx + subjectToken.Length + 1))
End If
idx = content.IndexOf(replyToken, 0)
If idx <> -1 Then
' extract reply-to line
mailbox.ReplyTo = content.Substring(idx + replyToken.Length + 1, content.IndexOf(ControlChars.Lf, idx) - (idx + replyToken.Length + 3))
End If
End Sub
Private Sub WriteMailboxAutoresponderFile(ByVal mailbox As MailAccount)
' try to get MailEnable postoffices path
Dim poPath As String = GetPostofficesPath()
If poPath Is Nothing Then
Return
End If
Dim mailboxName As String = mailbox.Name.Substring(0, mailbox.Name.IndexOf("@"))
Dim domainName As String = mailbox.Name.Substring((mailbox.Name.IndexOf("@") + 1))
' build autoresponder path
Dim responderPath As String = [String].Format("{0}\{1}\Mailroot\{2}\AUTORESPOND", poPath, domainName, mailboxName)
Dim responderContent As String = [String].Format("From: ""{0}"" <{1}>" & vbCrLf & _
"Subject: {2}" & vbCrLf & _
"Reply-To: <{3}>" & vbCrLf & _
"Return-Path: <{4}>" & vbCrLf & vbCrLf & _
"{5}", mailbox.Name, mailbox.Name, mailbox.ResponderSubject, mailbox.ReplyTo, mailbox.ReplyTo, mailbox.ResponderMessage)
' write file
Dim writer As New StreamWriter(responderPath + ".CF_")
writer.Write(responderContent)
writer.Close()
If mailbox.ResponderEnabled Then
' write actual responder file
writer = New StreamWriter(responderPath + ".CFG")
writer.Write(responderContent)
writer.Close()
End If
End Sub
Private Sub SetMailBoxReplyToAddress(ByVal mailbox As String, ByVal replyToAddress As String)
Dim oMEAOSO As New WebsitePanel.Providers.Mail.MailEnableOption
With oMEAOSO
.Scope = 2
.Query = GetDomainName(mailbox) & "/" & GetMailboxName(mailbox)
.ValueName = "ReplyAddress"
.Value = replyToAddress
.SetOption()
End With
End Sub
Private Function GetMailBoxReplyToAddress(ByVal mailbox As String)
Dim oMEAOSO As New WebsitePanel.Providers.Mail.MailEnableOption
With oMEAOSO
.Scope = 2
.Query = GetDomainName(mailbox) & "/" & GetMailboxName(mailbox)
.ValueName = "ReplyAddress"
.GetOption()
Return .Value
End With
End Function
Function GetMailEnableRegistryItem(item As String) As String
Dim key As RegistryKey
If IntPtr.Size > 4 Then
key = Registry.LocalMachine.OpenSubKey("SOFTWARE\Wow6432Node\Mail Enable\Mail Enable")
Else
key = Registry.LocalMachine.OpenSubKey("SOFTWARE\Mail Enable\Mail Enable")
End If
Return CStr(key.GetValue(item))
End Function
Shared Function GetPostofficesPath() As String
Dim oLocal As New MailEnable
Return oLocal.GetMailEnableRegistryItem("Mail Root")
End Function
Private Function GetInstallPath() As String
Return GetMailEnableRegistryItem("Program Directory")
End Function
Private Sub SetMailListHeaderFooter(ByVal listname As String, ByVal postofficeName As String, ByVal headerText As String, ByVal footerText As String, ByVal headerHtml As String, ByVal footerHtml As String)
Dim headerTextPath As String = Path.Combine(GetAnnotationPath(postofficeName), String.Format("{0}-HEADER.txt", listname))
Dim footerTextPath As String = Path.Combine(GetAnnotationPath(postofficeName), String.Format("{0}-FOOTER.txt", listname))
Dim headerHtmlPath As String = Path.Combine(GetAnnotationPath(postofficeName), String.Format("{0}-HEADER.htm", listname))
Dim footerHtmlPath As String = Path.Combine(GetAnnotationPath(postofficeName), String.Format("{0}-FOOTER.htm", listname))
'write Header/Footer for plain text messages
If File.Exists(headerTextPath) And [String].IsNullOrEmpty(headerText) Then
File.Delete(headerTextPath)
ElseIf Not File.Exists(headerTextPath) Then
Dim oWrite As StreamWriter = File.CreateText(headerTextPath)
oWrite.Write(headerText)
oWrite.Close()
Else
Dim textFileStream As New IO.FileStream(headerTextPath, IO.FileMode.OpenOrCreate, IO.FileAccess.ReadWrite, IO.FileShare.None)
Dim myFileWriter As New IO.StreamWriter(textFileStream)
myFileWriter.Write(headerText)
myFileWriter.Close()
End If
If File.Exists(footerTextPath) And [String].IsNullOrEmpty(footerText) Then
File.Delete(footerTextPath)
ElseIf Not File.Exists(headerTextPath) Then
Dim oWrite As StreamWriter = File.CreateText(footerTextPath)
oWrite.Write(footerText)
oWrite.Close()
Else
Dim textFileStream As New IO.FileStream(footerTextPath, IO.FileMode.OpenOrCreate, IO.FileAccess.ReadWrite, IO.FileShare.None)
Dim myFileWriter As New IO.StreamWriter(textFileStream)
myFileWriter.Write(footerText)
myFileWriter.Close()
End If
'write Header/Footer for HTML messages
If File.Exists(headerHtmlPath) And [String].IsNullOrEmpty(headerHtml) Then
File.Delete(headerHtmlPath)
ElseIf Not File.Exists(headerHtmlPath) Then
Dim oWrite As StreamWriter = File.CreateText(headerHtmlPath)
oWrite.Write(headerHtml)
oWrite.Close()
Else
Dim textFileStream As New IO.FileStream(headerHtmlPath, IO.FileMode.OpenOrCreate, IO.FileAccess.ReadWrite, IO.FileShare.None)
Dim myFileWriter As New IO.StreamWriter(textFileStream)
myFileWriter.Write(headerHtml)
myFileWriter.Close()
End If
If File.Exists(footerHtmlPath) And [String].IsNullOrEmpty(footerHtml) Then
File.Delete(footerHtmlPath)
ElseIf Not File.Exists(headerHtmlPath) Then
Dim oWrite As StreamWriter = File.CreateText(footerHtmlPath)
oWrite.Write(footerHtml)
oWrite.Close()
Else
Dim textFileStream As New IO.FileStream(footerHtmlPath, IO.FileMode.OpenOrCreate, IO.FileAccess.ReadWrite, IO.FileShare.None)
Dim myFileWriter As New IO.StreamWriter(textFileStream)
myFileWriter.Write(footerHtml)
myFileWriter.Close()
End If
End Sub
Private Function GetMailListHeaderFooter(ByVal listname As String, ByVal postofficeName As String, ByVal type As Integer) As String
'type 1 - headerText
'type 2 - footerText
'type 3 - headerHtml
'type 4 - footerHtml
Dim filepath As String = String.Empty
Dim data As String = String.Empty
If type.Equals(1) Then
filepath = Path.Combine(GetAnnotationPath(postofficeName), String.Format("{0}-HEADER.txt", listname))
ElseIf type.Equals(2) Then
filepath = Path.Combine(GetAnnotationPath(postofficeName), String.Format("{0}-FOOTER.txt", listname))
End If
If type.Equals(3) Then
filepath = Path.Combine(GetAnnotationPath(postofficeName), String.Format("{0}-HEADER.htm", listname))
ElseIf type.Equals(4) Then
filepath = Path.Combine(GetAnnotationPath(postofficeName), String.Format("{0}-FOOTER.htm", listname))
End If
If File.Exists(filepath) Then
Dim textFileStream As New IO.FileStream(filepath, IO.FileMode.OpenOrCreate, IO.FileAccess.ReadWrite, IO.FileShare.None)
Dim myFileReader As New IO.StreamReader(textFileStream)
data = myFileReader.ReadToEnd()
myFileReader.Close()
Else
Return data
End If
Return data
End Function
Private Function GetAnnotationPath(ByVal postOfficeName As String) As String
'the annotation paths are in the configuration directory
Dim programPath As String = ""
Dim key As RegistryKey
If IntPtr.Size > 4 Then
key = Registry.LocalMachine.OpenSubKey("SOFTWARE\Wow6432Node\Mail Enable\Mail Enable")
Else
key = Registry.LocalMachine.OpenSubKey("SOFTWARE\Mail Enable\Mail Enable")
End If
If (key Is Nothing) Then
Return String.Empty
Else
programPath = CStr(key.GetValue("Configuration Directory"))
Return Path.Combine(programPath, String.Format("Postoffices\{0}\ANNOTATIONS", postOfficeName))
End If
End Function
Private Function NonCString(ByVal InString As String) As String
Dim NTPos As Integer
NTPos = InStr(1, InString, Chr(0), CompareMethod.Binary)
If NTPos > 0 Then
NonCString = Left(InString, NTPos - 1)
Else
NonCString = InString
End If
End Function
Private Function CString(ByVal InString As String) As String
CString = InString & Chr(0)
End Function
Private Function GetLoggingPath() As String
Dim programPath As String = ""
Dim key As RegistryKey
If IntPtr.Size > 4 Then
key = Registry.LocalMachine.OpenSubKey("SOFTWARE\Wow6432Node\Mail Enable\Mail Enable")
Else
key = Registry.LocalMachine.OpenSubKey("SOFTWARE\Mail Enable\Mail Enable")
End If
If (key Is Nothing) Then
Return String.Empty
Else
Return CStr(key.GetValue("W3C Logging Directory"))
End If
End Function
#End Region
Public Overrides Function IsInstalled() As Boolean
Dim version As String = ""
Dim key As RegistryKey
If IntPtr.Size > 4 Then
key = Registry.LocalMachine.OpenSubKey("SOFTWARE\Wow6432Node\Mail Enable\Mail Enable")
Else
key = Registry.LocalMachine.OpenSubKey("SOFTWARE\Mail Enable\Mail Enable")
End If
version = CStr(key.GetValue("Enterprise Version"))
If (version Is Nothing) Then
version = CStr(key.GetValue("Version"))
If (version Is Nothing Or version.Equals("0")) Then
version = CStr(key.GetValue("Professional Version"))
End If
End If
If [String].IsNullOrEmpty(version) = False Then
Dim split As String() = version.Split(New [Char]() {"."c})
Return split(0).Equals("1") Or split(0).Equals("2") Or split(0).Equals("3") Or split(0).Equals("4") Or split(0).Equals("5") Or split(0).Equals("6")
Else
Return False
End If
End Function
End Class