2020-07-16 18:51:29 +02:00
<!-- Modal subscription -->
< div class = "modal fade" id = "subscriptionRequiredModal" tabindex = "-1" role = "dialog" >
< div class = "modal-dialog" >
< div class = "modal-content" >
< div class = "modal-header" >
2020-11-12 22:18:30 +01:00
< h4 class = "modal-title" > {{ 'email.subscriptionDialog.title' | tr }}< / h4 >
2020-07-16 18:51:29 +02:00
< / div >
< div class = "modal-body" >
2020-11-12 22:18:30 +01:00
< p > {{ 'email.subscriptionDialog.description' | tr }}< / p >
2020-07-16 18:51:29 +02:00
< / div >
< div class = "modal-footer" >
2020-11-12 22:18:30 +01:00
< button type = "button" class = "btn btn-default" data-dismiss = "modal" > {{ 'main.dialog.cancel' | tr }}< / button >
< button type = "button" class = "btn btn-success" ng-click = "openSubscriptionSetup()" > {{ 'email.subscriptionDialog.setupAction' | tr }}< / button >
2020-07-16 18:51:29 +02:00
< / div >
< / div >
< / div >
< / div >
2018-01-22 13:01:38 -08:00
<!-- Modal enable email -->
< div class = "modal fade" id = "enableEmailModal" tabindex = "-1" role = "dialog" >
< div class = "modal-dialog" >
< div class = "modal-content" >
< div class = "modal-header" >
2020-11-12 22:18:30 +01:00
< h4 class = "modal-title" > {{ 'email.enableEmailDialog.title' | tr:{ domain: domain.domain } }}< / h4 >
2018-01-22 13:01:38 -08:00
< / div >
2018-05-29 17:17:53 +02:00
< div class = "modal-body" >
2023-01-24 13:58:55 +01:00
< p ng-bind-html = "'email.enableEmailDialog.description' | tr:{ domain: domain.domain, requiredPortsDocsLink: 'https://docs.cloudron.io/email/#required-ports' }" > < / p >
< p class = "text-warning" ng-show = "domain.provider === 'noop' || domain.provider === 'manual'" ng-bind-html = "'email.enableEmailDialog.noProviderInfo' | tr" > < / p >
< p class = "text-danger" ng-show = "adminDomain.provider === 'cloudflare'" ng-bind-html = "'email.enableEmailDialog.cloudflareInfo' | tr:{ adminDomain: config.adminDomain, mailFqdn: config.mailFqdn }" > < / p >
2020-02-11 21:06:34 +01:00
< div ng-hide = "domain.provider === 'noop' || domain.provider === 'manual'" >
2019-05-10 23:47:36 +02:00
< p >
< label class = "control-label" >
2020-11-12 22:18:30 +01:00
< input type = "checkbox" ng-model = "incomingEmail.setupDns" > {{ 'email.enableEmailDialog.setupDnsCheckbox' | tr }}
2019-05-10 23:47:36 +02:00
< / label >
< / p >
2021-10-24 21:20:33 -07:00
< span ng-bind-html = "'email.enableEmailDialog.setupDnsInfo' | tr:{ importEmailDocsLink: 'https://docs.cloudron.io/guides/import-email' }" > < / span >
2018-05-29 17:17:53 +02:00
< / div >
2018-01-22 13:01:38 -08:00
< / div >
< div class = "modal-footer" >
2020-11-12 22:18:30 +01:00
< button type = "button" class = "btn btn-default" data-dismiss = "modal" > {{ 'main.dialog.cancel' | tr }}< / button >
< button type = "button" class = "btn btn-success" ng-click = "incomingEmail.enable()" > {{ 'email.enableEmailDialog.enableAction' | tr }}< / button >
2018-01-22 13:01:38 -08:00
< / div >
< / div >
< / div >
< / div >
2018-05-06 23:36:40 -07:00
<!-- Modal disable email -->
< div class = "modal fade" id = "disableEmailModal" tabindex = "-1" role = "dialog" >
< div class = "modal-dialog" >
< div class = "modal-content" >
< div class = "modal-header" >
2020-11-12 22:18:30 +01:00
< h4 class = "modal-title" > {{ 'email.disableEmailDialog.title' | tr:{ domain: domain.domain } }}< / h4 >
2018-05-06 23:36:40 -07:00
< / div >
< div class = "modal-body" >
2020-11-12 22:18:30 +01:00
< div ng-bind-html = "'email.disableEmailDialog.description' | tr:{ domain: domain.domain }" > < / div >
2019-01-31 12:24:27 -08:00
< br / >
2018-05-06 23:36:40 -07:00
< / div >
< div class = "modal-footer" >
2020-11-12 22:18:30 +01:00
< button type = "button" class = "btn btn-default" data-dismiss = "modal" > {{ 'main.dialog.cancel' | tr }}< / button >
< button type = "button" class = "btn btn-danger" ng-click = "incomingEmail.disable()" > {{ 'email.disableEmailDialog.disableAction' | tr }}< / button >
2018-05-06 23:36:40 -07:00
< / div >
< / div >
< / div >
< / div >
2018-04-09 16:12:18 +02:00
<!-- Modal add mailbox -->
2018-04-09 15:56:20 +02:00
< div class = "modal fade" id = "mailboxAddModal" tabindex = "-1" role = "dialog" >
< div class = "modal-dialog" >
< div class = "modal-content" >
< div class = "modal-header" >
2020-11-12 22:18:30 +01:00
< h4 class = "modal-title" > {{ 'email.addMailboxDialog.title' | tr }}< / h4 >
2018-04-09 15:56:20 +02:00
< / div >
< div class = "modal-body" >
< form name = "mailboxadd_form" role = "form" ng-submit = "mailboxes.add.submit()" autocomplete = "off" >
< input type = "password" style = "display: none;" >
2018-05-11 11:07:12 -07:00
< div class = "form-group" ng-class = "{ 'has-error': mailboxes.add.error }" >
2020-11-12 22:18:30 +01:00
< label class = "control-label" > {{ 'email.addMailboxDialog.name' | tr }}< / label >
2018-05-11 11:07:12 -07:00
< div class = "control-label" ng-show = "mailboxes.add.error" >
< small > {{ mailboxes.add.error.message }}< / small >
2018-04-09 16:21:32 +02:00
< / div >
2018-04-09 15:56:20 +02:00
< div class = "input-group form-inline" style = "margin-top: 10px;" >
2020-11-12 22:18:30 +01:00
< input type = "text" class = "form-control" ng-model = "mailboxes.add.name" required autofocus autocomplete = "off" / >
2020-02-11 21:06:34 +01:00
< div class = "input-group-addon" > @{{ domain.domain }}< / div >
2018-04-09 15:58:25 +02:00
< / div >
2018-04-09 15:56:20 +02:00
< / div >
< div class = "form-group" >
2020-11-12 22:18:30 +01:00
< label class = "control-label" > {{ 'email.addMailboxDialog.owner' | tr }}< / label >
2020-11-13 09:57:22 -08:00
< div class = "control-label" >
2020-11-13 13:21:01 -08:00
< multiselect ng-model = "mailboxes.add.owner" options = "o.display for o in owners" data-compare-by = "name" data-header-key = "header" data-divider-key = "divider" data-multiple = "false" filter-after-rows = "5" scroll-after-rows = "10" > < / multiselect >
2020-11-13 09:57:22 -08:00
< / div >
2018-04-09 15:56:20 +02:00
< / div >
2020-11-23 21:22:15 -08:00
< input class = "hide" type = "submit" ng-disabled = "mailboxadd_form.$invalid || mailboxes.add.busy || !mailboxes.add.owner" / >
2018-04-09 15:56:20 +02:00
< / form >
< / div >
< div class = "modal-footer" >
2020-11-12 22:18:30 +01:00
< button type = "button" class = "btn btn-default" data-dismiss = "modal" > {{ 'main.dialog.cancel' | tr }}< / button >
2020-11-23 21:22:15 -08:00
< button type = "button" class = "btn btn-success" ng-click = "mailboxes.add.submit()" ng-disabled = "mailboxadd_form.$invalid || mailboxes.add.busy || !mailboxes.add.owner" > < i class = "fa fa-circle-notch fa-spin" ng-show = "mailboxes.add.busy" > < / i > {{ 'main.dialog.save' | tr }}< / button >
2018-04-09 15:56:20 +02:00
< / div >
< / div >
< / div >
< / div >
2018-04-09 12:42:14 +02:00
<!-- Modal edit mailbox -->
< div class = "modal fade" id = "mailboxEditModal" tabindex = "-1" role = "dialog" >
< div class = "modal-dialog" >
< div class = "modal-content" >
< div class = "modal-header" >
2020-11-12 22:18:30 +01:00
< h4 class = "modal-title" > {{ 'email.editMailboxDialog.title' | tr:{ name: mailboxes.edit.name, domain: domain.domain } }}< / h4 >
2018-04-09 12:42:14 +02:00
< / div >
< div class = "modal-body" >
< form name = "mailboxedit_form" role = "form" ng-submit = "mailboxes.edit.submit()" autocomplete = "off" >
< input type = "password" style = "display: none;" >
< div class = "form-group" >
2020-11-12 22:18:30 +01:00
< label class = "control-label" > {{ 'email.editMailboxDialog.owner' | tr }}< / label >
2020-11-13 09:57:22 -08:00
< div class = "control-label" >
2020-11-13 13:09:59 -08:00
< multiselect ng-model = "mailboxes.edit.owner" options = "o.display for o in owners" data-compare-by = "name" data-header-key = "header" data-divider-key = "divider" data-multiple = "false" filter-after-rows = "5" scroll-after-rows = "10" > < / multiselect >
2020-11-13 09:57:22 -08:00
< / div >
2018-04-09 12:42:14 +02:00
< / div >
2020-04-19 19:44:45 -07:00
< div class = "form-group aliases" >
2020-11-12 22:18:30 +01:00
< label class = "control-label" > {{ 'email.editMailboxDialog.aliases' | tr }}< / label >
2020-04-19 19:44:45 -07:00
< div class = "has-error" ng-show = "mailboxes.edit.error" > {{ mailboxes.edit.error.message }}< / div >
2021-12-15 16:06:22 +01:00
< div class = "row" ng-repeat = "alias in mailboxes.edit.aliases | orderBy:'reversedSortingNotation'" >
2020-04-19 19:44:45 -07:00
< div class = "col col-lg-11" >
< div class = "input-group" >
2022-01-10 22:08:55 -08:00
< input type = "text" class = "form-control input-sm" ng-model = "alias.name" autofocus >
2020-04-19 19:44:45 -07:00
< div class = "input-group-btn" >
2021-12-14 18:35:32 +01:00
< button type = "button" class = "btn btn-default btn-sm dropdown-toggle" data-toggle = "dropdown" >
2021-01-06 22:16:25 -08:00
< span > @{{ alias.domain }}< / span >
2020-04-19 19:44:45 -07:00
< span class = "caret" > < / span >
< / button >
< ul class = "dropdown-menu dropdown-menu-right" role = "menu" >
2020-04-20 16:35:52 -07:00
< li ng-repeat = "incomingDomain in incomingDomains" >
< a href = "" ng-click = "alias.domain = incomingDomain.domain" > {{ incomingDomain.domain }}< / a >
2020-04-19 19:44:45 -07:00
< / li >
< / ul >
< / div >
< / div >
< / div >
< div class = "col col-lg-1" >
2022-02-23 17:02:45 +01:00
< button class = "btn btn-danger btn-sm" ng-click = "mailboxes.edit.delAlias($event, alias)" > < i class = "far fa-trash-alt" > < / i > < / button >
2020-04-19 19:44:45 -07:00
< / div >
2018-04-09 12:54:25 +02:00
< / div >
2020-04-19 19:44:45 -07:00
< div ng-show = "mailboxes.edit.aliases.length === 0" >
2020-11-12 22:18:30 +01:00
{{ 'email.editMailboxDialog.noAliases' | tr }} < a href = "" ng-click = "mailboxes.edit.addAlias($event)" > {{ 'email.editMailboxDialog.addAliasAction' | tr }}< / a >
2020-04-19 19:44:45 -07:00
< / div >
< div ng-show = "mailboxes.edit.aliases.length > 0" style = "margin-top: 5px;" >
2020-11-12 22:18:30 +01:00
< a href = "" ng-click = "mailboxes.edit.addAlias($event)" > {{ 'email.editMailboxDialog.addAnotherAliasAction' | tr }}< / a >
2018-04-09 12:42:14 +02:00
< / div >
< / div >
2020-04-19 19:44:45 -07:00
2022-08-18 09:11:15 +02:00
< div class = "form-group" >
< label for = "storageQuota" >
< input id = "storageQuota" type = "checkbox" ng-model = "mailboxes.edit.storageQuotaEnabled" >
Fix SI and Decimal unit usage
SI: For 1000, it is kB, MB, GB
IEC: For 1024, it is KiB, MiB, GiB
JEDEC: For 1024, it is KB, MB (conflicts with SI, of course)
Ultimately, what we decided is for RAM use IEC and for Disk use SI.
This is what docker does and also suggested here -
https://stackoverflow.com/questions/8632269/displaying-file-size-1000b-1kb-or-1024b-1kb
2022-10-13 21:48:03 +02:00
{{ 'email.editMailboxDialog.enableStorageQuota' | tr }} < b ng-hide = "!mailboxes.edit.storageQuotaEnabled" > : {{ mailboxes.edit.storageQuota | prettyDecimalSize }}< / b >
2022-08-18 09:11:15 +02:00
< / input >
< / label >
< div style = "padding: 0 10px;" >
2022-12-24 14:49:58 +01:00
< slider id = "storageQuota" ng-disabled = "!mailboxes.edit.storageQuotaEnabled" ng-model = "mailboxes.edit.storageQuota" step = "500000000" ticks-snap-bounds = "1000000000" tooltip = "hide" ticks = "storageQuotaTicks" > < / slider >
2022-08-18 09:11:15 +02:00
< / div >
< / div >
2021-10-08 10:20:17 -07:00
< div class = "checkbox" >
< label >
< input type = "checkbox" ng-model = "mailboxes.edit.enablePop3" > {{ 'email.updateMailboxDialog.enablePop3' | tr }}< / input >
< / label >
< / div >
2021-04-14 22:37:59 -07:00
< div class = "checkbox" >
< label >
< input type = "checkbox" ng-model = "mailboxes.edit.active" > {{ 'email.updateMailboxDialog.activeCheckbox' | tr }}< / input >
< / label >
< / div >
2019-01-10 13:31:49 -08:00
< input class = "hide" type = "submit" ng-disabled = "mailboxedit_form.$invalid || mailboxes.edit.busy || !mailboxes.edit.owner" / >
2018-04-09 12:42:14 +02:00
< / form >
< / div >
< div class = "modal-footer" >
2020-11-12 22:18:30 +01:00
< button type = "button" class = "btn btn-default" data-dismiss = "modal" > {{ 'main.dialog.cancel' | tr }}< / button >
< button type = "button" class = "btn btn-success" ng-click = "mailboxes.edit.submit()" ng-disabled = "mailboxedit_form.$invalid || mailboxes.edit.busy || !mailboxes.edit.owner" > < i class = "fa fa-circle-notch fa-spin" ng-show = "mailboxes.edit.busy" > < / i > {{ 'main.dialog.save' | tr }}< / button >
2018-04-09 12:42:14 +02:00
< / div >
< / div >
< / div >
< / div >
2018-04-05 21:22:07 +02:00
<!-- Modal remove mailbox -->
< div class = "modal fade" id = "mailboxRemoveModal" tabindex = "-1" role = "dialog" >
< div class = "modal-dialog" >
< div class = "modal-content" >
< div class = "modal-header" >
2020-11-12 22:18:30 +01:00
< h4 class = "modal-title" > {{ 'email.deleteMailboxDialog.title' | tr:{ name: mailboxes.remove.mailbox.name, domain: domain.domain } }}< / h4 >
2018-04-05 21:22:07 +02:00
< / div >
< div class = "modal-body" >
2020-11-12 22:18:30 +01:00
< div ng-bind-html = "'email.deleteMailboxDialog.description' | tr" > < / div >
< br / >
< div class = "checkbox" >
2020-07-27 22:36:38 -07:00
< label >
2020-11-12 22:18:30 +01:00
< input type = "checkbox" ng-model = "mailboxes.remove.deleteMails" > {{ 'email.deleteMailboxDialog.purgeMailboxCheckbox' | tr }}< / input >
2020-07-27 22:36:38 -07:00
< / label >
2020-11-12 22:18:30 +01:00
< / div >
2018-04-05 21:22:07 +02:00
< / div >
< div class = "modal-footer" >
2020-11-12 22:18:30 +01:00
< button type = "button" class = "btn btn-default" data-dismiss = "modal" > {{ 'main.dialog.cancel' | tr }}< / button >
< button type = "button" class = "btn btn-danger" ng-click = "mailboxes.remove.submit()" ng-disabled = "mailboxes.remove.busy" > < i class = "fa fa-circle-notch fa-spin" ng-show = "mailboxes.remove.busy" > < / i > {{ 'email.deleteMailboxDialog.deleteAction' | tr }}< / button >
2018-04-05 21:22:07 +02:00
< / div >
< / div >
< / div >
< / div >
2022-01-23 22:26:23 +01:00
<!-- Modal import mailboxes -->
< div class = "modal fade" id = "mailboxImportModal" tabindex = "-1" role = "dialog" >
< div class = "modal-dialog" >
< div class = "modal-content" >
< div class = "modal-header" >
2022-02-17 15:52:15 +01:00
< h4 class = "modal-title" > {{ 'email.mailboxImportDialog.title' | tr }}< / h4 >
2022-01-23 22:26:23 +01:00
< / div >
< div class = "modal-body" >
< div ng-show = "!mailboxImport.done" >
< div ng-show = "!mailboxImport.busy" >
2022-02-17 17:50:47 -08:00
< p ng-bind-html = " 'email.mailboxImportDialog.description' | tr:{ docsLink: 'https://cloudron.io/documentation/email/#import-mailboxes' } " > < / p >
< input type = "file" style = "display: none;" id = "mailboxImportFileInput" accept = "application/json,text/csv" / >
2022-02-17 15:52:15 +01:00
< button class = "btn btn-primary" ng-click = "mailboxImport.openFileInput()" > {{ 'email.mailboxImportDialog.fileInput' | tr }}< / button >
2022-01-23 22:26:23 +01:00
< br / >
< br / >
< p class = "text-danger" ng-show = "mailboxImport.error.file" > {{ mailboxImport.error.file }}< / p >
2022-02-17 17:50:47 -08:00
< p class = "text-info" ng-show = "mailboxImport.mailboxes.length" > {{ 'email.mailboxImportDialog.mailboxesFound' | tr:{ count: mailboxImport.mailboxes.length } }}< / p >
2022-01-23 22:26:23 +01:00
< / div >
< div ng-show = "mailboxImport.busy" class = "progress progress-striped active" >
< div class = "progress-bar progress-bar-success" role = "progressbar" style = "width: {{ mailboxImport.percent }}%" > < / div >
< / div >
< / div >
< div ng-show = "mailboxImport.done" >
2022-02-17 15:52:15 +01:00
< p > {{ 'email.mailboxImportDialog.success' | tr:{ count: mailboxImport.success } }}< / p >
2022-01-23 22:26:23 +01:00
< div ng-show = "mailboxImport.error.import.length" >
2022-02-17 15:52:15 +01:00
< p class = "text-danger" > {{ 'email.mailboxImportDialog.failed' | tr }}< / p >
2022-01-23 22:26:23 +01:00
< div ng-repeat = "tmp in mailboxImport.error.import" > < b > {{ tmp.mailbox.name }}@{{ tmp.mailbox.domain }}:< / b > {{ tmp.error.message }}< / div >
< / div >
< / div >
< / div >
< div class = "modal-footer" >
< button type = "button" class = "btn btn-default" data-dismiss = "modal" > {{ 'main.dialog.close' | tr }}< / button >
2022-02-17 15:52:15 +01:00
< button type = "button" class = "btn btn-primary" ng-click = "mailboxImport.import()" ng-show = "!mailboxImport.done" ng-disabled = "mailboxImport.busy || !mailboxImport.mailboxes.length" > < i class = "fa fa-circle-notch fa-spin" ng-show = "mailboxImport.busy" > < / i > {{ 'email.mailboxImportDialog.importAction' | tr }}< / button >
2022-01-23 22:26:23 +01:00
< / div >
< / div >
< / div >
< / div >
2018-04-09 16:12:18 +02:00
<!-- Modal add mailinglist -->
< div class = "modal fade" id = "mailinglistAddModal" tabindex = "-1" role = "dialog" >
< div class = "modal-dialog" >
< div class = "modal-content" >
< div class = "modal-header" >
2020-11-12 22:18:30 +01:00
< h4 class = "modal-title" > {{ 'email.addMailinglistDialog.title' | tr }}< / h4 >
2018-04-09 16:12:18 +02:00
< / div >
< div class = "modal-body" >
< form name = "mailinglistadd_form" role = "form" ng-submit = "mailinglists.add.submit()" autocomplete = "off" >
< input type = "password" style = "display: none;" >
2019-09-11 14:09:53 -07:00
< div class = "form-group" ng-class = "{ 'has-error': mailinglists.add.error.name }" >
2021-03-31 14:09:17 +02:00
< label class = "control-label" > {{ 'email.addMailinglistDialog.name' | tr }}< / label >
2019-09-11 14:09:53 -07:00
< div class = "control-label" ng-show = "mailinglists.add.error.name" > < small > {{ mailinglists.add.error.name }}< / small > < / div >
2018-04-09 16:12:18 +02:00
< div class = "input-group form-inline" style = "margin-top: 10px;" >
2020-11-12 22:18:30 +01:00
< input type = "text" class = "form-control" ng-model = "mailinglists.add.name" required autofocus autocomplete = "off" / >
2020-02-11 21:06:34 +01:00
< div class = "input-group-addon" > @{{ domain.domain }}< / div >
2018-04-09 16:12:18 +02:00
< / div >
< / div >
< div class = "form-group" >
2020-11-12 22:18:30 +01:00
< label class = "control-label" > {{ 'email.addMailinglistDialog.members' | tr }}< / label > < br / >
2019-09-11 14:09:53 -07:00
< div class = "has-error control-label" ng-show = "mailinglists.add.error.members" > < small > {{ mailinglists.add.error.members }}< / small > < / div >
2020-03-06 20:43:57 -08:00
< textarea ng-model = "mailinglists.add.membersTxt" class = "form-control" rows = "5" > < / textarea >
2020-11-12 22:18:30 +01:00
< small > {{ 'email.addMailinglistDialog.membersInfo' | tr }}< / small >
2018-04-09 16:12:18 +02:00
< / div >
2020-04-17 17:37:19 -07:00
< div class = "checkbox" >
< label >
2020-11-12 22:18:30 +01:00
< input type = "checkbox" ng-model = "mailinglists.add.membersOnly" > {{ 'email.addMailinglistDialog.membersOnlyCheckbox' | tr }}< / input >
2020-04-17 17:37:19 -07:00
< / label >
< / div >
2019-09-11 14:09:53 -07:00
< input class = "hide" type = "submit" ng-disabled = "mailinglistadd_form.$invalid || mailinglists.add.membersTxt.length === 0 || mailinglists.add.busy" / >
2018-04-09 16:12:18 +02:00
< / form >
< / div >
< div class = "modal-footer" >
2020-11-12 22:18:30 +01:00
< button type = "button" class = "btn btn-default" data-dismiss = "modal" > {{ 'main.dialog.cancel' | tr }}< / button >
< button type = "button" class = "btn btn-success" ng-click = "mailinglists.add.submit()" ng-disabled = "mailinglistadd_form.$invalid || mailinglists.add.membersTxt.length === 0 || mailinglists.add.busy" > < i class = "fa fa-circle-notch fa-spin" ng-show = "mailinglists.add.busy" > < / i > {{ 'main.dialog.save' | tr }}< / button >
2018-04-09 16:12:18 +02:00
< / div >
< / div >
< / div >
< / div >
2018-04-09 15:01:12 +02:00
<!-- Modal edit mailinglist -->
< div class = "modal fade" id = "mailinglistEditModal" tabindex = "-1" role = "dialog" >
2018-04-09 15:08:05 +02:00
< div class = "modal-dialog" >
< div class = "modal-content" >
< div class = "modal-header" >
2020-11-12 22:18:30 +01:00
< h4 class = "modal-title" > {{ 'email.editMailinglistDialog.title' | tr:{ name: mailinglists.edit.name, domain: domain.domain } }}< / h4 >
2018-04-09 15:08:05 +02:00
< / div >
< div class = "modal-body" >
< form name = "mailinglistedit_form" role = "form" ng-submit = "mailinglists.edit.submit()" autocomplete = "off" >
< input type = "password" style = "display: none;" >
2019-09-11 14:09:53 -07:00
< div class = "form-group" ng-class = "{ 'has-error': mailinglists.edit.error.members }" >
2020-11-12 22:18:30 +01:00
< label class = "control-label" > {{ 'email.addMailinglistDialog.members' | tr }}< / label > < br / >
2019-09-11 14:09:53 -07:00
< div class = "has-error control-label" ng-show = "mailinglists.edit.error.members" > < small > {{ mailinglists.edit.error.members }}< / small > < / div >
2022-01-10 22:08:55 -08:00
< textarea ng-model = "mailinglists.edit.membersTxt" class = "form-control" rows = "5" autofocus > < / textarea >
2020-11-12 22:18:30 +01:00
< small > {{ 'email.addMailinglistDialog.membersInfo' | tr }}< / small >
2018-04-09 15:08:05 +02:00
< / div >
2020-04-17 17:37:19 -07:00
< div class = "checkbox" >
< label >
2020-11-12 22:18:30 +01:00
< input type = "checkbox" ng-model = "mailinglists.edit.membersOnly" > {{ 'email.addMailinglistDialog.membersOnlyCheckbox' | tr }}< / input >
2020-04-17 17:37:19 -07:00
< / label >
< / div >
2021-04-14 22:37:59 -07:00
< div class = "checkbox" >
< label >
< input type = "checkbox" ng-model = "mailinglists.edit.active" > {{ 'email.updateMailinglistDialog.activeCheckbox' | tr }}< / input >
< / label >
< / div >
2018-04-09 15:08:05 +02:00
< input class = "hide" type = "submit" ng-disabled = "mailinglistedit_form.$invalid || mailinglists.edit.busy" / >
< / form >
< / div >
< div class = "modal-footer" >
2020-11-12 22:18:30 +01:00
< button type = "button" class = "btn btn-default" data-dismiss = "modal" > {{ 'main.dialog.cancel' | tr }}< / button >
< button type = "button" class = "btn btn-success" ng-click = "mailinglists.edit.submit()" ng-disabled = "mailinglistedit_form.$invalid || mailinglists.edit.busy" > < i class = "fa fa-circle-notch fa-spin" ng-show = "mailinglists.edit.busy" > < / i > {{ 'main.dialog.save' | tr }}< / button >
2018-04-09 15:01:12 +02:00
< / div >
< / div >
< / div >
2018-04-09 15:08:05 +02:00
< / div >
2018-04-09 15:01:12 +02:00
2018-04-06 16:43:43 +02:00
<!-- Modal remove mailinglist -->
< div class = "modal fade" id = "mailinglistRemoveModal" tabindex = "-1" role = "dialog" >
2018-04-09 15:08:05 +02:00
< div class = "modal-dialog" >
< div class = "modal-content" >
< div class = "modal-header" >
2020-11-12 22:18:30 +01:00
< h4 class = "modal-title" > {{ 'email.deleteMailinglistDialog.title' | tr:{ name: mailinglists.remove.list.name, domain: domain.domain } }}< / h4 >
2018-04-09 15:08:05 +02:00
< / div >
< div class = "modal-body" >
2020-11-12 22:18:30 +01:00
< p ng-bind-html = "'email.deleteMailinglistDialog.description' | tr:{ name: mailinglists.remove.list.name, domain: domain.domain }" > < / p > `
2018-04-09 15:08:05 +02:00
< / div >
< div class = "modal-footer" >
2020-11-12 22:18:30 +01:00
< button type = "button" class = "btn btn-default" data-dismiss = "modal" > {{ 'main.dialog.cancel' | tr }}< / button >
< button type = "button" class = "btn btn-danger" ng-click = "mailinglists.remove.submit()" ng-disabled = "mailinglists.remove.busy" > < i class = "fa fa-circle-notch fa-spin" ng-show = "mailinglist.remove.busy" > < / i > {{ 'email.deleteMailinglistDialog.deleteAction' | tr }}< / button >
2018-04-06 16:43:43 +02:00
< / div >
< / div >
< / div >
2018-04-09 15:08:05 +02:00
< / div >
2018-04-06 16:43:43 +02:00
2021-12-02 14:49:35 -08:00
<!-- Modal how to connect -->
< div class = "modal fade" id = "howToConnectInfoModal" tabindex = "-1" role = "dialog" >
< div class = "modal-dialog" >
< div class = "modal-content" >
< div class = "modal-header" >
< h4 > {{ 'email.howToConnectInfoModal' | tr }}< / h4 >
< / div >
< div class = "modal-body" >
< p ng-bind-html = " 'email.incoming.howToConnectDescription' | tr:{ domain: domain.domain } " > < / p >
< p > < b > {{ 'email.incoming.incomingUserInfo' | tr }}< / b > < br / > < i > mailboxname< / i > @{{ domain.domain }}< / p >
< p > < b > {{ 'email.incoming.incomingPasswordInfo' | tr }}< / b > < br / > {{ 'email.incoming.incomingPasswordUsage' | tr }}< / p >
< p > < b > {{ 'email.incoming.incomingServerInfo' | tr }}< / b > < br / > {{ 'email.incoming.server' | tr }}: < span ng-click-select > {{config.mailFqdn}}< / span > < br / > {{ 'email.incoming.port' | tr }}: 993 (TLS)< / p >
< p > < b > {{ 'email.incoming.outgointServerInfo' | tr }}< / b > < br / > {{ 'email.incoming.server' | tr }}: < span ng-click-select > {{config.mailFqdn}}< / span > < br / > {{ 'email.incoming.port' | tr }}: 587 (STARTTLS) or 465 (TLS)< / p >
< p > < b > {{ 'email.incoming.sieveServerInfo' | tr }}< / b > < br / > {{ 'email.incoming.server' | tr }}: < span ng-click-select > {{config.mailFqdn}}< / span > < br / > {{ 'email.incoming.port' | tr }}: 4190 (STARTTLS)< / p >
< / div >
< div class = "modal-footer" >
< button type = "button" class = "btn btn-default" data-dismiss = "modal" > {{ 'main.dialog.close' | tr }}< / button >
< / div >
< / div >
< / div >
< / div >
2018-01-23 12:30:35 +01:00
< div ng-show = "!ready" class = "loading-banner" >
2018-11-16 17:03:21 +01:00
< h1 > < i class = "fa fa-circle-notch fa-spin" > < / i > < / h1 >
2018-01-23 12:30:35 +01:00
< / div >
2021-12-02 12:44:30 -08:00
< div class = "content" ng-show = "ready" >
2020-11-12 22:18:30 +01:00
< a href = "/#/email" class = "back-to-view-link" > < i class = "fas fa-arrow-left" > < / i > {{ 'email.backAction' | tr }}< / a >
2020-02-11 21:06:34 +01:00
< br / >
2018-01-22 13:01:38 -08:00
< div class = "text-left" >
2021-12-02 14:49:35 -08:00
< h3 >
{{ 'email.config.title' | tr:{ domain: domain.domain } }}
< div class = "dropdown pull-right" style = "display: inline-block" >
< button class = "btn btn-sm btn-default dropdown-toggle" type = "button" data-toggle = "dropdown" uib-tooltip = "{{ 'app.docsActionTooltip' | tr }}" tooltip-append-to-body = "true" tooltip-placement = "bottom" >
< i class = "fas fa-book" > < / i >
< span class = "caret" > < / span >
< / button >
< ul class = "dropdown-menu dropdown-menu-right" >
< li > < a href = "https://docs.cloudron.io/email/" target = "_blank" > {{ 'app.docsAction' | tr }}< / a > < / li >
< li ng-class = "{ 'disabled': !domain.mailConfig.enabled }" > < a href = "" ng-click = "howToConnectInfo.show()" > {{ 'email.config.clientConfiguration' | tr }}< / a > < / li >
< / ul >
< / div >
< / h3 >
2018-01-22 13:01:38 -08:00
< / div >
2020-02-11 21:06:34 +01:00
< br / >
2021-11-19 15:45:16 +01:00
< uib-tabset active = "activeTab" >
< uib-tab index = "'mailboxes'" select = "setView('mailboxes')" heading = "{{ 'email.incoming.tabTitle' | tr }}" >
2018-05-23 22:00:48 -07:00
< div class = "card card-large" style = "margin-bottom: 15px;" >
2021-11-19 10:12:39 +01:00
< h4 > {{ 'email.incoming.title' | tr }}< / h4 >
2021-12-02 14:49:35 -08:00
< p ng-show = "domain.mailConfig.enabled" > {{ 'email.incoming.enabled' | tr }}< / p >
< p ng-hide = "domain.mailConfig.enabled" > {{ 'email.incoming.disabled' | tr }}< / p >
2021-12-02 12:44:30 -08:00
2021-11-19 10:12:39 +01:00
< div class = "row" >
2021-12-02 12:44:30 -08:00
< div class = "col-md-12" >
2021-12-02 14:52:55 -08:00
< button class = "pull-right" ng-class = "domain.mailConfig.enabled ? 'btn btn-danger' : 'btn btn-primary'" ng-click = "incomingEmail.toggleEmailEnabled()" ng-disabled = "incomingEmail.busy" ng-show = "user.isAtLeastAdmin" >
2021-11-19 10:12:39 +01:00
< i class = "fa fa-circle-notch fa-spin" ng-show = "incomingEmail.busy" > < / i >
{{ domain.mailConfig.enabled ? ('email.incoming.disableAction' | tr) : ('email.incoming.enableAction' | tr) }}
< / button >
2020-11-12 22:18:30 +01:00
< / div >
2021-11-19 10:12:39 +01:00
< / div >
< / div >
2019-10-22 12:47:32 +02:00
2021-11-19 10:12:39 +01:00
< br / >
2019-10-22 12:47:32 +02:00
2021-11-19 10:12:39 +01:00
< div class = "text-left" >
< h3 style = "margin-bottom: 15px;" > {{ 'email.incoming.mailboxes.title' | tr }}
< button class = "btn btn-primary btn-outline pull-right" ng-click = "mailboxes.add.show()" ng-disabled = "!domain.mailConfig.enabled" tooltip-enable = "!domain.mailConfig.enabled" uib-tooltip = "{{ 'email.incoming.mailboxes.disabledTooltip' | tr }}" > < i class = "fa fa-inbox" > < / i > {{ 'email.incoming.mailboxes.addAction' | tr }}< / button >
2022-01-23 22:26:23 +01:00
< div class = "btn-group pull-right" style = "margin-left: 5px;" >
2022-02-17 15:52:15 +01:00
< button class = "btn btn-default" ng-click = "mailboxImport.show()" uib-tooltip = "{{ 'email.incoming.mailboxes.importTooltip' | tr }}" tooltip-append-to-body = "true" > < i class = "fas fa-download" > < / i > < / button >
2022-02-17 16:37:48 -08:00
< div class = "btn-group" role = "group" >
< button class = "btn btn-default dropdown-toggle" type = "button" data-toggle = "dropdown" uib-tooltip = "{{ 'email.incoming.mailboxes.exportTooltip' | tr }}" tooltip-append-to-body = "true" >
< i class = "fas fa-upload" > < / i >
< / button >
< ul class = "dropdown-menu dropdown-menu-right" >
< li > < a href = "" ng-click = "mailboxExport('csv')" > {{ 'email.incoming.mailboxes.mailboxExport.csv' | tr }}< / a > < / li >
< li > < a href = "" ng-click = "mailboxExport('json')" > {{ 'email.incoming.mailboxes.mailboxExport.json' | tr }}< / a > < / li >
< / ul >
< / div >
2022-01-23 22:26:23 +01:00
< / div >
2021-11-19 10:12:39 +01:00
< input class = "form-control pull-right" style = "width: 200px;" placeholder = "{{ 'main.searchPlaceholder' | tr }}" type = "text" ng-model = "mailboxes.search" ng-model-options = "{ debounce: 1000 }" ng-change = "mailboxes.updateFilter()" / >
< / h3 >
< / div >
< div class = "card card-large" style = "margin-bottom: 15px;" >
< div class = "row" >
< div class = "col-md-12" >
< table class = "table table-hover" >
< thead >
< tr >
< th > {{ 'email.incoming.mailboxes.name' | tr }}< / th >
< th > {{ 'email.incoming.mailboxes.owner' | tr }}< / th >
< th > {{ 'email.incoming.mailboxes.aliases' | tr }}< / th >
< th > {{ 'email.incoming.mailboxes.usage' | tr }}< / th >
< th class = "text-right" > {{ 'main.actions' | tr }}< / th >
< / tr >
< / thead >
< tbody >
< tr ng-repeat = "mailbox in mailboxes.mailboxes | filter:mailboxes.search" ng-class = "{'text-muted': !mailbox.active}" >
< td class = "hand" ng-click = "mailboxes.edit.show(mailbox)" >
{{ mailbox.name }}
< / td >
< td class = "hand" ng-click = "mailboxes.edit.show(mailbox)" >
{{ mailbox.ownerDisplayName }}
< / td >
2021-12-14 18:02:20 +01:00
< td class = "hand elide-table-cell" ng-click = "mailboxes.edit.show(mailbox)" >
2021-11-19 10:12:39 +01:00
< span ng-repeat = "alias in mailbox.aliases" > {{ alias.name + '@' + alias.domain }}< / span >
< / td >
< td class = "hand no-wrap" ng-click = "mailboxes.edit.show(mailbox)" >
2023-01-24 18:46:42 +01:00
< span ng-show = "mailUsage !== null" >
{{ mailUsage[mailbox.fullName].quotaValue | prettyDecimalSize }} < span ng-show = "mailUsage[mailbox.fullName].quotaLimit" > / {{ mailUsage[mailbox.fullName].quotaLimit | prettyDecimalSize }}< / span >
< / span >
< span ng-show = "mailUsage === null" >
{{ 'main.loadingPlaceholder' | tr }} ...
< / span >
2021-11-19 10:12:39 +01:00
< / td >
< td class = "text-right no-wrap" >
< button class = "btn btn-xs btn-default" ng-click = "mailboxes.edit.show(mailbox)" > < i class = "fa fa-pencil-alt" > < / i > < / button >
< button class = "btn btn-xs btn-danger" ng-click = "mailboxes.remove.show(mailbox)" > < i class = "far fa-trash-alt" > < / i > < / button >
< / td >
< / tr >
< / tbody >
< / table >
2021-12-09 14:58:29 +01:00
< div class = "pull-right" >
< button class = "btn btn-default btn-outline btn-xs" ng-click = "mailboxes.showPrevPage()" ng-class = "{ 'btn-primary': mailboxes.currentPage > 1 }" ng-disabled = "mailboxes.busy || mailboxes.currentPage <= 1" > < i class = "fa fa-angle-double-left" > < / i > {{ 'main.pagination.prev' | tr }}< / button >
< button class = "btn btn-default btn-outline btn-xs" ng-click = "mailboxes.showNextPage()" ng-class = "{ 'btn-primary': mailboxes.perPage <= mailboxes.mailboxes.length }" ng-disabled = "mailboxes.busy || mailboxes.perPage > mailboxes.mailboxes.length" > {{ 'main.pagination.next' | tr }} < i class = "fa fa-angle-double-right" > < / i > < / button >
< / div >
2018-05-23 22:00:48 -07:00
< / div >
< / div >
2021-11-19 10:12:39 +01:00
< / div >
2018-01-22 13:01:38 -08:00
2021-11-19 10:12:39 +01:00
< br / >
2019-10-22 12:47:32 +02:00
2021-11-19 10:12:39 +01:00
< div class = "text-left" >
< h3 style = "margin-bottom: 15px;" > {{ 'email.incoming.mailinglists.title' | tr }}
< button class = "btn btn-primary btn-outline pull-right" ng-click = "mailinglists.add.show()" ng-disabled = "!domain.mailConfig.enabled" tooltip-enable = "!domain.mailConfig.enabled" uib-tooltip = "{{ 'email.incoming.mailboxes.disabledTooltip' | tr }}" > < i class = "fa fa-list" > < / i > {{ 'email.incoming.mailboxes.addAction' | tr }}< / button >
< input class = "form-control pull-right" style = "width: 200px;" placeholder = "{{ 'main.searchPlaceholder' | tr }}" type = "text" ng-model = "mailinglists.search" ng-model-options = "{ debounce: 1000 }" ng-change = "mailinglists.updateFilter()" / >
< / h3 >
< / div >
2018-01-22 13:01:38 -08:00
2021-11-19 10:12:39 +01:00
< div class = "card card-large" style = "margin-bottom: 15px;" >
< div class = "row" >
< div class = "col-md-12" >
{{ 'email.incoming.mailinglists.description' | tr }}
< br / >
< br / >
< table class = "table table-hover" >
< thead >
< tr >
< th style = "width: 0.5%;" > < / th >
< th > {{ 'email.incoming.mailinglists.name' | tr }}< / th >
< th > {{ 'email.incoming.mailinglists.members' | tr }}< / th >
< th class = "text-right" > {{ 'main.actions' | tr }}< / th >
< / tr >
< / thead >
< tbody >
< tr ng-repeat = "list in mailinglists.mailinglists | filter:mailinglists.search | orderBy:'name'" ng-class = "{'text-muted': !list.active}" >
< td >
< i class = "fas fa-door-closed" ng-show = "list.membersOnly" uib-tooltip = "{{ 'email.incoming.mailinglists.membersOnlyTooltip' | tr }}" > < / i >
< i class = "fas fa-door-open" ng-show = "!list.membersOnly" uib-tooltip = "{{ 'email.incoming.mailinglists.everyoneTooltip' | tr }}" > < / i >
< / td >
< td class = "hand" ng-click = "mailinglists.edit.show(list)" >
{{ list.name }}
< / td >
< td class = "hand" ng-click = "mailinglists.edit.show(list)" >
{{ list.members.join(', ') }}
< / td >
< td class = "text-right no-wrap" >
< button class = "btn btn-xs btn-default" ng-click = "mailinglists.edit.show(list)" > < i class = "fa fa-pencil-alt" > < / i > < / button >
< button class = "btn btn-xs btn-danger" ng-click = "mailinglists.remove.show(list)" > < i class = "far fa-trash-alt" > < / i > < / button >
< / td >
< / tr >
< / tbody >
< / table >
2021-12-09 21:00:43 +01:00
< div class = "pull-right" >
< button class = "btn btn-default btn-outline btn-xs" ng-click = "mailinglists.showPrevPage()" ng-class = "{ 'btn-primary': mailinglists.currentPage > 1 }" ng-disabled = "mailinglists.busy || mailinglists.currentPage <= 1" > < i class = "fa fa-angle-double-left" > < / i > {{ 'main.pagination.prev' | tr }}< / button >
< button class = "btn btn-default btn-outline btn-xs" ng-click = "mailinglists.showNextPage()" ng-class = "{ 'btn-primary': mailinglists.perPage <= mailinglists.mailinglists.length }" ng-disabled = "mailinglists.busy || mailinglists.perPage > mailinglists.mailinglists.length" > {{ 'main.pagination.next' | tr }} < i class = "fa fa-angle-double-right" > < / i > < / button >
< / div >
2018-05-23 22:00:48 -07:00
< / div >
< / div >
2021-11-19 10:12:39 +01:00
< / div >
2018-04-09 15:08:05 +02:00
2021-11-19 10:12:39 +01:00
< br / >
2019-10-22 12:47:32 +02:00
2021-11-19 10:12:39 +01:00
< div class = "text-left" >
< h3 > {{ 'email.incoming.catchall.title' | tr }}< / h3 >
< / div >
2018-04-09 15:08:05 +02:00
2021-11-19 10:12:39 +01:00
< div class = "card card-large" style = "margin-bottom: 15px;" >
< div class = "row" >
< div class = "col-md-12" ng-bind-html = " 'email.incoming.catchall.description' | tr " > < / div >
< / div >
2020-11-12 22:18:30 +01:00
2021-11-19 10:12:39 +01:00
< br / >
2020-07-17 09:51:37 -07:00
2022-05-26 14:13:13 -07:00
< div class = "row" >
2021-11-19 10:12:39 +01:00
< div class = "col-md-6" >
2022-09-28 22:10:43 +02:00
< multiselect ng-model = "catchall.mailboxes" options = "mailbox.display for mailbox in catchall.availableMailboxes" data-compare-by = "display" data-multiple = "true" filter-after-rows = "5" scroll-after-rows = "10" > < / multiselect >
2021-11-19 10:12:39 +01:00
< button class = "btn btn-outline btn-primary" ng-click = "catchall.submit()" ng-disabled = "catchall.busy || !domain.mailConfig.enabled" tooltip-enable = "!domain.mailConfig.enabled" uib-tooltip = "{{ 'email.incoming.mailboxes.disabledTooltip' | tr }}" >
< i class = "fa fa-circle-notch fa-spin" ng-show = "catchall.busy" > < / i > {{ 'email.incoming.catchall.saveAction' | tr }}
< / button >
2018-05-23 22:00:48 -07:00
< / div >
< / div >
2021-11-19 10:12:39 +01:00
< / div >
< / uib-tab >
2018-01-22 13:01:38 -08:00
2021-12-02 14:52:55 -08:00
< uib-tab index = "'outbound'" ng-if = "user.isAtLeastAdmin" select = "setView('outbound')" heading = "{{ 'email.outbound.tabTitle' | tr }}" >
2021-11-19 10:12:39 +01:00
< div class = "card card-large" style = "margin-bottom: 15px;" >
< h4 > {{ 'email.outbound.title' | tr }} < sup > < a ng-href = "https://docs.cloudron.io/email/#relay-outbound-mails" class = "help" target = "_blank" > < i class = "fa fa-question-circle" > < / i > < / a > < / sup > < / h4 >
2019-03-15 11:16:43 -07:00
2021-11-19 10:12:39 +01:00
< div class = "row" >
< div class = "col-md-12" ng-bind-html = " 'email.outbound.description' | tr " > < / div >
< / div >
2018-01-22 13:01:38 -08:00
2021-11-19 10:12:39 +01:00
< br / >
2018-05-23 22:00:48 -07:00
2021-11-19 10:12:39 +01:00
< div class = "row" >
< div class = "col-md-12" >
< div class = "form-group" >
< select class = "form-control" style = "width: 50%;" ng-model = "mailRelay.preset" ng-options = "a.name for a in mailRelayPresets track by a.provider" ng-change = "mailRelay.presetChanged()" > < / select >
< / div >
2019-03-15 11:16:43 -07:00
2021-11-19 10:12:39 +01:00
< p class = "small text-danger" ng-show = "mailRelay.preset.provider === 'noop'" >
< span ng-if = "domain.domain === config.adminDomain" > {{ 'email.outbound.noopAdminDomainWarning' | tr }}< / span >
< span ng-if = "domain.domain !== config.adminDomain" > {{ 'email.outbound.noopNonAdminDomainWarning' | tr }}< / span >
< / p >
2019-03-15 11:16:43 -07:00
2020-11-12 22:18:30 +01:00
< / div >
2021-11-19 10:12:39 +01:00
< / div >
2018-01-22 13:01:38 -08:00
2021-11-19 10:12:39 +01:00
< div class = "row" ng-show = "usesExternalServer(mailRelay.preset.provider)" >
< div class = "col-md-6" >
< div >
< form name = "mailRelayForm" role = "form" ng-submit = "mailRelay.submit()" autocomplete = "off" novalidate >
< div class = "form-group" ng-class = "{ 'has-error': (mailRelayForm.host.$dirty && mailRelayForm.host.$invalid) }" >
< label class = "control-label" > {{ 'email.outbound.mailRelay.host' | tr }}< / label >
< div class = "control-label" ng-show = "(!mailRelayForm.host.$dirty && mailRelay.error.host) || (mailRelayForm.host.$dirty && mailRelayForm.host.$invalid)" >
< small ng-show = "!mailRelayForm.host.$dirty && mailRelay.error.host" > {{ mailRelay.error.host }}< / small >
2020-11-12 22:18:30 +01:00
< / div >
2021-11-19 10:12:39 +01:00
< input type = "text" class = "form-control" ng-model = "mailRelay.relay.host" name = "host" required >
< / div >
< div class = "form-group" ng-class = "{ 'has-error': (mailRelayForm.port.$dirty && mailRelayForm.port.$invalid) }" >
< label class = "control-label" > {{ 'email.outbound.mailRelay.port' | tr }}< / label >
< div class = "control-label" ng-show = "(!mailRelayForm.port.$dirty && mailRelay.error.port) || (mailRelayForm.port.$dirty && mailRelayForm.port.$invalid)" >
< small ng-show = "!mailRelayForm.port.$dirty && mailRelay.error.port" > {{ mailRelay.error.port }}< / small >
2020-11-12 22:18:30 +01:00
< / div >
2021-11-19 10:12:39 +01:00
< input type = "number" class = "form-control" ng-model = "mailRelay.relay.port" name = "port" required >
< / div >
2018-05-23 22:00:48 -07:00
2021-11-19 10:12:39 +01:00
< div class = "checkbox" ng-show = "mailRelay.relay.provider === 'external-smtp' || mailRelay.relay.provider === 'external-smtp-noauth'" >
< label >
< input type = "checkbox" ng-model = "mailRelay.relay.acceptSelfSignedCerts" > {{ 'email.outbound.mailRelay.selfsignedCheckbox' | tr }}< / input >
< / label >
< / div >
2019-04-23 15:24:31 -07:00
2021-11-19 10:12:39 +01:00
<!-- Postmark, Sendgrid, SparkPost -->
< div ng-show = "usesTokenAuth(mailRelay.relay.provider)" class = "form-group" ng-class = "{ 'has-error': (mailRelayForm.serverApiToken.$dirty && mailRelayForm.serverApiToken.$invalid) }" >
< label class = "control-label" > {{ 'email.outbound.mailRelay.apiTokenOrKey' | tr }}< / label >
< div class = "control-label" ng-show = "(!mailRelayForm.serverApiToken.$dirty && mailRelay.error.serverApiToken) || (mailRelayForm.serverApiToken.$dirty && mailRelayForm.serverApiToken.$invalid)" >
< small ng-show = "!mailRelayForm.serverApiToken.$dirty && mailRelay.error.serverApiToken" > {{ mailRelay.error.serverApiToken }}< / small >
2020-11-12 22:18:30 +01:00
< / div >
2021-11-19 10:12:39 +01:00
< input type = "text" class = "form-control" ng-model = "mailRelay.relay.serverApiToken" name = "serverApiToken" ng-required = "usesTokenAuth(mailRelay.relay.provider)" >
< / div >
2018-05-23 22:00:48 -07:00
2021-11-19 10:12:39 +01:00
<!-- Other -->
< div ng-show = "usesPasswordAuth(mailRelay.relay.provider)" class = "form-group" ng-class = "{ 'has-error': (mailRelayForm.username.$dirty && mailRelayForm.username.$invalid) }" >
< label class = "control-label" > {{ 'email.outbound.mailRelay.username' | tr }}< / label >
< div class = "control-label" ng-show = "(!mailRelayForm.username.$dirty && mailRelay.error.username) || (mailRelayForm.username.$dirty && mailRelayForm.username.$invalid)" >
< small ng-show = "!mailRelayForm.username.$dirty && mailRelay.error.username" > {{ mailRelay.error.username }}< / small >
2020-11-12 22:18:30 +01:00
< / div >
2021-11-19 10:12:39 +01:00
< input type = "text" class = "form-control" ng-model = "mailRelay.relay.username" name = "username" ng-required = "usesPasswordAuth(mailRelay.relay.provider)" >
< / div >
2018-05-23 22:00:48 -07:00
2021-11-19 10:12:39 +01:00
< div ng-show = "usesPasswordAuth(mailRelay.relay.provider)" class = "form-group" ng-class = "{ 'has-error': (mailRelayForm.password.$dirty && mailRelayForm.password.$invalid) }" >
< label class = "control-label" > {{ 'email.outbound.mailRelay.password' | tr }}< / label >
< div class = "control-label" ng-show = "(!mailRelayForm.password.$dirty && mailRelay.error.password) || (mailRelayForm.password.$dirty && mailRelayForm.password.$invalid)" >
< small ng-show = "!mailRelayForm.password.$dirty && mailRelay.error.password" > {{ mailRelay.error.password }}< / small >
2020-11-12 22:18:30 +01:00
< / div >
2021-11-19 10:12:39 +01:00
< input type = "password" class = "form-control" ng-model = "mailRelay.relay.password" name = "password" ng-required = "usesPasswordAuth(mailRelay.relay.provider)" password-reveal >
< / div >
2018-05-23 22:00:48 -07:00
2021-11-19 10:12:39 +01:00
< input class = "ng-hide" type = "submit" ng-disabled = "mailRelayForm.$invalid" / >
< / form >
2018-04-09 15:08:05 +02:00
< / div >
2020-11-12 22:18:30 +01:00
< / div >
2021-11-19 10:12:39 +01:00
< / div >
2018-01-22 13:01:38 -08:00
2021-11-19 10:12:39 +01:00
< div class = "row" >
< div class = "col-md-12" >
2021-12-02 12:44:30 -08:00
< button class = "btn btn-primary pull-right" ng-click = "mailRelay.submit()" ng-disabled = "(usesExternalServer(mailRelay.preset.provider) && (!mailRelayForm.$dirty || mailRelayForm.$invalid)) || mailRelay.busy" > < i class = "fa fa-circle-notch fa-spin" ng-show = "mailRelay.busy" > < / i > {{ 'email.outbound.mailRelay.saveAction' | tr }}< / button >
2018-01-22 13:01:38 -08:00
2021-11-19 10:12:39 +01:00
< span class = "has-error text-center" ng-show = "mailRelay.error" > {{ mailRelay.error }}< / span >
< span class = "text-success text-center text-bold" ng-show = "mailRelay.success" > {{ 'email.outbound.mailRelay.saveSuccess' | tr }}< / span >
2020-11-12 22:18:30 +01:00
< / div >
2021-11-19 10:12:39 +01:00
< / div >
2019-08-02 12:42:10 -07:00
2021-11-19 10:12:39 +01:00
< div class = "row" ng-show = "mailRelay.preset.spfDoc" >
< br / >
< div class = "col-md-12" >
< span class = "text-info" ng-bind-html = "'email.outbound.mailRelay.spfDocInfo' | tr:{ name: mailRelay.preset.name, spfDocsLink: mailRelay.preset.spfDoc }" > < / span >
2018-05-23 22:00:48 -07:00
< / div >
2020-11-12 22:18:30 +01:00
< / div >
2021-11-19 10:12:39 +01:00
< / div >
< / uib-tab >
2019-08-02 12:42:10 -07:00
2021-11-19 15:45:16 +01:00
< uib-tab index = "'settings'" select = "setView('settings')" heading = "{{ 'email.settings.tabTitle' | tr }}" >
2021-11-19 10:12:39 +01:00
< div class = "card card-large" style = "margin-bottom: 15px;" >
< h4 > {{ 'email.masquerading.title' | tr }}< / h4 >
2021-12-02 12:44:30 -08:00
< p ng-bind-html = " 'email.masquerading.description' | tr " > < / p >
2021-11-19 10:12:39 +01:00
< div class = "row" >
2021-12-02 12:44:30 -08:00
< div class = "col-md-12 text-right" >
2021-11-19 10:12:39 +01:00
< button class = "pull-right" ng-class = "domain.mailConfig.mailFromValidation ? 'btn btn-danger' : 'btn btn-primary'" ng-disabled = "mailFromValidation.busy" ng-click = "mailFromValidation.submit()" >
< i class = "fa fa-circle-notch fa-spin" ng-show = "mailFromValidation.busy" > < / i > {{ domain.mailConfig.mailFromValidation ? ('email.masquerading.enableAction' | tr) : ('email.masquerading.disableAction' | tr) }}
< / button >
2018-05-23 23:34:09 -07:00
< / div >
2020-11-12 22:18:30 +01:00
< / div >
2021-11-19 10:12:39 +01:00
< / div >
2020-08-24 10:16:11 -07:00
2021-11-19 10:12:39 +01:00
< div class = "card card-large" >
< h4 > {{ 'email.signature.title' | tr }}< / h4 >
< p ng-bind-html = " 'email.signature.description' | tr " > < / p >
2020-08-24 10:16:11 -07:00
2022-05-26 14:13:13 -07:00
< div class = "row" >
2021-11-19 10:12:39 +01:00
< div class = "col-md-12" >
< form role = "form" name = "bannerForm" ng-submit = "banner.submit()" autocomplete = "off" >
< fieldset >
< div class = "form-group" >
< label class = "control-label" style = "width: 100%" > {{ 'email.signature.plainTextFormat' | tr }}< / label >
< textarea ng-model = "banner.text" class = "form-control" rows = "4" > < / textarea >
< / div >
2020-08-24 10:16:11 -07:00
2021-11-19 10:12:39 +01:00
< div class = "form-group" >
< label class = "control-label" style = "width: 100%" > {{ 'email.signature.htmlFormat' | tr }}< / label >
< textarea ng-model = "banner.html" class = "form-control" rows = "4" > < / textarea >
< / div >
2020-08-24 10:16:11 -07:00
2021-11-19 10:12:39 +01:00
< input class = "ng-hide" type = "submit" ng-disabled = "banner.$invalid || banner.busy" / >
< / fieldset >
< / form >
2020-11-12 22:18:30 +01:00
< / div >
2021-11-19 10:12:39 +01:00
< / div >
< div class = "row" >
< div class = "col-md-12 text-right" >
< button class = "btn btn-outline btn-primary pull-right" ng-click = "banner.submit()" ng-disabled = "banner.$invalid || banner.busy" >
< i class = "fa fa-circle-notch fa-spin" ng-show = "banner.busy" > < / i > {{ 'email.signature.saveAction' | tr }}
< / button >
2020-08-24 10:16:11 -07:00
< / div >
2020-11-12 22:18:30 +01:00
< / div >
2021-11-19 10:12:39 +01:00
< / div >
< / uib-tab >
2021-12-02 14:52:55 -08:00
< uib-tab index = "'status'" ng-if = "user.isAtLeastAdmin" select = "setView('status')" heading = "{{ 'email.status.tabTitle' | tr }}" >
2021-11-19 10:12:39 +01:00
<!-- nothing to show if incoming mail is disabled and using a relay -->
< div class = "card card-large" style = "margin-bottom: 15px;" ng-hide = "!domain.mailConfig.enabled && domain.mailConfig.relay.provider !== 'cloudron-smtp'" >
< div class = "row" >
< div class = "col-md-12" >
< h4 > {{ 'email.dnsStatus.title' | tr }}
< button class = "btn btn-xs btn-primary btn-outline pull-right" ng-click = "incomingEmail.setDnsRecords()" >
< i class = "fa fa-circle-notch fa-spin" ng-show = "incomingEmail.setupDnsBusy" > < / i > {{ 'email.dnsStatus.reSetupAction' | tr }}
< / button >
< / h4 >
< span ng-bind-html = "'email.dnsStatus.description' | tr:{ emailDnsDocsLink:'https://docs.cloudron.io/email/#dns-records'}" > < / span >
< br / >
< br / >
< div ng-repeat = "record in expectedDnsRecordsTypes" >
< div class = "row" ng-if = "expectedDnsRecords[record.value].expected" >
< div class = "col-xs-12" >
< p class = "text-muted" >
< i ng-hide = "refreshBusy" ng-class = "expectedDnsRecords[record.value].status ? 'fa fa-check-circle text-success' : 'fa fa-exclamation-triangle text-danger'" > < / i >
< a href = "" data-toggle = "collapse" data-parent = "#accordion" data-target = "#collapse_dns_{{ record.value }}" > {{ record.name }} record< / a >
< button class = "btn btn-xs btn-default" ng-click = "refreshStatus()" ng-disabled = "refreshBusy" ng-show = "!expectedDnsRecords[record.value].status" > < i class = "fa fa-sync-alt" ng-class = "{ 'fa-pulse': refreshBusy }" > < / i > < / button >
< / p >
< div id = "collapse_dns_{{ record.value }}" class = "panel-collapse collapse" >
< div class = "panel-body" >
< p ng-show = "record.name === 'MX' && domain.provider === 'namecheap'" > {{ 'email.dnsStatus.namecheapInfo' | tr }} < sup > < a ng-href = "https://docs.cloudron.io/domains/#namecheap-dns" class = "help" target = "_blank" > < i class = "fa fa-question-circle" > < / i > < / a > < / sup > < / p >
2023-06-21 16:42:48 +05:30
< p ng-show = "record.name === 'PTR'" > {{ 'email.dnsStatus.ptrInfo' | tr }} < sup > < a ng-href = "https://docs.cloudron.io/email/#ptr-record" class = "help" target = "_blank" > < i class = "fa fa-question-circle" > < / i > < / a > < / sup > < / p >
2021-11-19 10:12:39 +01:00
< p ng-show = "expectedDnsRecords[record.value].name" > {{ 'email.dnsStatus.hostname' | tr }}: < b ng-click-select > < tt > {{ expectedDnsRecords[record.value].name }}< / tt > < / b > < / p >
< p ng-hide = "expectedDnsRecords[record.value].name" > {{ 'email.dnsStatus.domain' | tr }}: < b ng-click-select > < tt > {{ expectedDnsRecords[record.value].domain }}< / tt > < / b > < / p >
< p > {{ 'email.dnsStatus.type' | tr }}: < b ng-click-select > < tt > {{ expectedDnsRecords[record.value].type }}< / tt > < / b > < / p >
< p style = "overflow: auto; white-space: nowrap;" > {{ 'email.dnsStatus.expected' | tr }}: < b ng-click-select > < tt > {{ expectedDnsRecords[record.value].expected }}< / tt > < / b > < / p >
< p style = "overflow: auto; white-space: nowrap;" > {{ 'email.dnsStatus.current' | tr }}: < b ng-click-select > < tt > {{ expectedDnsRecords[record.value].value ? expectedDnsRecords[record.value].value : ('['+('email.dnsStatus.recordNotSet' | tr)+']') }}< / tt > < / b > < / p >
2018-05-23 22:00:48 -07:00
< / div >
< / div >
2018-01-22 13:01:38 -08:00
< / div >
< / div >
< / div >
< / div >
< / div >
2021-11-19 10:12:39 +01:00
< / div >
2018-01-22 13:01:38 -08:00
2021-11-19 10:12:39 +01:00
< div class = "card card-large" style = "margin-bottom: 15px;" ng-if = "domain.mailConfig.relay.provider !== 'noop'" >
< div class = "row" >
< div class = "col-md-12" >
< h4 > {{ 'email.smtpStatus.title' | tr }} < sup > < a ng-href = "https://docs.cloudron.io/email/#smtp-status" class = "help" target = "_blank" > < i class = "fa fa-question-circle" > < / i > < / a > < / sup > < / h4 >
< div class = "row" >
< div class = "col-xs-12" >
< p class = "text-muted" >
< i ng-hide = "refreshBusy" ng-class = "domain.mailStatus.relay.status ? 'fa fa-check-circle text-success' : 'fa fa-exclamation-triangle text-danger'" > < / i >
< a href = "" data-toggle = "collapse" data-parent = "#accordion" data-target = "#collapse_outbound_smtp" >
{{ domain.mailConfig.relay.provider === 'cloudron-smtp' ? ('email.smtpStatus.outboudDirect' | tr) : ('email.smtpStatus.outboudRelay' | tr) }}
< / a >
< button class = "btn btn-xs btn-default" ng-click = "refreshStatus()" ng-disabled = "refreshBusy" ng-show = "!domain.mailStatus.relay.status" > < i class = "fa fa-sync-alt" ng-class = "{ 'fa-pulse': refreshBusy }" > < / i > < / button >
< / p >
< div id = "collapse_outbound_smtp" class = "panel-collapse collapse" >
< div class = "panel-body" >
< p > < b > {{ domain.mailStatus.relay.value }} < / b > < / p >
2018-05-23 22:00:48 -07:00
< / div >
< / div >
2018-01-22 13:01:38 -08:00
< / div >
2021-11-19 10:12:39 +01:00
< / div >
2018-01-22 13:01:38 -08:00
2021-11-19 10:12:39 +01:00
< div class = "row" ng-show = "domain.mailConfig.relay.provider === 'cloudron-smtp'" >
< div class = "col-xs-12" >
< p class = "text-muted" >
< i ng-hide = "refreshBusy" ng-class = "domain.mailStatus.rbl.status ? 'fa fa-check-circle text-success' : 'fa fa-exclamation-triangle text-danger'" > < / i >
< a href = "" data-toggle = "collapse" data-parent = "#accordion" data-target = "#collapse_rbl" > {{ 'email.smtpStatus.blacklistCheck' | tr }}< / a >
< button class = "btn btn-xs btn-default" ng-click = "refreshStatus()" ng-disabled = "refreshBusy" ng-show = "!domain.mailStatus.rbl.status" > < i class = "fa fa-sync-alt" ng-class = "{ 'fa-pulse': refreshBusy }" > < / i > < / button >
< / p >
< div id = "collapse_rbl" class = "panel-collapse collapse" >
< div class = "panel-body" >
< div ng-show = "domain.mailStatus.rbl.servers.length" ng-bind-html = "'email.smtpStatus.blacklisted' | tr:{ ip: domain.mailStatus.rbl.ip }" > < / div >
< div ng-hide = "domain.mailStatus.rbl.servers.length" ng-bind-html = "'email.smtpStatus.notBlacklisted' | tr:{ ip: domain.mailStatus.rbl.ip }" > < / div >
< div ng-repeat = "server in domain.mailStatus.rbl.servers" >
< a ng-href = "{{server.site}}" target = "_blank" > {{ server.name }}< / a >
2018-05-23 22:00:48 -07:00
< / div >
< / div >
2018-04-09 15:08:05 +02:00
< / div >
2018-01-22 13:01:38 -08:00
< / div >
2018-05-23 22:00:48 -07:00
< / div >
2018-01-22 13:01:38 -08:00
< / div >
< / div >
2021-11-19 10:12:39 +01:00
< / div >
< / uib-tab >
2018-05-23 22:00:48 -07:00
< / uib-tabset >
2018-01-22 13:01:38 -08:00
< / div >