Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
59 commits
Select commit Hold shift + click to select a range
3b1698b
refactor: generate `config.json`
s-aga-r May 5, 2026
c107ce9
refactor: remove `Mail Cluster Trace`
s-aga-r May 5, 2026
c0337e6
refactor: remove `Mail Cluster Store`
s-aga-r May 5, 2026
b1f2cbe
refactor: Mail Server
s-aga-r May 5, 2026
320f778
refactor: remove `Server Config`
s-aga-r May 5, 2026
0e2c12e
chore: install latest version of stalwart-cli
s-aga-r May 6, 2026
f44caea
refactor: remove `Message Queue`
s-aga-r May 6, 2026
01c9783
refactor: remove `Allowed IP` and `Blocked IP`
s-aga-r May 6, 2026
cd80174
refactor: remove `DMARC Report`
s-aga-r May 6, 2026
f871bd7
refactor: server deployment
s-aga-r May 5, 2026
7b0ea66
feat: Mail Cluster Store
s-aga-r May 8, 2026
941641a
fix: validate stores
s-aga-r May 11, 2026
e377557
chore: add support for Default and Sharded stores
s-aga-r May 11, 2026
c9c0e37
feat: template for Blob stores
s-aga-r May 11, 2026
9915163
feat: template for Search stores
s-aga-r May 11, 2026
0afe28d
feat: template for In-Memory stores
s-aga-r May 11, 2026
b1f5f6a
chore: `ignore_links_on_delete`
s-aga-r May 12, 2026
f74f3e3
refactor: remove API Key from Mail Cluster
s-aga-r May 12, 2026
64f4b84
feat: `StalwartCLI`
s-aga-r May 12, 2026
398079f
feat: Domain and Account services
s-aga-r May 12, 2026
97f1f0c
Merge branch 'develop' into stalwart-0.16.x
s-aga-r May 13, 2026
dbfb38f
fix: remove composite index from Mail Server
s-aga-r May 13, 2026
c7097fb
fix: auto-create User Settings after User insert
s-aga-r May 13, 2026
22d6925
refactor: move spamd settings to mail config
s-aga-r May 13, 2026
93aed17
chore: prefer Mail Settings over global conf
s-aga-r May 13, 2026
f08f754
chore: option to destroy data & blob store from Mail Settings
s-aga-r May 13, 2026
fbb93b3
fix: manually invalidate Mail Settings document cache
s-aga-r May 13, 2026
e70c69f
chore: auth stalwart-cli with api-key
s-aga-r May 13, 2026
efb6b1c
refactor: remove Mail Data Exchange
s-aga-r May 13, 2026
68334dc
refactor: signup domains
s-aga-r May 14, 2026
6d73a8a
fix: signup flow
s-aga-r May 14, 2026
b278e67
fix: generate app password
s-aga-r May 14, 2026
8d74725
fix: do not show server error directly to the user
s-aga-r May 15, 2026
d1af529
fix: update password on stalwart when user updates their password
s-aga-r May 15, 2026
6147315
Merge branch 'develop' into stalwart-0.16.x
s-aga-r May 15, 2026
d936616
fix: use `Server URL` from config
s-aga-r May 15, 2026
782261c
fix: delete account from stalwart
s-aga-r May 15, 2026
7609588
fix: sync account settings
s-aga-r May 18, 2026
1f7dcc9
refactor: `UsersView`
s-aga-r May 18, 2026
418c8cd
fix: do not explicit validate the domain and account
s-aga-r May 18, 2026
d8877e9
refactor: Invite
s-aga-r May 18, 2026
2d132bb
patch: configure mail settings
s-aga-r May 19, 2026
c1b4396
refactor: hide `Mailing List`
s-aga-r May 19, 2026
6da8ea5
Merge branch 'develop' into stalwart-0.16.x
s-aga-r May 19, 2026
e3f99bc
fix: refactor Domains
s-aga-r May 19, 2026
3aaa11a
refactor: remove `Mail Domain Request`, `Principal` and `Principal Se…
s-aga-r May 19, 2026
0b4f22e
fix: parse secret from cli response
s-aga-r May 21, 2026
d150180
refactor: Add Domain
s-aga-r May 21, 2026
89cb522
feat: download DNS .zone, .csv and .json file
s-aga-r May 21, 2026
f3c8814
chore: set description when adding domain
s-aga-r May 21, 2026
6aea9de
refactor: remove deprecated patches
s-aga-r May 21, 2026
ceb2dec
chore: make MX record non-mandatory
s-aga-r May 22, 2026
e1ab939
Merge branch 'develop' into stalwart-0.16.x
s-aga-r May 22, 2026
15b1c7e
patch: configure mail cluster & server
s-aga-r May 22, 2026
5ed234e
chore: generate pot file
s-aga-r May 22, 2026
e0d98fa
chore: initialize the data store
s-aga-r May 22, 2026
827fa6f
fix: handle missing ansible in host machine
s-aga-r May 23, 2026
34b08e3
refactor: do not use API Key for Stalwart authentication
s-aga-r May 26, 2026
070adc7
chore: impersonate account to create `App Password`
s-aga-r May 26, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 1 addition & 12 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -227,17 +227,6 @@ After installation completes:

Ensure the following keys are properly configured in your `site_config.json` for Stalwart API communication:

```json
{
"mail": {
"server_url": "https://mail.example.com",
"api_key": "your-stalwart-api-key"
}
}
```

Alternatively, you can use username/password authentication:

```json
{
"mail": {
Expand Down Expand Up @@ -531,7 +520,7 @@ Some of its features include:

#### 8. Importing or exporting pre-existing mail data

![Data exchange](docs/screenshots/ui/data-exchange.png)
![Mail exchange](docs/screenshots/ui/mail-exchange.png)

#### 9. Progressive Web App (PWA) support for a fast, app-like experience

Expand Down
4 changes: 0 additions & 4 deletions frontend/components.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,8 @@ declare module 'vue' {
AddContactModal: typeof import('./src/components/Modals/AddContactModal.vue')['default']
AddContactPhoneModal: typeof import('./src/components/Modals/AddContactPhoneModal.vue')['default']
AddDomainModal: typeof import('./src/components/Modals/AddDomainModal.vue')['default']
AddEmailModal: typeof import('./src/components/Modals/AddEmailModal.vue')['default']
AddMailingListExternalMemberModal: typeof import('./src/components/Modals/AddMailingListExternalMemberModal.vue')['default']
AddMailingListInternalMembersModal: typeof import('./src/components/Modals/AddMailingListInternalMembersModal.vue')['default']
AddMailingListMemberInput: typeof import('./src/components/AddMailingListMemberInput.vue')['default']
AddMailingListModal: typeof import('./src/components/Modals/AddMailingListModal.vue')['default']
AddMemberModal: typeof import('./src/components/Modals/AddMemberModal.vue')['default']
AddSignatureModal: typeof import('./src/components/Modals/AddSignatureModal.vue')['default']
AdvancedSettings: typeof import('./src/components/Settings/AdvancedSettings.vue')['default']
Expand Down Expand Up @@ -64,7 +61,6 @@ declare module 'vue' {
InstallPrompt: typeof import('./src/components/InstallPrompt.vue')['default']
ListCard: typeof import('./src/components/ListCard.vue')['default']
LoginLayout: typeof import('./src/components/LoginLayout.vue')['default']
LucideX: typeof import('~icons/lucide/x')['default']
MailActions: typeof import('./src/components/MailActions.vue')['default']
MailDate: typeof import('./src/components/MailDate.vue')['default']
MailDetails: typeof import('./src/components/MailDetails.vue')['default']
Expand Down
57 changes: 0 additions & 57 deletions frontend/src/components/AddMailingListMemberInput.vue

This file was deleted.

7 changes: 0 additions & 7 deletions frontend/src/components/AppSidebar.vue
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,6 @@ import Globe from '~icons/lucide/globe'
import LayoutGrid from '~icons/lucide/layout-grid'
import LogOut from '~icons/lucide/log-out'
import Mailbox from '~icons/lucide/mailbox'
import Mails from '~icons/lucide/mails'
import Plus from '~icons/lucide/plus'
import Settings from '~icons/lucide/settings'
import Star from '~icons/lucide/star'
Expand Down Expand Up @@ -263,12 +262,6 @@ const dashboardItems = [
to: { name: 'Members' },
activeFor: ['Members', 'Invites', 'Member'],
},
{
label: __('Mailing Lists'),
icon: Mails,
to: { name: 'MailingLists' },
activeFor: ['MailingLists', 'MailingList'],
},
],
},
]
Expand Down
7 changes: 3 additions & 4 deletions frontend/src/components/DNSRecords.vue
Original file line number Diff line number Diff line change
Expand Up @@ -46,10 +46,9 @@ const { title, description, records } = defineProps<{
}>()

const LIST_COLUMNS = [
{ label: __('Type'), key: 'type', width: '10%' },
{ label: __('Host'), key: 'host', width: '20%' },
{ label: __('Priority'), key: 'priority', width: '10%' },
{ label: __('TTL (Recommended)'), key: 'ttl', width: '10%' },
{ label: __('Type'), key: 'type', width: '12%' },
{ label: __('Hostname'), key: 'name', width: '24%' },
{ label: __('TTL (Recommended)'), key: 'ttl', width: '14%' },
{ label: __('Value'), key: 'value', width: '50%' },
]
</script>
65 changes: 29 additions & 36 deletions frontend/src/components/Modals/AddDomainModal.vue
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,10 @@
title: __('Add Domain'),
actions: [
{
label: domainRequest?.data ? __('Verify DNS') : __('Add Domain'),
label: __('Add Domain'),
variant: 'solid',
onClick: domainRequest?.data ? verifyDNS.submit : domainRequest.submit,
disabled: !domainName,
onClick: addDomain.submit,
},
],
}"
Expand All @@ -25,66 +26,58 @@
v-model="domainName"
:label="__('Domain Name')"
placeholder="example.com"
:readonly="!!domainRequest?.data"
autocomplete="off"
/>
<ErrorMessage :message="domainRequest.error?.messages[0]" />
<div v-if="domainRequest.data?.verification_key" class="space-y-4">
<p class="text-p-base">
{{
__(
`Add the following TXT record to your domain's DNS records to verify your ownership:`,
)
}}
</p>
<CopyControl
:label="__('Verification Key')"
:value="domainRequest.data.verification_key"
/>
<ErrorMessage :message="verifyDNS.error?.messages[0] || verificationError" />
</div>
<FormControl
v-model="domainDescription"
:label="__('Description')"
:placeholder="__('Primary domain for company email')"
type="textarea"
/>
<ErrorMessage
:message="addDomain.error?.messages[0] || addDomain.error?.message"
/>
</div>
</template>
</Dialog>
</template>

