2017-06-02 10:24:46 +02: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" >
< h4 class = "modal-title" > Cloudron Email Server< / h4 >
< / div >
< div class = "modal-body" ng-show = "dnsConfig.provider === 'noop' || dnsConfig.provider === 'manual'" >
No DNS provider is setup. Displayed DNS records will have to be setup manually.< br / >
< / div >
< div class = "modal-body" ng-show = "dnsConfig.provider === 'route53' || dnsConfig.provider === 'digitalocean'" >
The Cloudron will setup Email related DNS records automatically.
If this domain is already configured to handle email with some other provider, it will < b > overwrite< / b > those records.
< br / > < br / >
Disabling Cloudron Email later will < b > not< / b > put the old records back.
< br / > < br / >
Status of DNS Records will show an error when DNS is propagating (~5 minutes).
< br / >
< / div >
< div class = "modal-footer" >
< button type = "button" class = "btn btn-default" data-dismiss = "modal" > Cancel< / button >
< button type = "button" class = "btn btn-success" ng-click = "email.enable()" > I understand, enable< / button >
< / div >
< / div >
< / div >
< / div >
< br / >
< div class = "section-header" >
< div class = "text-left" >
< h1 > Email< / h1 >
< / div >
< / div >
2017-06-27 13:39:08 +02:00
< div class = "section-header" >
< div class = "text-left" >
2017-06-27 13:45:49 -05:00
< h3 > IMAP and SMTP Server< / h3 >
2017-06-27 13:39:08 +02:00
< / div >
< / div >
< div class = "card" style = "margin-bottom: 15px;" >
< div class = "row" >
< div class = "col-md-12" >
2017-06-27 13:45:49 -05:00
Cloudron has a built-in email server that allows users to send and receive email for your domain.
The < a href = "https://cloudron.io/references/usermanual.html#email" target = "_blank" > User manual< / a > has information on how to setup email clients.
< / div >
< / div >
< br / >
< div class = "row" >
< div class = "col-md-12" ng-show = "dnsConfig.provider !== 'caas'" >
< button ng-class = "mailConfig.enabled ? 'btn btn-danger' : 'btn btn-primary'" ng-click = "email.toggle()" ng-enabled = "mailConfig" > {{ mailConfig.enabled ? "Disable Email" : "Enable Email" }}< / button >
< / div >
< div class = "col-md-12" ng-show = "dnsConfig.provider === 'caas'" >
< span class = "text-danger text-bold" > This feature requires the Cloudron to be on < a href = "https://cloudron.io/references/usermanual.html#entire-cloudron-on-a-custom-domain" target = "_blank" > custom domain< / a > .< / span >
< / div >
< / div >
< / div >
< div class = "section-header" ng-show = "isPaying" >
< div class = "text-left" >
< h3 > Outbound Mail Relay< / h3 >
< / div >
< / div >
< div class = "card" style = "margin-bottom: 15px;" ng-show = "isPaying" >
< div class = "row" >
< div class = "col-md-12" >
Select the mail server through which outbound mails are sent:
2017-06-27 13:39:08 +02:00
< / div >
< / div >
2017-06-27 13:45:49 -05:00
< br / >
< div class = "row" >
2017-06-27 13:39:08 +02:00
< div class = "col-md-12" >
2017-06-27 13:45:49 -05:00
< div class = "form-group" >
2017-06-28 09:51:01 -05:00
< 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 >
2017-06-27 13:45:49 -05:00
< / div >
< / div >
< / div >
2017-06-28 09:51:01 -05:00
< div class = "row" ng-show = "mailRelay.preset.provider !== 'cloudron-smtp'" >
2017-06-27 13:45:49 -05:00
< div class = "col-md-6" >
2017-06-27 13:39:08 +02:00
< div >
< form name = "mailRelayForm" role = "form" ng-submit = "mailRelay.submit()" autocomplete = "off" novalidate >
2017-06-27 13:45:49 -05:00
< div class = "form-group" ng-class = "{ 'has-error': (mailRelayForm.host.$dirty && mailRelayForm.host.$invalid) }" >
2017-06-27 13:39:08 +02:00
< label class = "control-label" > SMTP Host< / label >
2017-06-27 13:45:49 -05:00
< 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 >
2017-06-27 13:39:08 +02:00
< / div >
2017-06-27 13:45:49 -05:00
< input type = "text" class = "form-control" ng-model = "mailRelay.relay.host" name = "host" required >
2017-06-27 13:39:08 +02:00
< / div >
2017-06-27 13:45:49 -05:00
< div class = "form-group" ng-class = "{ 'has-error': (mailRelayForm.port.$dirty && mailRelayForm.port.$invalid) }" >
2017-06-29 19:44:17 -05:00
< label class = "control-label" > SMTP Port (STARTTLS)< / label >
2017-06-27 13:45:49 -05:00
< 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 >
2017-06-27 13:39:08 +02:00
< / div >
2017-06-27 13:45:49 -05:00
< input type = "number" class = "form-control" ng-model = "mailRelay.relay.port" name = "port" required >
< / div >
2017-06-27 13:39:08 +02:00
< div class = "form-group" ng-class = "{ 'has-error': (mailRelayForm.username.$dirty && mailRelayForm.username.$invalid) }" >
< label class = "control-label" > Username< / 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 >
< / div >
2017-06-27 13:45:49 -05:00
< input type = "text" class = "form-control" ng-model = "mailRelay.relay.username" name = "username" required >
2017-06-27 13:39:08 +02:00
< / div >
< div class = "form-group" ng-class = "{ 'has-error': (mailRelayForm.password.$dirty && mailRelayForm.password.$invalid) }" >
< label class = "control-label" > Password< / 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 >
< / div >
2017-06-29 15:40:20 -05:00
< input type = "text" class = "form-control" ng-model = "mailRelay.relay.password" name = "password" required >
2017-06-27 13:39:08 +02:00
< / div >
< input class = "ng-hide" type = "submit" ng-disabled = "mailRelayForm.$invalid" / >
< / form >
< / div >
< / div >
< / div >
< div class = "row" >
2017-06-27 15:44:36 -05:00
< div class = "col-md-2" >
2017-06-29 15:40:20 -05:00
< button class = "btn btn-primary" ng-click = "mailRelay.submit()" ng-disabled = "(mailRelay.preset.provider !== 'cloudron-smtp && (!mailRelayForm.$dirty || mailRelayForm.$invalid)) || mailRelay.busy" > < i class = "fa fa-circle-o-notch fa-spin" ng-show = "mailRelay.busy" > < / i > Save< / button >
2017-06-27 15:44:36 -05:00
< / div >
< div class = "col-md-10" >
< span class = "has-error text-center" ng-show = "mailRelay.error" > {{ mailRelay.error }}< / span >
2017-06-27 13:39:08 +02:00
< / div >
< / div >
< / div >
2017-06-20 12:58:14 +02:00
< div class = "section-header" ng-show = "mailConfig.enabled && isPaying" >
2017-06-12 13:18:47 +02:00
< div class = "text-left" >
2017-06-19 23:10:09 -07:00
< h3 > Catch-all< / h3 >
2017-06-12 13:18:47 +02:00
< / div >
< / div >
2017-06-20 12:58:14 +02:00
< div class = "card" style = "margin-bottom: 15px;" ng-show = "mailConfig.enabled && isPaying" >
2017-06-12 13:18:47 +02:00
< div class = "row" >
< div class = "col-md-12" >
2017-06-21 19:28:38 -07:00
Emails sent to non existing addresses will be forwarded to the following accounts:
2017-06-19 23:10:09 -07:00
< / div >
< / div >
< br / >
< div class = "row" >
< div class = "col-md-6" >
2017-06-12 13:18:47 +02:00
< multiselect ng-model = "catchall.addresses" options = "address for address in catchall.availableAddresses" data-multiple = "true" > < / multiselect >
2017-06-19 23:10:09 -07:00
< button class = "btn btn-outline btn-primary" ng-disabled = "catchall.busy" ng-click = "catchall.submit()" > < i class = "fa fa-circle-o-notch fa-spin" ng-show = "catchall.busy" > < / i > Save< / button >
< / div >
2017-06-12 13:18:47 +02:00
< / div >
< / div >
2017-06-05 14:22:34 +02:00
< div class = "section-header" ng-show = "dnsConfig.provider && dnsConfig.provider !== 'caas'" >
2017-06-02 10:24:46 +02:00
< div class = "text-left" >
< h3 > DNS Records< / h3 >
< / div >
< / div >
2017-06-05 14:22:34 +02:00
< div class = "card" style = "margin-bottom: 15px;" ng-show = "dnsConfig.provider && dnsConfig.provider !== 'caas'" >
2017-06-02 10:24:46 +02:00
< div class = "row" >
2017-05-31 16:25:33 +02:00
< div class = "col-md-12" >
2017-06-02 10:24:46 +02:00
Set the following DNS records to guarantee email delivery:
< br / > < br / >
< div ng-repeat = "record in expectedDnsRecordsTypes" >
2017-06-28 19:15:35 -05:00
< div class = "row" ng-if = "expectedDnsRecords[record.value] && (mailConfig.enabled || (record.name !== 'DMARC' && record.name !== 'MX'))" >
2017-06-02 10:24:46 +02:00
< div class = "col-xs-12" >
< p class = "text-muted" >
< i 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 = "email.refresh()" ng-disabled = "email.refreshBusy" ng-show = "!expectedDnsRecords[record.value].status" > < i class = "fa fa-refresh" ng-class = "{ 'fa-pulse': email.refreshBusy }" > < / i > < / button >
< / p >
< div id = "collapse_dns_{{ record.value }}" class = "panel-collapse collapse" >
< div class = "panel-body" >
< p > Domain: < b ng-click-select > < tt > {{ expectedDnsRecords[record.value].domain }}< / tt > < / b > < / p >
< 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 >
< / div >
< / div >
< div class = "row" >
< div class = "col-xs-12" >
< p class = "text-muted" >
2017-06-28 19:20:49 -05:00
< i ng-class = "relay.status ? 'fa fa-check-circle text-success' : 'fa fa-exclamation-triangle text-danger'" > < / i >
2017-06-02 10:24:46 +02:00
< a href = "" data-toggle = "collapse" data-parent = "#accordion" data-target = "#collapse_dns_port" >
2017-06-29 10:11:55 -05:00
Outbound SMTP
2017-06-02 10:24:46 +02:00
< / a >
2017-06-28 19:20:49 -05:00
< button class = "btn btn-xs btn-default" ng-click = "email.refresh()" ng-disabled = "email.refreshBusy" ng-show = "!relay.status" > < i class = "fa fa-refresh" ng-class = "{ 'fa-pulse': email.refreshBusy }" > < / i > < / button >
2017-06-02 10:24:46 +02:00
< / p >
< div id = "collapse_dns_port" class = "panel-collapse collapse" >
< div class = "panel-body" >
2017-06-28 19:20:49 -05:00
< p > < b > {{ relay.value }} < / b > < / p >
2017-06-02 10:24:46 +02:00
< / div >
< / div >
< / div >
< / div >
< / div >
< / div >
< / div >
<!-- Offset the footer -->
< br / > < br / >