Files
cloudron-box/src/views/emails.html

192 lines
9.6 KiB
HTML
Raw Normal View History

<!-- Test email -->
<div class="modal fade" id="testEmailModal" tabindex="-1" role="dialog">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title">Send test email for <b>{{ testEmail.domain.domain }}</b></h4>
</div>
<div class="modal-body">
<form name="testEmailForm" role="form" novalidate ng-submit="testEmail.submit()" autocomplete="off">
<fieldset>
<p class="has-error text-center" ng-show="testEmail.error">{{ testEmail.error.generic }}</p>
<p>This will send a test email from <b>no-reply@{{testEmail.domain.domain}}</b> to the address below.</p>
<br/>
<div class="form-group" ng-class="{ 'has-error': testEmail.error.key }">
<label class="control-label" for="inputTestEmailKey">Email to</label>
<input type="text" class="form-control" ng-model="testEmail.mailTo" id="inputTestMailTo" name="mailTo" ng-disabled="testEmail.busy" placeholder="Email address" autofocus>
</div>
<input class="ng-hide" type="submit" ng-disabled="testEmailForm.$invalid"/>
</fieldset>
</form>
</div>
<div class="modal-footer ">
<button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
<button type="submit" class="btn btn-outline btn-success pull-right" ng-click="testEmail.submit()" ng-disabled="testEmail.$invalid || testEmail.busy">
<i class="fa fa-circle-notch fa-spin" ng-show="testEmail.busy"></i><span>Send</span>
</button>
</div>
</div>
</div>
</div>
2020-03-06 23:11:26 -08:00
<div class="content">
2020-02-11 21:06:34 +01:00
<div class="text-left">
<h1>
2020-02-11 22:07:58 -08:00
Mail Server
2020-02-11 21:06:34 +01:00
</h1>
</div>
2020-02-11 22:07:58 -08:00
<div class="text-left">
<h3>Domains</h3>
</div>
2020-02-18 19:48:17 -08:00
<div class="card card-large" style="margin-bottom: 15px;">
2020-02-11 21:06:34 +01:00
<div class="row ng-hide" ng-hide="ready">
<div class="col-lg-12 text-center">
<h2><i class="fa fa-circle-notch fa-spin"></i></h2>
</div>
</div>
<div class="row animateMeOpacity ng-hide" ng-show="ready">
<div class="col-xs-12">
<table class="table table-hover" style="margin: 0;">
<thead>
<tr>
<th style="width: 5%"></th>
2020-02-20 12:35:51 -08:00
<th style="width: 30%">Domain</th>
<th style="width: 60%">Config</th>
2020-02-11 21:06:34 +01:00
<th style="width: 10%">Actions</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="domain in domains">
<td>
<i class="fa fa-circle" ng-style="{ color: domain.statusOk ? '#27CE65' : '#d9534f' }" ng-show="domain.status"></i>
<i class="fa fa-circle-notch fa-spin" ng-hide="domain.status"></i>
</td>
2020-02-11 21:06:34 +01:00
<td class="elide-table-cell no-padding">
<a href="/#/email/{{ domain.domain }}" class="email-domain-list-item">{{ domain.domain }}</a>
</td>
2020-02-20 12:35:51 -08:00
<td class="elide-table-cell no-padding">
<a href="/#/email/{{ domain.domain }}" class="email-domain-list-item">
<span ng-show="domain.inbound && domain.outbound">
2020-03-07 16:07:43 -08:00
{{ domain.mailboxCount }} Mailbox(es) / Usage: {{ domain.usage | prettyMailSize }}
2020-02-20 12:35:51 -08:00
</span>
<span ng-show="!domain.inbound && domain.outbound">Outbound only</span>
<span ng-show="!domain.inbound && !domain.outbound">Disabled</span>
</a>
</td>
2020-02-11 21:06:34 +01:00
<td class="text-right no-wrap">
<button class="btn btn-xs btn-default" ng-click="testEmail.show(domain)" uib-tooltip="Send Test Email"><i class="fa fa-paper-plane"></i></button>
<a href="/#/email/{{ domain.domain }}" class="btn btn-xs btn-default"><i class="fa fa-pencil-alt"></i></a>
2020-02-11 21:06:34 +01:00
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<br/>
2020-03-26 18:56:32 -07:00
<div class="text-left" ng-show="user.role === 'owner'">
2020-03-25 20:13:45 -07:00
<h3>Event Log</h3>
</div>
2020-03-26 18:56:32 -07:00
<div class="row" ng-show="user.role === 'owner'">
2020-03-25 20:13:45 -07:00
<div class="col-md-12">
<div class="maillog-filter">
<input class="form-control" style="width: 200px;" placeholder="Search" type="text" ng-model="activity.search" ng-model-options="{ debounce: 1000 }" ng-change="activity.updateFilter()" />
<multiselect ng-model="activity.selectedTypes" ms-header="All Events" options="a.name for a in activityTypes" data-multiple="true" ng-change="activity.updateFilter(true)" filter-after-rows="5" scroll-after-rows="10"></multiselect>
<select class="form-control" ng-model="activity.pageItems" ng-options="a.name for a in pageItemCount" ng-change="activity.updateFilter(true)"></select>
</div>
<div class="pull-right">
<button class="btn btn-default btn-outline" ng-click="activity.showPrevPage()" ng-disabled="activity.busy || activity.currentPage <= 1"><i class="fa fa-angle-double-left"></i> prev</button>
<button class="btn btn-default btn-outline" ng-click="activity.showNextPage()" ng-disabled="activity.busy || activity.perPage > activity.eventLogs.length">next <i class="fa fa-angle-double-right"></i></button>
</div>
</div>
2020-02-11 21:06:34 +01:00
</div>
2020-03-26 18:56:32 -07:00
<div class="card card-large" style="margin-top: 10px; margin-bottom: 15px;" ng-show="user.role === 'owner'">
2020-02-11 21:06:34 +01:00
<div class="row ng-hide" ng-hide="ready">
<div class="col-lg-12 text-center">
<h2><i class="fa fa-circle-notch fa-spin"></i></h2>
</div>
</div>
<div class="row animateMeOpacity ng-hide" ng-show="ready">
<div class="col-xs-12">
2020-02-11 22:07:58 -08:00
<table class="table table-hover" style="margin: 0;">
<thead>
<tr>
2020-03-06 14:42:08 -08:00
<th style="width: 5%"><!-- Icon --></th>
2020-03-06 23:11:26 -08:00
<th style="width: 20%">Time</th>
<th style="width: 75%">Details</th>
2020-02-11 22:07:58 -08:00
</tr>
</thead>
2020-02-12 15:37:05 +01:00
<tbody ng-show="activity.busy">
<tr>
2020-03-06 14:42:08 -08:00
<td colspan="4" class="text-center">
2020-02-12 15:37:05 +01:00
<i class="fa fa-circle-notch fa-spin"></i>
</td>
</tr>
</tbody>
2020-02-13 13:03:57 +01:00
<tbody ng-hide="activity.eventLogs.length || activity.busy">
2020-02-13 11:20:57 +01:00
<tr>
2020-03-06 14:42:08 -08:00
<td colspan="4" class="text-center">
2020-02-18 19:48:17 -08:00
<br>
<br>
2020-02-13 11:20:57 +01:00
Event Log is empty.
2020-02-18 19:48:17 -08:00
<br>
<br>
2020-02-13 11:20:57 +01:00
</td>
</tr>
</tbody>
2020-02-12 15:37:05 +01:00
<tbody ng-repeat="eventlog in activity.eventLogs" ng-hide="activity.busy">
<tr ng-click="activity.showEventLogDetails(eventlog)" class="hand">
<td class="no-wrap">
2020-03-06 14:42:08 -08:00
<i class="fas fa-arrow-circle-left" ng-show="eventlog.type === 'delivered'" uib-tooltip="Outgoing"></i>
<i class="fas fa-history" ng-show="eventlog.type === 'deferred'" uib-tooltip="Deferred"></i>
<i class="fas fa-arrow-circle-right" ng-show="eventlog.type === 'received'" uib-tooltip="Incoming"></i>
<i class="fas fa-align-justify" ng-show="eventlog.type === 'queued'" uib-tooltip="Queued"></i>
2020-02-18 19:48:17 -08:00
<i class="fas fa-minus-circle" ng-show="eventlog.type === 'denied'" uib-tooltip="Denied"></i>
2020-03-06 14:42:08 -08:00
<i class="fas fa-hand-paper" ng-show="eventlog.type === 'bounce'" uib-tooltip="Bounce"></i>
<i class="fas fa-filter" ng-show="eventlog.type === 'spam-learn'" uib-tooltip="Spam filter trained"></i>
2020-02-12 15:37:05 +01:00
</td>
2020-03-06 14:42:08 -08:00
<td class="no-wrap"><span uib-tooltip="{{ eventlog.ts | prettyLongDate }}" class="arrow">{{ eventlog.ts | prettyDate }}</span></td>
2020-03-20 13:05:58 -07:00
<td>
<span ng-show="eventlog.type === 'bounce'">Sent bounce to {{ eventlog.mailFrom | prettyEmailAddresses }} for mail sent to {{ eventlog.rcptTo | prettyEmailAddresses }}. {{ eventlog.details.message || eventlog.details.reason }}</span>
<span ng-show="eventlog.type === 'deferred'">Failed to deliver mail to {{ eventlog.rcptTo | prettyEmailAddresses }}. {{ eventlog.details.message || eventlog.details.reason }}. Will retry in {{ eventlog.details.delay }}s.</span>
<span ng-show="eventlog.type === 'queued'">
<span ng-show="eventlog.direction === 'inbound'">
Incoming mail from {{ eventlog.mailFrom | prettyEmailAddresses }} to {{ eventlog.rcptTo | prettyEmailAddresses }}. Spam: {{ eventlog.details.spamStatus.indexOf('Yes,') === 0 ? 'Yes' : 'No' }}
</span>
<span ng-show="eventlog.direction === 'outbound'">
Queued mail for delivery to {{ eventlog.rcptTo | prettyEmailAddresses }} from {{ eventlog.mailFrom | prettyEmailAddresses }}
</span>
</span>
<span ng-show="eventlog.type === 'received'">Saved mail from {{ eventlog.mailFrom | prettyEmailAddresses }} in mailbox {{ eventlog.rcptTo | prettyEmailAddresses }}</span>
<span ng-show="eventlog.type === 'delivered'">Delivered mail to {{ eventlog.rcptTo | prettyEmailAddresses }} from {{ eventlog.mailFrom | prettyEmailAddresses }}</span>
<span ng-show="eventlog.type === 'denied'">Connection from {{ eventlog.remote.ip }} denied. {{ eventlog.details.message || eventlog.details.reason }}</span>
2020-03-06 14:42:08 -08:00
<span ng-show="eventlog.type === 'spam-learn'">Spam filter trained using mailbox content</span>
2020-03-06 13:35:34 -08:00
</td>
2020-02-12 15:37:05 +01:00
</tr>
<tr ng-show="activity.activeEventLog === eventlog">
2020-02-12 23:17:24 -08:00
<td colspan="6">
2020-03-06 13:35:34 -08:00
<pre class="eventlog-details">{{ eventlog | json }}</pre>
2020-02-12 15:37:05 +01:00
</td>
</tr>
2020-02-11 22:07:58 -08:00
</tbody>
</table>
2020-02-11 21:06:34 +01:00
2020-02-12 14:52:38 +01:00
<br/>
2020-02-11 21:06:34 +01:00
2020-02-12 14:52:38 +01:00
<a class="btn btn-primary pull-right" href="/logs.html?id=mail" target="_blank">Show Raw Logs</a>
</div>
2020-02-11 21:06:34 +01:00
</div>
</div>
2020-02-11 22:07:58 -08:00
2020-02-11 21:06:34 +01:00
</div>