<script setup lang="ts">
import { ref, watch } from 'vue'
import { useRouter } from 'vue-router'
import { Dialog, ErrorMessage, FormControl, createResource } from 'frappe-ui'

import { raiseToast } from '@/utils'
import CopyControl from '@/components/Controls/CopyControl.vue'

const show = defineModel<boolean>()
const router = useRouter()

const domainName = ref('')
const verificationError = ref('')
const domainDescription = ref('')

const emit = defineEmits(['reloadDomains'])

watch(show, () => {
if (show.value) {
domainName.value = ''
verificationError.value = ''
domainRequest.reset()
verifyDNS.reset()
domainDescription.value = ''
addDomain.reset()
}
})

const domainRequest = createResource({
url: 'mail.api.admin.get_domain_request',
makeParams: () => ({ domain_name: domainName.value }),
})
const addDomain = createResource({
url: 'mail.api.admin.add_domain',
makeParams: () => ({
name: domainName.value,
description: domainDescription.value?.trim() || undefined,
}),
onSuccess: (data: string) => {
if (!data) return

const verifyDNS = createResource({
url: 'mail.api.admin.verify_dns_record',
makeParams: () => ({ domain_request: domainRequest?.data.name }),
onSuccess: (data) => {
if (data) {
show.value = false
emit('reloadDomains')
raiseToast('Domain added.')
} else verificationError.value = __('Failed to verify DNS record.')
show.value = false
emit('reloadDomains')
raiseToast(__('Domain added.'))
router.push({ name: 'Domain', params: { domainId: data } })
},
})
</script>
87 changes: 0 additions & 87 deletions frontend/src/components/Modals/AddEmailModal.vue

This file was deleted.

Loading
Loading