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-02-11 21:06:34 +01:00
< h4 class = "modal-title" > Enable Email for {{domain.domain}}?< / h4 >
2018-01-22 13:01:38 -08:00
< / div >
2018-05-29 17:17:53 +02:00
< div class = "modal-body" >
2020-02-11 21:06:34 +01:00
< div > This will configure Cloudron to receive emails for < b > {{domain.domain}}< / b > . See the
2019-12-18 14:29:42 -08:00
documentation for opening up the < a ng-href = "{{ config.webServerOrigin }}/documentation/email/#required-ports" target = "_blank" > required ports< / a >
2019-05-09 15:40:48 -07:00
for Cloudron Email.
< / div >
< br / >
2020-02-11 21:06:34 +01:00
< div ng-show = "domain.provider === 'noop' || domain.provider === 'manual'" >
2020-02-27 10:08:41 -08:00
No DNS provider is setup. The DNS records listed in the Status tab have to be setup manually.< br / > < br / >
2018-05-29 17:17:53 +02:00
< / div >
2019-12-31 10:33:09 -08:00
< div class = "text-danger" ng-show = "adminDomain.provider === 'cloudflare'" >
2020-02-27 10:08:41 -08:00
The domain < code > {{ config.adminDomain }}< / code > is managed by Cloudflare.
Please verify that Cloudflare proxying is disabled for < code > {{ config.adminFqdn }}< / code > and set to < code > DNS only< / code > .
2019-12-31 10:33:09 -08:00
This is required because Cloudflare does not proxy email.< br / > < br / >
< / div >
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" >
< input type = "checkbox" ng-model = "incomingEmail.setupDns" > Setup Mail DNS records now
< / label >
< / p >
2019-05-09 15:40:48 -07:00
Use this option to automatically setup Email related DNS records. Leaving this option unchecked
2019-12-18 14:29:42 -08:00
is useful for creating mail boxes and < a ng-href = "{{ config.webServerOrigin }}/documentation/email/#import-email" > importing email< / a >
2019-05-09 15:40:48 -07:00
before going live.
2018-05-29 17:17:53 +02:00
< / div >
2018-01-22 13:01:38 -08:00
< / div >
< div class = "modal-footer" >
< button type = "button" class = "btn btn-default" data-dismiss = "modal" > Cancel< / button >
2019-05-09 15:40:48 -07:00
< button type = "button" class = "btn btn-success" ng-click = "incomingEmail.enable()" > Enable< / 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-02-11 21:06:34 +01:00
< h4 class = "modal-title" > Disable Email Server for {{domain.domain}}?< / h4 >
2018-05-06 23:36:40 -07:00
< / div >
< div class = "modal-body" >
2020-02-11 21:06:34 +01:00
< div > This will configure Cloudron to stop receiving emails for < b > {{domain.domain}}< / b > . Mailboxes and lists associated with this
2019-05-09 15:40:48 -07:00
domain will not be deleted.
< / div >
2019-01-31 12:24:27 -08:00
< br / >
2018-05-06 23:36:40 -07:00
< / div >
< div class = "modal-footer" >
< button type = "button" class = "btn btn-default" data-dismiss = "modal" > Cancel< / button >
2018-08-12 13:13:52 -07:00
< button type = "button" class = "btn btn-danger" ng-click = "incomingEmail.disable()" > Disable< / 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" >
< h4 class = "modal-title" > Add Mailbox< / h4 >
< / 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 }" >
2018-04-09 15:56:20 +02:00
< label class = "control-label" > Name< / 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;" >
2018-04-09 15:58:25 +02:00
< input type = "text" class = "form-control" ng-model = "mailboxes.add.name" placeholder = "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" >
2018-04-09 12:35:14 -07:00
< label class = "control-label" > Mailbox Owner< / label >
2018-04-09 16:21:32 +02:00
< select class = "form-control" ng-model = "mailboxes.add.owner" ng-options = "u.display for u in users track by u.id" required > < / select >
2018-04-09 15:56:20 +02:00
< / div >
< input class = "hide" type = "submit" ng-disabled = "mailboxadd_form.$invalid || mailboxes.add.busy" / >
< / form >
< / div >
< div class = "modal-footer" >
< button type = "button" class = "btn btn-default" data-dismiss = "modal" > Cancel< / button >
2018-11-16 17:03:21 +01:00
< button type = "button" class = "btn btn-success" ng-click = "mailboxes.add.submit()" ng-disabled = "mailboxadd_form.$invalid || mailboxes.add.busy" > < i class = "fa fa-circle-notch fa-spin" ng-show = "mailboxes.add.busy" > < / i > Save< / 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-02-11 21:06:34 +01:00
< h4 class = "modal-title" > Edit mailbox {{ mailboxes.edit.name }}@{{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" >
< label class = "control-label" > Mailbox Owner< / label >
2018-04-12 12:26:51 +02:00
< select class = "form-control" ng-model = "mailboxes.edit.owner" ng-options = "u.display for u in users track by u.id" autofocus > < / select >
2018-04-09 12:42:14 +02:00
< / div >
< div class = "form-group" ng-class = "{ 'has-error': mailboxes.edit.error }" >
< label class = "control-label" > Aliases< / label >
< div class = "control-label" ng-show = "mailboxes.edit.error" >
2018-04-09 12:54:25 +02:00
< small > {{ mailboxes.edit.error.message }}< / small >
< / div >
< div class = "input-group form-inline" style = "margin-top: 10px;" >
2018-04-12 12:26:51 +02:00
< tag-input class = "form-group form-control" placeholder = "Add alias" taglist = "mailboxes.edit.aliases" name = "aliases" > < / tag-input >
2020-02-11 21:06:34 +01:00
< div class = "input-group-addon" > @{{ domain.domain }}< / div >
2018-04-09 12:42:14 +02:00
< / div >
< / 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" >
< button type = "button" class = "btn btn-default" data-dismiss = "modal" > Cancel< / button >
2019-01-10 13:31:49 -08:00
< 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 > Save< / 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-02-11 21:06:34 +01:00
< h4 class = "modal-title" > Delete mailbox {{ mailboxes.remove.mailbox.name }}@{{domain.domain}}< / h4 >
2018-04-05 21:22:07 +02:00
< / div >
< div class = "modal-body" >
2019-05-20 18:58:46 -07:00
< p > After deletion, emails to this mailbox will bounce. Note that the mailbox data is not removed.< / p >
2018-04-05 21:22:07 +02:00
< / div >
< div class = "modal-footer" >
< button type = "button" class = "btn btn-default" data-dismiss = "modal" > Close< / button >
2018-11-16 17:03:21 +01:00
< 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 > Delete< / button >
2018-04-05 21:22:07 +02: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" >
2018-04-09 12:35:14 -07:00
< h4 class = "modal-title" > Add Mailing list< / 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 }" >
2018-04-09 16:12:18 +02:00
< label class = "control-label" > Name< / 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;" >
< input type = "text" class = "form-control" ng-model = "mailinglists.add.name" placeholder = "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" >
2018-04-09 12:35:14 -07:00
< label class = "control-label" > List Members< / 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 >
2019-10-21 13:02:12 +02:00
< textarea ng-model = "mailinglists.add.membersTxt" class = "form-control" rows = "10" > < / textarea >
< small > Separate email addresses with a newline< / small >
2018-04-09 16:12:18 +02:00
< / 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" >
< button type = "button" class = "btn btn-default" data-dismiss = "modal" > Cancel< / button >
2019-09-11 14:09:53 -07:00
< 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 > Save< / 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-02-11 21:06:34 +01:00
< h4 class = "modal-title" > Edit Mailing list {{ mailinglists.edit.name }}@{{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 }" >
2018-04-11 19:04:26 -07:00
< label class = "control-label" > List Members< / 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 >
2019-10-21 13:02:12 +02:00
< textarea ng-model = "mailinglists.edit.membersTxt" class = "form-control" rows = "10" > < / textarea >
< small > Separate email addresses with a newline< / small >
2018-04-09 15:08:05 +02:00
< / div >
< input class = "hide" type = "submit" ng-disabled = "mailinglistedit_form.$invalid || mailinglists.edit.busy" / >
< / form >
< / div >
< div class = "modal-footer" >
< button type = "button" class = "btn btn-default" data-dismiss = "modal" > Cancel< / button >
2018-11-16 17:03:21 +01:00
< 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 > Save< / 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-02-11 21:06:34 +01:00
< h4 class = "modal-title" > Delete mailing list {{ mailinglists.remove.list.name }}@{{domain.domain}}< / h4 >
2018-04-09 15:08:05 +02:00
< / div >
< div class = "modal-body" >
2020-02-11 21:06:34 +01:00
< p > Really delete mailinglist < b > {{ mailinglists.remove.list.name }}@{{domain.domain}}< / b > ?< / p >
2018-04-09 15:08:05 +02:00
< / div >
< div class = "modal-footer" >
< button type = "button" class = "btn btn-default" data-dismiss = "modal" > Close< / button >
2018-11-16 17:03:21 +01:00
< 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 > Delete< / 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
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 >
2018-04-09 14:55:35 -07:00
< div class = "content" ng-show = "ready" >
2020-02-11 21:06:34 +01:00
< a href = "/#/email" class = "back-to-view-link" > < i class = "fas fa-arrow-left" > < / i > Back to Email< / a >
< br / >
2018-01-22 13:01:38 -08:00
< div class = "text-left" >
2020-02-11 21:06:34 +01:00
< h3 >
Email configuration < b > {{ domain.domain }}< / b >
< / h3 >
2018-01-22 13:01:38 -08:00
< / div >
2020-02-11 21:06:34 +01:00
< br / >
2018-05-23 22:00:48 -07:00
< uib-tabset >
< uib-tab index = "0" heading = "Mailboxes" >
< div class = "card card-large" style = "margin-bottom: 15px;" >
2018-05-24 09:26:41 -07:00
< h4 > Incoming Email< / h4 >
2018-05-23 22:00:48 -07:00
< div class = "row" >
2018-05-24 09:26:41 -07:00
< div class = "col-md-10" >
2019-12-18 14:29:42 -08:00
Cloudron < a ng-href = "{{ config.webServerOrigin }}/documentation/email/" target = "_blank" > Email Server< / a > allows users to receive email for this domain.
2018-05-24 09:45:08 -07:00
< a href = "/#/appstore/net.rainloop.cloudronapp" > Rainloop< / a > , < a href = "/#/appstore/nu.sogo.cloudronapp2" > SOGo< / a > ,
< a href = "/#/appstore/net.roundcube.cloudronapp" > Roundcube< / a > are pre-configured to access Cloudron Email. Use < a href = "" data-toggle = "collapse" data-parent = "#accordion" data-target = "#mail_settings" > these settings< / a >
2018-05-24 09:26:41 -07:00
to configure other email clients.
< / div >
2018-06-16 11:28:13 -07:00
< div class = "col-md-2" >
2020-02-11 21:06:34 +01:00
< button ng-class = "domain.mailConfig.enabled ? 'btn btn-danger' : 'btn btn-primary'" ng-click = "domain.provider !== 'caas' && incomingEmail.toggleEmailEnabled()" ng-disabled = "domain.provider === 'caas' || incomingEmail.busy" >
2018-11-16 17:03:21 +01:00
< i class = "fa fa-circle-notch fa-spin" ng-show = "incomingEmail.busy" > < / i >
2020-02-11 21:06:34 +01:00
{{ domain.mailConfig.enabled ? "Disable" : "Enable" }}
2018-06-16 11:28:13 -07:00
< / button >
2018-05-24 09:26:41 -07:00
< / div >
2020-02-11 21:06:34 +01:00
< div class = "col-md-12" ng-show = "domain.provider === 'caas'" >
2018-06-16 11:28:13 -07:00
< br / >
< span class = "text-danger text-bold" > This feature is only available for custom domains.< / span >
2018-05-23 22:00:48 -07:00
< / div >
< / div >
2018-05-24 09:26:41 -07:00
< div class = "row" >
2018-05-23 22:00:48 -07:00
< div class = "col-md-12" >
< div id = "mail_settings" class = "panel-collapse collapse" >
< br / >
< p > < b > Incoming Mail (IMAP)< / b > < br / > Server: < span ng-click-select > {{config.mailFqdn}}< / span > < br / > Port: 993 (TLS)< / p >
< p > < b > Outgoing Mail (SMTP)< / b > < br / > Server: < span ng-click-select > {{config.mailFqdn}}< / span > < br / > Port: 587 (STARTTLS)< / p >
2018-05-23 23:15:17 -07:00
< p > < b > ManageSieve< / b > < br / > Server: < span ng-click-select > {{config.mailFqdn}}< / span > < br / > Port: 4190 (STARTTLS)< / p >
2020-02-11 21:06:34 +01:00
< p > Use < i > mailboxname< / i > @{{ domain.domain }} and the mailbox owner password to access mailboxes of this domain< / p >
2018-05-23 22:00:48 -07:00
< / div >
< / div >
< / div >
2018-04-09 15:08:05 +02:00
< br / >
2018-01-22 13:01:38 -08:00
< / div >
2018-04-01 19:11:46 +02:00
2019-10-22 12:47:32 +02:00
< br / >
2019-01-31 12:24:27 -08:00
< div class = "text-left" >
2018-05-23 22:00:48 -07:00
< h3 style = "margin-bottom: 15px;" > Mailboxes
2019-10-22 12:47:32 +02:00
2020-02-11 21:06:34 +01:00
< 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 is disabled for this domain" > < i class = "fa fa-inbox" > < / i > New Mailbox< / button >
2019-10-22 12:47:32 +02:00
< input class = "form-control pull-right" style = "width: 200px;" placeholder = "Search" type = "text" ng-model = "mailboxes.search" / >
2018-05-23 22:00:48 -07:00
< / h3 >
< / div >
2018-04-01 19:11:46 +02:00
2019-01-31 12:24:27 -08:00
< div class = "card card-large" style = "margin-bottom: 15px;" >
2018-05-23 22:00:48 -07:00
< div class = "row" >
< div class = "col-md-12" >
2019-10-22 12:47:32 +02:00
2018-05-23 22:00:48 -07:00
< table class = "table table-hover" >
< thead >
< tr >
< th > Name< / th >
< th > Owner< / th >
< th > Aliases< / th >
2020-02-20 12:08:56 -08:00
< th > Usage< / th >
2018-05-23 22:00:48 -07:00
< th class = "text-right" > Action< / th >
< / tr >
< / thead >
< tbody >
2019-10-22 12:47:32 +02:00
< tr ng-repeat = "mailbox in mailboxes.mailboxes | filter:mailboxes.search" >
2018-05-23 22:00:48 -07:00
< td class = "hand" ng-click = "mailboxes.edit.show(mailbox)" >
{{ mailbox.name }}
< / td >
< td class = "hand" ng-click = "mailboxes.edit.show(mailbox)" >
2018-12-06 10:28:42 -08:00
{{ mailbox.ownerDisplayName }}
2018-05-23 22:00:48 -07:00
< / td >
< td class = "hand" ng-click = "mailboxes.edit.show(mailbox)" >
{{ mailbox.aliases }}
< / td >
2020-02-20 12:08:56 -08:00
< td class = "hand" ng-click = "mailboxes.edit.show(mailbox)" >
{{ mailbox.usage | prettyDiskSize }}
< / td >
2018-05-23 22:00:48 -07:00
< td class = "text-right no-wrap" >
2018-11-15 18:07:18 +01:00
< 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 >
2018-05-23 22:00:48 -07:00
< / td >
< / tr >
< / tbody >
< / table >
< / div >
< / div >
< / div >
2018-01-22 13:01:38 -08:00
2019-10-22 12:47:32 +02:00
< br / >
2019-01-31 12:24:27 -08:00
< div class = "text-left" >
2018-05-23 22:00:48 -07:00
< h3 style = "margin-bottom: 15px;" > Mailing Lists
2020-02-11 21:06:34 +01:00
< 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 is disabled for this domain" > < i class = "fa fa-list" > < / i > New Mailing list< / button >
2019-10-22 12:47:32 +02:00
< input class = "form-control pull-right" style = "width: 200px;" placeholder = "Search" type = "text" ng-model = "mailinglists.search" / >
2018-05-23 22:00:48 -07:00
< / h3 >
< / div >
2018-01-22 13:01:38 -08:00
2019-01-31 12:24:27 -08:00
< div class = "card card-large" style = "margin-bottom: 15px;" >
2018-05-23 22:00:48 -07:00
< div class = "row" >
< div class = "col-md-12" >
A Mailing list forwards all emails to it's members.
< br / >
< br / >
< table class = "table table-hover" >
< thead >
< tr >
< th > Name< / th >
< th > List Members< / th >
< th class = "text-right" > Action< / th >
< / tr >
< / thead >
< tbody >
2019-10-22 12:52:03 +02:00
< tr ng-repeat = "list in mailinglists.mailinglists | filter:mailinglists.search | orderBy:'name'" >
2018-05-23 22:00:48 -07:00
< 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" >
2018-11-15 18:07:18 +01:00
< 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 >
2018-05-23 22:00:48 -07:00
< / td >
< / tr >
< / tbody >
< / table >
< / div >
< / div >
< / div >
2018-04-09 15:08:05 +02:00
2019-10-22 12:47:32 +02:00
< br / >
2019-01-31 12:24:27 -08:00
< div class = "text-left" >
2018-05-23 22:00:48 -07:00
< h3 > Catch-all< / h3 >
2018-01-22 13:01:38 -08:00
< / div >
2018-04-09 15:08:05 +02:00
2019-01-31 12:24:27 -08:00
< div class = "card card-large" style = "margin-bottom: 15px;" >
2018-05-23 22:00:48 -07:00
< div class = "row" >
< div class = "col-md-12" >
Emails sent to non existing addresses will be forwarded to the following mailboxes:
2018-04-09 15:08:05 +02:00
< / div >
2018-05-23 22:00:48 -07:00
< / div >
< br / >
< div class = "row" >
< div class = "col-md-6" >
2019-11-05 19:45:59 +01:00
< multiselect ng-model = "catchall.mailboxes" options = "mailbox.name for mailbox in mailboxes.mailboxes" data-compare-by = "name" data-multiple = "true" filter-after-rows = "5" scroll-after-rows = "10" > < / multiselect >
2020-02-11 21:06:34 +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 is disabled for this domain">
2019-01-31 12:24:27 -08:00
< i class = "fa fa-circle-notch fa-spin" ng-show = "catchall.busy" > < / i > Save
< / button >
2018-04-09 15:08:05 +02:00
< / div >
2018-05-23 22:00:48 -07:00
< / div >
< / div >
< / uib-tab >
2018-01-22 13:01:38 -08:00
2019-03-15 11:16:43 -07:00
< uib-tab index = "1" heading = "Outbound" >
2018-05-23 22:00:48 -07:00
< div class = "card card-large" style = "margin-bottom: 15px;" >
2019-12-18 14:29:42 -08:00
< h4 > Email Relay < sup > < a ng-href = "{{ config.webServerOrigin }}/documentation/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
2018-05-23 22:00:48 -07:00
< div class = "row" >
< div class = "col-md-12" >
2019-09-08 12:23:27 -07:00
Select the mail server (Smart host) through which Cloudron & Apps will send outbound mails for this domain:
2018-01-22 13:01:38 -08:00
< / div >
2018-04-09 15:08:05 +02:00
< / div >
2018-01-22 13:01:38 -08:00
2018-05-23 22:00:48 -07:00
< br / >
< 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
2019-07-24 22:11:05 -07:00
< p class = "small text-danger" ng-show = "mailRelay.preset.provider === 'noop'" >
2020-02-11 21:06:34 +01:00
< span ng-if = "domain.domain === config.adminDomain" >
2019-07-24 22:11:05 -07:00
Cloudron cannot send user invites, password reset and other notifications when email is disabled on the primary domain
< / span >
2020-02-11 21:06:34 +01:00
< span ng-if = "domain.domain !== config.adminDomain" >
Cloudron cannot provide email sending for apps hosted under this domain when email is disabled
2019-07-24 22:11:05 -07:00
< / span >
2019-03-15 11:16:43 -07:00
< / p >
2018-01-22 13:01:38 -08:00
< / div >
2018-04-09 15:08:05 +02:00
< / div >
2018-01-22 13:01:38 -08:00
2019-04-22 16:40:50 -07:00
< div class = "row" ng-show = "usesExternalServer(mailRelay.preset.provider)" >
2018-05-23 22:00:48 -07:00
< 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" > SMTP Host< / 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 >
< / div >
< 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" > SMTP Port (STARTTLS)< / 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 >
< / div >
< input type = "number" class = "form-control" ng-model = "mailRelay.relay.port" name = "port" required >
< / div >
2019-04-23 15:47:20 -07:00
< div class = "checkbox" ng-show = "mailRelay.relay.provider === 'external-smtp' || mailRelay.relay.provider === 'external-smtp-noauth'" >
2019-04-23 15:24:31 -07:00
< label >
< input type = "checkbox" ng-model = "mailRelay.relay.acceptSelfSignedCerts" > Accept Self-signed certificate< / input >
< / label >
< / div >
2019-07-15 10:49:13 -07:00
<!-- Postmark, Sendgrid, SparkPost -->
2019-04-22 16:40:50 -07:00
< div ng-show = "usesTokenAuth(mailRelay.relay.provider)" class = "form-group" ng-class = "{ 'has-error': (mailRelayForm.serverApiToken.$dirty && mailRelayForm.serverApiToken.$invalid) }" >
2018-05-23 22:00:48 -07:00
< label class = "control-label" > API Token/Key< / 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 >
< / div >
2019-04-22 16:40:50 -07:00
< input type = "text" class = "form-control" ng-model = "mailRelay.relay.serverApiToken" name = "serverApiToken" ng-required = "usesTokenAuth(mailRelay.relay.provider)" >
2018-05-23 22:00:48 -07:00
< / div >
<!-- Other -->
2019-04-22 16:40:50 -07:00
< div ng-show = "usesPasswordAuth(mailRelay.relay.provider)" class = "form-group" ng-class = "{ 'has-error': (mailRelayForm.username.$dirty && mailRelayForm.username.$invalid) }" >
2018-05-23 22:00:48 -07:00
< label class = "control-label" > Username< / label >
2019-04-22 15:46:07 -07:00
< 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 >
2018-05-23 22:00:48 -07:00
< / div >
2019-04-22 16:40:50 -07:00
< input type = "text" class = "form-control" ng-model = "mailRelay.relay.username" name = "username" ng-required = "usesPasswordAuth(mailRelay.relay.provider)" >
2018-05-23 22:00:48 -07:00
< / div >
2019-04-22 16:40:50 -07:00
< div ng-show = "usesPasswordAuth(mailRelay.relay.provider)" class = "form-group" ng-class = "{ 'has-error': (mailRelayForm.password.$dirty && mailRelayForm.password.$invalid) }" >
2018-05-23 22:00:48 -07:00
< label class = "control-label" > Password< / label >
2019-04-22 15:46:07 -07:00
< 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 >
2018-05-23 22:00:48 -07:00
< / div >
2019-04-22 16:40:50 -07:00
< input type = "password" class = "form-control" ng-model = "mailRelay.relay.password" name = "password" ng-required = "usesPasswordAuth(mailRelay.relay.provider)" >
2018-05-23 22:00:48 -07:00
< / div >
< input class = "ng-hide" type = "submit" ng-disabled = "mailRelayForm.$invalid" / >
< / form >
< / div >
2018-01-22 13:01:38 -08:00
< / div >
2018-04-09 15:08:05 +02:00
< / div >
2018-01-22 13:01:38 -08:00
2018-05-23 22:00:48 -07:00
< div class = "row" >
< div class = "col-md-12" >
2019-04-22 16:40:50 -07:00
< button class = "btn btn-primary" 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 > Save< / button >
2018-01-22 13:01:38 -08:00
2018-05-23 22:00:48 -07: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" > Saved< / span >
< / div >
< / div >
2019-08-02 12:42:10 -07:00
< div class = "row" ng-if = "mailRelay.preset.spfDoc" >
< br / >
< div class = "col-md-12" >
< span class = "text-info" >
Cloudron does not automatically setup SPF record. Set it up manually by following the < a ng-href = "{{mailRelay.preset.spfDoc}}" target = "_blank" > {{ mailRelay.preset.name }} docs< / a > .
< / span >
< / div >
< / div >
2018-05-23 22:00:48 -07:00
< / div >
2019-08-02 12:42:10 -07:00
2018-05-23 22:00:48 -07:00
< / uib-tab >
2018-05-23 23:34:09 -07:00
< uib-tab index = "2" heading = "Settings" >
< div class = "card card-large" style = "margin-bottom: 15px;" >
< h4 > Enable Masquerading< / h4 >
< div class = "row" >
< div class = "col-md-10" >
Masquerading allows users and apps to send emails with an arbitrary username in the FROM address
< / div >
< div class = "col-md-2" >
2020-02-27 10:47:14 -08:00
< button 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 ? "Enable" : "Disable" }}
< / button >
2018-05-23 23:34:09 -07:00
< / div >
< / div >
< / div >
< / uib-tab >
2019-03-15 11:16:43 -07:00
< uib-tab index = "3" heading = "Status" >
2019-06-12 16:04:00 -07:00
<!-- nothing to show if incoming mail is disabled and using a relay -->
2020-02-11 21:06:34 +01:00
< div class = "card card-large" style = "margin-bottom: 15px;" ng-hide = "!domain.mailConfig.enabled && domain.mailConfig.relay.provider !== 'cloudron-smtp'" >
2018-05-23 22:00:48 -07:00
< div class = "row" >
< div class = "col-md-12" >
2019-05-09 15:40:48 -07:00
< h4 > DNS Status
< 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 > Re-setup DNS
< / button >
< / h4 >
2018-06-07 10:48:18 -07:00
2019-05-09 15:40:48 -07:00
Status of DNS Records may show an error while DNS is propagating (~5 minutes). See the
2019-12-18 14:29:42 -08:00
< a ng-href = "{{ config.webServerOrigin }}/documentation/troubleshooting/#mail-dns" target = "_blank" > troubleshooting< / a > docs for help.
2018-05-23 22:00:48 -07:00
< br / > < br / >
< div ng-repeat = "record in expectedDnsRecordsTypes" >
2019-06-12 16:04:00 -07:00
< div class = "row" ng-if = "expectedDnsRecords[record.value].expected" >
2018-05-23 22:00:48 -07:00
< 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 >
2018-11-15 18:07:18 +01:00
< 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 >
2018-05-23 22:00:48 -07:00
< / p >
< div id = "collapse_dns_{{ record.value }}" class = "panel-collapse collapse" >
< div class = "panel-body" >
2020-02-11 21:06:34 +01:00
< p ng-show = "record.name === 'MX' && domain.provider === 'namecheap'" > < a ng-href = "{{ config.webServerOrigin }}/documentation/domains/#namecheap-dns" target = "_blank" class = "btn btn-xs btn-danger" > Namecheap requires manual steps for MX records< / a > < / p >
2018-07-24 14:06:57 -07:00
< p ng-show = "expectedDnsRecords[record.value].name" > Hostname: < b ng-click-select > < tt > {{ expectedDnsRecords[record.value].name }}< / tt > < / b > < / p >
< p ng-hide = "expectedDnsRecords[record.value].name" > Domain: < b ng-click-select > < tt > {{ expectedDnsRecords[record.value].domain }}< / tt > < / b > < / p >
2018-05-23 22:00:48 -07:00
< p > Record type: < b ng-click-select > < tt > {{ expectedDnsRecords[record.value].type }}< / tt > < / b > < / p >
< p style = "overflow: auto; white-space: nowrap;" > Expected value: < b ng-click-select > < tt > {{ expectedDnsRecords[record.value].expected }}< / tt > < / b > < / p >
< p style = "overflow: auto; white-space: nowrap;" > Current value: < b ng-click-select > < tt > {{ expectedDnsRecords[record.value].value ? expectedDnsRecords[record.value].value : '[not set]' }}< / tt > < / b > < / p >
< / div >
< / div >
< / div >
2018-01-22 13:01:38 -08:00
< / div >
< / div >
< / div >
< / div >
< / div >
2020-02-11 21:06:34 +01:00
< div class = "card card-large" style = "margin-bottom: 15px;" ng-if = "domain.mailConfig.relay.provider !== 'noop'" >
2018-05-23 22:00:48 -07:00
< div class = "row" >
< div class = "col-md-12" >
2019-12-18 14:29:42 -08:00
< h4 > SMTP Status < sup > < a ng-href = "{{ config.webServerOrigin }}/documentation/troubleshooting/#mail-smtp" class = "help" target = "_blank" > < i class = "fa fa-question-circle" > < / i > < / a > < / sup > < / h4 >
2018-05-23 22:00:48 -07:00
< div class = "row" >
< div class = "col-xs-12" >
< p class = "text-muted" >
2020-02-11 21:06:34 +01:00
< i ng-hide = "refreshBusy" ng-class = "domain.mailStatus.relay.status ? 'fa fa-check-circle text-success' : 'fa fa-exclamation-triangle text-danger'" > < / i >
2018-05-23 22:00:48 -07:00
< a href = "" data-toggle = "collapse" data-parent = "#accordion" data-target = "#collapse_outbound_smtp" >
2020-02-11 21:06:34 +01:00
{{ domain.mailConfig.relay.provider === 'cloudron-smtp' ? 'Outbound SMTP (Direct)' : 'Outbound SMTP (Relay)' }}
2018-05-23 22:00:48 -07:00
< / a >
2020-02-11 21:06:34 +01:00
< 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 >
2018-05-23 22:00:48 -07:00
< / p >
< div id = "collapse_outbound_smtp" class = "panel-collapse collapse" >
< div class = "panel-body" >
2020-02-11 21:06:34 +01:00
< p > < b > {{ domain.mailStatus.relay.value }} < / b > < / p >
2018-05-23 22:00:48 -07:00
< / div >
< / div >
< / div >
2018-01-22 13:01:38 -08:00
< / div >
2020-02-11 21:06:34 +01:00
< div class = "row" ng-show = "domain.mailConfig.relay.provider === 'cloudron-smtp'" >
2018-05-23 22:00:48 -07:00
< div class = "col-xs-12" >
< p class = "text-muted" >
2020-02-11 21:06:34 +01:00
< i ng-hide = "refreshBusy" ng-class = "domain.mailStatus.rbl.status ? 'fa fa-check-circle text-success' : 'fa fa-exclamation-triangle text-danger'" > < / i >
2018-05-23 22:00:48 -07:00
< a href = "" data-toggle = "collapse" data-parent = "#accordion" data-target = "#collapse_rbl" >
IP Address Blacklist Check
< / a >
2020-02-11 21:06:34 +01:00
< 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 >
2018-05-23 22:00:48 -07:00
< / p >
< div id = "collapse_rbl" class = "panel-collapse collapse" >
< div class = "panel-body" >
2020-02-11 21:06:34 +01:00
< div > This server's IP {{ domain.mailStatus.rbl.ip }} is < b ng-hide = "domain.mailStatus.rbl.servers.length" > not< / b > blacklisted.< / div >
< div ng-repeat = "server in domain.mailStatus.rbl.servers" >
2018-05-23 22:00:48 -07:00
< a ng-href = "{{server.site}}" target = "_blank" > {{ server.name }}< / a >
< / div >
< / 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 >
2018-06-07 10:48:18 -07:00
2018-05-23 22:00:48 -07:00
< / uib-tab >
< / uib-tabset >
2018-01-22 13:01:38 -08:00
< / div >